Ansible playbook
ansible命令每次只能执行一个任务,这种运行方式称为Ad-hoc(点对点模式),不考虑Ansible特性的话,这功能比ssh远程执行命令还要弱。
所以,Ansible靠ansible命令是撑不起自动化管理这把大伞的,Ansible真正强大的是playbook,它才是Ansible撬动自动化管理的结实杠杆。
playbook、play和task的关系
在前面介绍inventory的时候,将它类比为演员表,在这里,我继续对playbook、play 和task跟拍电影中的一些过程做个对比。
playbook译为剧本,就像电影、电视剧的剧本一样,剧本中记录了电影的每一片段应该怎么拍,包括∶拍之前场景布置、拍之后的清场、每一个演员说什么话做什么动作、每一个演员穿什么样的衣服,等等。
Ansible的playbook也如此,电影的每一个片段可以对应于playbook中的每一个play,每一个play都可以有多个任务((tasks),tasks可以对应于电影片段中的每一幕。所以,playbook可以用来组织多个任务,然后让这些任务统一执行,就像shel脚本组织多个命令一样,这种组织多个事件、多个任务的行为,有一个更高大上的术语∶"编排"。
还可以继续更细致的对应起来。比如每一个play都可以定义自己的环境,比如play级别的变量,对应于电影片段的场景布置,每一个play都需要指定要执行该play的主机,即先确定好这个电影片段中涉及的演员,每一个Play可以有pre tasks,对应于正式开拍之前的布置,每一个play可以有post tasks,对应于拍完之后的清场。而我们人,既是编写playbook的编剧,也是让playbook跑起来的导演。
简单总结一下playbook、play和task的关系∶
1.playbook中可以定义一个或多个play
2.每个play中可以定义一个或多个task
3.每个play都需要通过hosts指令指定要执行该play的目标主机
4.每个play都可以设置一些该play的环境控制行为,比如定义play级别的变量
如图∶
例如,下面是一个playbook示例,文件名为first.yml,内容如下∶
[root@localhost ~]# cat first.yml
---
- name: play1
hosts: nginx
remote_user: root
gather_facts: false
tasks:
- name: task1 in play1
debug: msg="out put task1 in play1"
- name: task2 in play2
debug: msg="output task2 in play2"
- name: play2
hosts: tomcat
remote_user: root
gather_facts: false
tasks:
- name: task1 in play2
debug: msg="output task1 in play2"
- name: task2 in play2
debug: msg="output task2 in play2"
先不管这个playbook中的内容具体是什么含义,后面会为大家介绍playbook的写法。不过,我想大家从名称或从缩进级别上大致也能看出这个playbook中包含两个play∶"pla y1和"play2",每个play中又包含了两个task。且执行play 1的是nginx主机组中的主机节点,执行"play 2"的是apache主机组中的主机节点。
使用ansible-playbook命令执行这个playbook∶
[root@localhost ~]# ansible-playbook first.yml
PLAY [play1] **************************************************************************************************************************************
TASK [task1 in play1] *****************************************************************************************************************************
ok: [192.168.179.100] => {
"msg": "out put task1 in play1"
}
TASK [task2 in play2] *****************************************************************************************************************************
ok: [192.168.179.100] => {
"msg": "output task2 in play2"
}
PLAY [play2] **************************************************************************************************************************************
TASK [task1 in play2] *****************************************************************************************************************************
ok: [192.168.178.100] => {
"msg": "output task1 in play2"
}
TASK [task2 in play2] *****************************************************************************************************************************
ok: [192.168.178.100] => {
"msg": "output task2 in play2"
}
PLAY RECAP ****************************************************************************************************************************************
192.168.178.100 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.179.100 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
输出结果有点长,但是初学playbook,有必要了解一下输出结果中一些内容的含义。
首先执行的是playbook中的"play1",nginx主机组(有1个节点要执行这个play,且这个play中有两个任务要执行,所以输出结果为∶
TASK [task1 in play1] *****************************************************************************************************************************
ok: [192.168.179.100] => {
"msg": "out put task1 in play1"
}
TASK [task2 in play2] *****************************************************************************************************************************
ok: [192.168.179.100] => {
"msg": "output task2 in play2"
}
其中ok表示任务执行成功,且PLAY和TASK后面都指明了play的名称、task的名称。
执行完"play1"之后,执行"play2",tomcat主机组(有1个节点)要执行这个play,且这个play中有两个任务要执行,所以输出的输出结果和上面的类似。
最后输出的是每个主机执行任务的状态统计,比如某个主机节点执行成功的任务有几个,失败的有几个。
PLAY RECAP ****************************************************************************************************************************************
192.168.178.100 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.179.100 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
介绍完playbook并演示完它的用法之后,接下来该学playbook的写法了。