playbook的使用
playbook-剧本 介绍
play是针对清单中选定的主机运行的一组有序任务。playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。
playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML
playbook格式
playbook由YMAL语言编写。YAML参考了其他多种语言,包通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:
处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
如果项目属于其他项目的子项,其缩进量必须大于父项
只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格。
Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略。
在这两个标记之间,会以一个play列表的形式来定义playbook。YAML列表中的项目以一个破折号加空格开头。例如,YAML列表可能显示如下:
- apple
- orange
- grape
playbook基础组件
Hosts: 运行执行任务(task)的目标主机
remote_user:在远程主机上执行任务的用户
tasks: 任务列表
handlers: 任务,与tasks不同的是只有在接受到通知时才会被触发
templates: 使用模板语言的文本文件
variables: 变量,变量替换
tasks列表
1.Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。
2.在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook中的错误,然后重新执行即可。
Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。
3.每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。
4.定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
示例:
---
- hosts: 192.168.200.136
tasks:
- name: install vsftpd
yum:
name: vsftpd
state: latest
- name: vsftpd service
service:
name: vsftpd
state: started
enabled: yes
[root@localhost gg]# ansible-playbook playbook/user.yml //执行剧本命令
PLAY [192.168.200.136] ***************************************************************************
TASK [Gathering Facts] ***************************************************************************
ok: [192.168.200.136]
TASK [install vsftpd] ****************************************************************************
changed: [192.168.200.136]
TASK [vsftpd service] ****************************************************************************
changed: [192.168.200.136]
PLAY RECAP ***************************************************************************************
192.168.200.136 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost gg]#
提高输出的详细程度
ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别。
配置Playbook执行的输出详细程序
-v | 显示任务结果 |
---|---|
-vv | 任务结果和任务配置都会显示 |
-vvv | 包含关于与受管主机连接的信息 |
-vvvv | 增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本 |
示例:
[root@localhost gg]# ansible-playbook playbook/user.yml -v
Using /opt/gg/ansible.cfg as config file
PLAY [192.168.200.136] ***************************************************************************
TASK [Gathering Facts] ***************************************************************************
ok: [192.168.200.136]
TASK [install vsftpd] ****************************************************************************
ok: [192.168.200.136] => {"changed": false, "msg": "Nothing to do", "rc": 0, "results": []}
TASK [vsftpd service] ****************************************************************************
ok: [192.168.200.136] => {"changed": false, "enabled": true, "name": "vsftpd", "state": "started", "status": {"ActiveEnterTimestamp": "Mon 2021-07-19 22:48:36 CST", "ActiveEnterTimestampMonotonic": "22516314848", "ActiveExitTimestampMonotonic": "0", "ActiveState": "active", "After": "network.target systemd-journald.socket sysinit.target basic.target system.slice", "AllowIsolate": "no", "AllowedCPUs": "", "AllowedMemoryNodes": "", "AmbientCapabilities": "", "AssertResult": "yes", "AssertTimestamp": "Mon 2021-07-19 22:48:36 CST", "AssertTimestampMonotonic": "22516299986", "Before":
此处省略n行
PLAY RECAP ***************************************************************************************
192.168.200.136 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost gg]#
语法验证
在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook命令提供了一个–syntax-check选项,可用于验证playbook的语法。
正确playbook语法成功演示
[root@localhost playbook]# ansible-playbook --syntax-check user.yml
playbook: user.yml
[root@localhost playbook]#
语法验证失败时,将报告语法错误。输出中包含语法问题在playbook中的大致位置。
错误playbook语法成功演示
[root@localhost playbook]# ansible-playbook --syntax-check user.yml
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: No JSON object could be decoded
Syntax Error while loading YAML.
mapping values are not allowed in this context
The error appears to be in '/opt/gg/playbook/user.yml': line 12, column 14, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
name: vsftpd
state: started
^ here
[root@localhost playbook]#
执行空运行
可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改。测试所写的playbook会修改哪些东西。
下例演示了一个playbook的空运行,它包含单项任务,可确保在受管主机上安装了最新版本的httpd软件包。注意该空运行报告此任务会对受管主机产生的更改。
[root@localhost gg]# ansible-playbook -C playbook/user.yml
PLAY [192.168.200.136] ***************************************************************************
TASK [Gathering Facts] ***************************************************************************
ok: [192.168.200.136]
TASK [install vsftpd] ****************************************************************************
ok: [192.168.200.136]
TASK [vsftpd service] ****************************************************************************
ok: [192.168.200.136]
PLAY RECAP ***************************************************************************************
192.168.200.136 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost gg]#
实施多个play
Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。
在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个play,完成后再对另一组主机运行另一个play。
- name: first play
hosts: 172.16.103.129
tasks:
- name: first task
yum:
name: httpd
status: present
- name: second task
service:
name: httpd
enabled: true
- name: second play
hosts: 172.16.103.131
tasks:
- name: first task
service:
name: mariadb
enabled: true
play中的远程用户和特权升级
Play可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些在play本身中与hosts或tasks关键字相同的级别上设置。
用户属性
playbook中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字。运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用。
如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖。
remote_user: remoteuser
特权升级属性
Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它。
示例:
[root@localhost playbook]# visudo //先给test1用户授权
vim playbook/aaa.yml
---
- hosts: 192.168.200.136
tasks:
- name: test1
lineinfile:
path: /etc/hosts
line: 'hello world aabc'
state: present
[root@localhost gg]# ansible-playbook playbook/aaa.yml
PLAY [192.168.200.136] ***************************************************************************
TASK [Gathering Facts] ***************************************************************************
ok: [192.168.200.136]
TASK [test1] *************************************************************************************
changed: [192.168.200.136]
PLAY RECAP ***************************************************************************************
192.168.200.136 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost gg]#
[root@apache yum.repos.d]# cat /etc/hosts //在受控主机上查看结果
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
hello world aabc
[root@apache yum.repos.d]#
查找用于任务的模块
Ansible随附打包的大量模块为管理员提供了许多用于常见管理任务的工具。前面我们介绍了Ansible官方网站的帮助文档链接https://docs.ansible.com/。通过模块索引,可以很轻松的找到对应的模块。例如,适用于用户和服务管理的模块可以在Systems Modules下找到,而适合数据库管理的模块则可在Database Modules下找到。
对于每一个模块,Ansible官网提供了其功能摘要,以及关于如何通过模块的选项来调用各项具体功能的说明。文档还提供了实用的示例,演示各个模块的用法,以及任务中关键字的设置方法。