block任务块:可以通过block关键字,将多个任务组合到一起;将整个block任务组一起控制是否要执行。
如果test组中的主机系统发行版是Redhat则安装并启动httpd。原本这是需要两个任务安装和执行,通过block整合为一个任务执行。
rescue和always:block和rescue、always联合使用;block中的任务都成功,rescue终端任务不执行,block中的任务出现失败,rescue中的任务执行;block中的任务不管怎么样,always中的任务总是执行。
此时只有1、3文件创建成功了。
当在tmp的abcd目录(没有该目录)下面创建test1
此时执行剧本只有2、 3文件创建成功了
loop循环:相当于shell中的for循环。ansible中循环用到的变量名是固定的为item。
在test中的主机上创建/tmp/{aaa,bbb,ccc,ddd}目录。
或者使用yaml的格式
执行剧本
把test组中的主机的httpd和firewalld服务关掉。只有yum模块安装软件包才能连续写,关闭和开启服务不能连续因为playbook会当成一个访问
使用复杂变量,item是固定的用于表示循环中的变量,循环时loop中每个-后面的内容作为一个整体赋值给item,loop中的{}中内容是自己定义的写法为key:val;取值时使用句点表示,如{{item.name}}
创建zhangsan用户密码为123,创建lisi用户密码为abc。
role角色:为了实现playbook重用,可以使用role角色;角色role相当于把任务打散,放在不同的目录中,在把一些固定的值如用户名、软件包、服务等用变量来表示;role角色定义好之后可以在其他playbook中直接调用。
使用常规playbook修改/etc/motd的内容
修改ansib.cfg文件,声明角色存放的位置。
然后在ansible目录下面创建roles目录
创建角色目录ansible-galaxy init roles/motd
创建名为motd的角色
角色由多个部分组成。
defauts:定义变量的目录优先级最低。
files:保存上传的文件如copy要使用的文件。
handlers:handlers任务写到这个目录的main.yml中
meta:保存说明数据,如角色的作者版权。
README.md:保存角色如何使用之类的说明。
tasks:保存任务
template:保存template模块上传的模板文件
tests:保存测试用的playbook
vars:定义变量的位置(推荐使用)
将motd文件保存到template目录中
将motd中的变量编辑到vars目录的main.yml文件中
在tasks目录的main.yml中写入任务(Ctrl+v,x)
创建一个playbook用来调用motd角色
执行剧本
此时文件修改成功
创建pkgs的角色用于安装软件包,软件包名使用变量pkg默认httpd
创建inst_http.yml调用pkgs角色安装httpd
创建inst_php.yml调用pkgs角色在Node2主机安装PHP软件包
此时vars中变量pkg就会覆盖default目录中main.yml定义的httpd变量,变为php
当需要下载某个软件包只需要修改vars的变量值,调用pkgs角色就能下载该软件包。
创建srvs的角色,服务名使用的变量为srv,在test组的主机上调用角色,开启httpd服务
创建变量none表示没有
开启httpd服务
ansible加/解密文件:使用ansible-vault命令
创建hello.txt文件对其中的内容加密。使用 ansible-vault encrypt对其加密
解密:ansible-vault decrypt hello.txt
当密码忘记或者重设密码(在加密的情况下):使用ansible-vault rekey 文件
在不解密的情况下查看文件内容
此时该文件还是加密的状态
使用密码文件对文件加密:ansible-vault encrypt --vault-id=pass.txt data.txt
使用密码文件对文件解密:ansible-vault decrypt --vault-id=pass.txt data.txt
如当有需要加密的用户的密码容易泄露需要加密
此时加密后就不能查看了
执行该剧本需要加 --ask-vault-pass命令才能执行被加密的剧本
sudo命令:一般用于普通用户执行需要root权限的命令。
在Node1登录zhangsan用户不能创建用户,使用sudo也不能创建
在node1上配置张三拥有sudo权限
此时张三用户就能使用sudo命令创建用户
编辑visudo
此时普通用户使用sudo命令就不在需要密码了
特殊的主机清单变量:如果远程主机没有使用免密登录,远程主机ssh不是标准的22端口可以设置特殊的主机清单变量。
ansible_ssh_user:指定登录远程主机的用户名
ansible_ssh_pass:指定登录远程主机的密码
ansible_ssh_port:指定登录远程主机的端口号
取消所有主机的免密登录
编辑hosts文件
此时执行ping命令就不能平、ping通
将Node1主机的ssh端口修改为220
重启ssh服务
指定-p220才能登录
修改hosts
此时就能远程控制该主机