playbook是由一个或多个“play”组成的列表。
play的主要功能在于将事先归并为一组的主机装
扮成事先通过ansible中的task定义好的角色。
从根本上来讲所谓task无非是调用ansible的一个
module。将多个play组织在一个playbook中即可以
让它们联同起来按事先编排的机制同唱一台大戏。
###########################playbook基础组件
1、Hosts和Users
playbook中的每一个play的目的都是为了让某个
或某些主机以某个指定的用户身份执行任务。
hosts用于指定要执行指定任务的主机其可以是一个
或多个由冒号分隔主机组。
remote_user则用于指定远程主机上的执行任务的用户。
不过remote_user也可用于各task中。也可以通过指定
其通过sudo的方式在远程主机上执行任务其可用于play
全局或某任务。
此外甚至可以在sudo时使用sudo_user指定sudo时切换的用户。
- hosts: webnodes
remote_user: mageedu
tasks:
- name: test connection ping:
remote_user: mageedu sudo: yes
2、任务列表和action
play的主体部分是task list。task list中的各任务按次
序逐个在hosts中指定的所有主机上执行即在所有主机上完成
第一个任务后再开始第二个。
在运行自下而下某playbook时如果中途发生错误所有已执行
任务都将回滚因此在更正playbook后重新执行一次即可。
task的目的是使用指定的参数执行模块而在模块参数中可以
使用变量。模块执行是幂等的这意味着多次执行是安全的
因为其结果均一致。
每个task都应该有其name用于playbook的执行结果输出建议
其内容尽可能清晰地描述任务执行步骤。如果未提供name则
action的结果将用于输出。
定义task的可以使用“action: module options”或“module:
options”的格式推荐使用后者以实现向后兼容。
如果action一行的内容过多也中使用在行首使用几个空白
字符进行换行。
tasks:
- name: make sure apache is running
service: name=httpd state=running
在众多模块中只有command和shell模块仅需要给定一个
列表而无需使用“key=value”格式例如
tasks:
- name: disable selinux
command: /sbin/setenforce 0如果命令或脚本的退出码
不为零可以使用如下方式替代
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors来忽略错误信息
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
3、handlers
用于当关注的资源发生变化时采取一定的操作。
“notify”这个action可用于在每个play的最后被触发这样
可以避免多次有改变发生时每次都执行指定的操作取而代之
仅在所有的变化发生完成后一次性地执行指定操作。
在notify中列出的操作称为handler也即notify中调用
handler中定义的操作。
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handler是task列表这些task与前述的task并没有本质上的不同。
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted |