概述
3.1 编写并执行PLAYBOOK
3.1.1 目标
学完这一章节,学生能去写一个基本的playbook并且执行通过ansible-playbook命令。
3.1.2 PLAYBOOK与AD HOC命令对比
一个ad hoc命令能执行单一,简单的任务针对一组目标主机执行一次性命令。然而,Ansible真正的用途是学习怎么样去用playbook去执行多个复杂的任务针对一组目标主机以一种简单可重复的方式
一个play是一组有序的任务针对选中的主机从你的清单文件中,一个剧本是一个文本文件包含了一个或更多按顺序执行的play的列表。
Play允许您将冗长、复杂的手动管理任务转换为易于重复的例行程序,并获得可预测和成功的结果。你可以将play中的任务序列保存为人类可读和立即运行的形式。 由于编写任务的方式不同,任务本身记录了部署应用程序或基础设施所需的步骤
3.1.3 ansible-playbook的格式
为了帮助你理解playbook的格式,我们复习下ad hoc在上一章节的命令
[sysadmin@ansible security]$ ansible 192.168.160.14 -m user -a 'name=newbie uid=4000 state=present'
这可以被写作为一个单独的任务保存在playbook中,playbook表现为如下:
- name: Configure important user consistently
hosts: servera.lab.example.com
tasks:
- name: newbie exists with UID 4000
user:
name: newbie
uid: 4000
state: present
playbook是一个YAML格式的文本文件,正常被保存为yml结尾。playbook使用空格缩进去表示数据的结构。YAML没有提出严格的要求使用多少个空格作为缩进,但有两个基本的原则:
- 层次结构中相同级别的数据元素必须有相同的缩进
- 作为另一项的子项必须比其父项缩进得多
可以增加空行提升playbook的可读性
仅仅空格能被用于缩进,tab制表符不被允许
如果你使用vi编辑器,你可以应用一些设置,使得它更容易编辑你的playbook。例如,你能增加如下行到你的$HOME/.vimrc文件,当vi监测到你正在编辑YAML文件,它执行2个空格缩进当你按tab键并且在随后的行自动缩进。
auto FileType yaml setlocal ai ts=2 sw=2 et
一个playbook以三个破折号(—)作为文档开始的标志。它可能以三个句点(…)作为文档结束的标志,尽管实践中经常被忽略。
在开始和结束标识之间,playbook定义了plays列表,YAML的项目以一个破折号跟随一个空格开始,如下例:
- apple
- orange
- grape
play本身是键值对的集合,同一play中的键值应该有相同的缩进,下面的例子展示了一个有三个键值的片段,前面两个keys有简单的值,第三个key有一个包含三项的列表作为值。
name: just an example
hosts: webservers
tasks:
- first
- second
- third
第一个key开始于一个破折号和一个空格,第一个key是name属性,name 是可选的,但它是推荐选项,因为它帮助记录你的playbook,这尤其是有用的,当playbook包含多个plays。
- name: Configure important user consistently
play的第二个key是hosts属性,hosts指定了play任务在哪些主机上执行。hosts后面写的是定义在inventory中的主机或主机组。
hosts: servera.lab.example.com
最后一个key是tasks属性,tasks值指定了这个play要运行的任务列表。本例中展示的是一个单独的任务,任务执行了user模块附加了指定的参数。
tasks:
- name: newbie exists with UID 4000
user:
name: newbie
uid: 4000
state: present
下面看到的是另一个例子,一个tasks属性附加了多个任务,service模块确保几个网络服务在主机启动时自动运行。
tasks:
- name: web server is enabled
service:
name: httpd
enabled: true
- name: NTP server is enabled
service:
name: chronyd
enabled: true
play和tasks在playbook中列出的顺序很重要,因为Ansible是按照相同的顺序运行它们的.
playbook你目前为止看到的都是基本的例子。随着课程的继续,您将看到关于如何使用play和tasks的更复杂的例子。
3.1.4 执行playbooks
ansible-playbook命令用来执行playbooks,命令被执行在控制节点,playbook的名字被传递作为一个参数
[student@workstation ~]$ ansible-playbook site.yml
下例中展示了playbook的内容和输出
[sysadmin@ansible security]$ cat useradd.yml
---
- name: add a user
hosts: 192.168.160.14
tasks:
- name: create a test user
user:
name: test
uid: 2000
state: present
[sysadmin@ansible security]$ ansible-playbook useradd.yml
PLAY [add a user] **************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************
ok: [192.168.160.14]
TASK [create a test user] ******************************************************************************************************************************************************************************************
changed: [192.168.160.14]
PLAY RECAP *********************************************************************************************************************************************************************************************************
192.168.160.14 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
上述的输出注意到name的键值被展示当playbook被执行的时候,Gathering Facts任务是一个特殊的任务在一个play的开头自动执行setup模块。这部分内容,后面的课程会详述。对于多个play和多个tasks的playbook,name属性使得更容易去监控playbook的执行过程。
3.1.5 增加输出的详细程度
ansible-playbook默认的命令输出不提供详细的任务执行信息,ansible-playbook -v命令提供了附加的信息,总共有四个级别。
选项 | 描述 |
---|---|
-v | 任务的输出结果被展示 |
-vv | 任务的输出结果和任务的配置被展示 |
-vvv | 包含连接受管主机的连接信息 |
-vvvv | 向连接插件添加额外的详细信息选项,包括被管理主机中用于执行脚本的用户,以及执行了哪些脚本 |
3.1.6 验证语法
执行playbook前,对playbook执行一次语法验证是非常有用的,ansible-playbook提供了–syntax-check选项去验证playbook的语法,下例中展示了语法验证成功的输出
[student@workstation ~]$ ansible-playbook --syntax-check useradd.yml
playbook: useradd.yml
如果语法验证失败了,语法错误将被报告。输出包含了语法错误的大概位置。
[sysadmin@ansible security]$ ansible-playbook --syntax-check webserver.yml
ERROR! Syntax Error while loading YAML.
could not find expected ':'
The error appears to be in '/security/webserver.yml': line 10, column 1, but may
be elsewhere in the file depending on the exact syntax problem.
(specified line no longer in file, maybe it changed?)
3.1.7 执行预演
可以使用-c选项去执行一次预演,结果报告如果playbook被执行,会发生什么结果,但不会真正执行在目标主机上。
下例中展示了一个playbook预演,包含了一个单独的任务去确保用户在目标主机被创建。
[sysadmin@ansible security]$ ansible-playbook -C useradd.yml
PLAY [add a user] **************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************
ok: [192.168.160.14]
TASK [create a test user] ******************************************************************************************************************************************************************************************
changed: [192.168.160.14]
PLAY RECAP *********************************************************************************************************************************************************************************************************
192.168.160.14 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
最后
以上就是自信发卡为你收集整理的Chapter3.1 编写PLAYBOOK的全部内容,希望文章能够帮你解决Chapter3.1 编写PLAYBOOK所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复