playbook基础组件
Hosts和Users
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。
hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组;
remote_user则用于指定远程主机上的执行任务的用户。
如上面示例中的
1 2 |
-hosts: webnodes remote_user:root |
不过,remote_user也可用于各task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;
此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。
1 2 3 4 5 6 7 |
- hosts: webnodes remote_user: mageedu tasks: - name: test connection ping: remote_user: mageedu sudo: yes |
任务列表和action
play的主体部分是task list。
task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可。
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。
每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。
定义task的可以使用“action:module options”或“module: options”的格式,推荐使用后者以实现向后兼容。如果action一行的内容过多,也中使用在行首使用几个空白字符进行换行。
tasks:
1 2 |
- name: make sure apache is running service:name=httpd state=running |
在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用“key=value”格式,例如:
1 2 3 |
tasks: -name: disable selinux command: /sbin/setenforce 0 |
如果命令或脚本的退出码不为零,可以使用如下方式替代:
1 2 3 |
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true |
或者使用ignore_errors来忽略错误信息:
1 2 3 4 |
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True |
Inventory
inventory中,组还可以包含其它的组,并且也可以向组中的主机指定变量。不过,这些变量只能在ansible-playbook中使用,而ansible不支持。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[apache] httpd1.xmfb.com httpd2.xmfb.com
[nginx] ngx1.xmfb.com ngx2.xmfb.com
[webservers:children] apache nginx
[webservers:vars] ntp_server=ntp.xmfb.com |
Handlers示例:定义配置文件发生修改之后,在执行yml文件,会重启httpd服务。定义的内容:<ignore_js_op style="word-wrap: break-word; margin: 0px; padding: 0px; color: rgb(68, 68, 68); font-family: Tahoma, ‘Microsoft Yahei‘, Simsun; widows: 1; background-color: rgb(255, 255, 255);">
修改配置文件的监听端口为80
1 2 |
[root@node1 ~]# vim conf/httpd.conf Listen 80 |
执行结果 验证:webserver组中的主机httpd端口更改与否
1 2 |
[root@node2 ~]# netstat -lntp | grep httpd tcp 0 0 :::80 :::* LISTEN 41848/httpd |