临时命令可以作为一次性命令对一组目标主机运行一项简单的任务。不过,若要真正发挥Ansible的力量,需要了解如何使用playbook以便轻松重复的方式对一组目标主机执行多项复杂的任务。
play是针对清单中选定的主机运行的一组有序任务。playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。
Play可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。在playbook中,可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤。
以一条命令做为案例来讲解下其在playbook中是如何编写的。
ansible 192.168.91.129 -m user -a 'name=runtime uid=4000 state=present'
这个任务可以将其编写为一个单任务的play并保存在playbook中。生成的playbook如下方所示:
--- 起分隔作用
- name: Configure important user consistently 描述
hosts: 192.168.91.129 哪台主机进行运行
task: 任务
- name: runtime exists with UID 4000
user:
name: runtime
uid: 4000
state: present
/ / 进入ansible配置文件目录下
[root@master ~]# cd /opt/project/
[root@master project]# ls
ansible.cfg hehe inventories
/ / 创建playbook目录
[root@master project]# mkdir playbook
[root@master project]# ls
ansible.cfg hehe inventories playbook
[root@master project]# cd playbook/
/ / 在playbook目录里面创建空文件user.yml
[root@master playbook]# touch user.yml
/ / 用格式化playbook编辑user.yml
[root@master playbook]# vum user.yml
[root@master playbook]# cat user.yml
---
- name: test
hosts: 192.168.91.129
tasks:
- name: create user for tom
user:
name: tom
uid: 5000
state: present
[root@master playbook]# cd ..
/ / 用Ansible playbook 运行
[root@master project]# ansible-playbook playbook/user.yml
PLAY [test] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.91.129]
TASK [create user for tom] *****************************************************
changed: [192.168.91.129]
PLAY RECAP *********************************************************************
192.168.91.129 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 / / 运行成功
/ / 查看结果
[root@node1 ~]# id tom
uid=5000(tom) gid=5000(tom) groups=5000(tom)
Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:
只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格。
Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略。
在这两个标记之间,会以一个play列表的形式来定义playbook。YAML列表中的项目以一个破折号加空格开头。例如,YAML列表可能显示如下:
- red
- blue
- black
Play本身是一个键值对集合。同一play中的键应当使用相同的缩进量。以下示例显示了具有三个键的YAML代码片段。前两个键具有简单的值。第三个将含有三个项目的列表作为值。
- name: just an example
hosts: webservers
tasks:
- first
- second
- third
作为play中的一部分,tasks属性按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合。
还以上面创建用户的play为例,play中唯一任务有两个键:
下面再来看一个含有多项任务的tasks属性案例:
tasks:
- name: web server is enabled
service:
name: httpd
enabled: true
- name: NTP server is enabled
service: