实施Playbook
Playbook的介绍
playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。。
Playbook的基础组件
Hosts:运行执行任务(task)的目标主机
Remote_user:在远程主机上执行任务的用户
Tasks:任务列表
Handlers:任务,与tasks不同的是只有在接受到通知时才会被触发
Templates:使用模板语言的文本文件
Variables:变量,变量替换
Playbook的特性
Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:
- 同一级别的数据元素,缩进量必须一致
- 不同级别的数据元素,子项要比父项缩进量大(一般都是缩进2个字节)
- 只有空格字符可用于缩进,不允许使用tab键。
Playbook的语法
Playbook开头的一行由三个破折号(---)组成
只能使用空格键缩进,不允许使用tab键缩进
K/V的值可同行写,可换行写,同行使用分隔,换行以-分隔
Playbook的使用
运行Playbook
absible-playbook命令可用于运行playbook。该命令在控制节点上执行,要运行的playbook的名称则作为参数传递。
在运行playbook时,将生成输出来显示所执行的play和任务。输出中也会报告执行的每一项任务的结果。
playbook中的任务是幂等的,能够安全的多次运行playbook,如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。
以下示例中显示了一个简单的playbook的内容,后面是运行它的结果。
[root@master ansible]# vim /root/test.yml
[root@master ansible]# cat /root/test.yml
---
- hosts: 192.168.159.3 //执行任务的主机
tasks: //下方输入任务
- name: create a user //使用的模块
user: //用户模块
name: dzc //用户名称
uid: 3000 //指定UID
state: present //执行状态
[root@master ansible]# ansible-playbook /root/test.yml
PLAY [192.168.159.3] ***************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [192.168.159.3]
TASK [create a user] ***************************************************************************************************************************************************************
changed: [192.168.159.3]
PLAY RECAP *************************************************************************************************************************************************************************
192.168.159.3 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
在playbook运行时,屏幕中会显示每个play和任务的name键的值。(Gathering Facts任务是一项特别的任务,setup模块通常在play启动时自动运行这项任务。)对于含有多个play和任务的playbook,设置name属性后可以更加轻松地监控playbook执行的进展。
通常而言,Ansible Playbook中的任务是幂等的,而且能够安全地多次运行playbook。如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。
配置Playbook执行的输出详细程序
选项 | 描述 |
---|---|
-v | 显示任务结果 |
-vv | 任务结果和任务配置都会显示 |
-vvv | 包含关于与受管主机连接的信息 |
-vvvv | 增加了连接插件相关的额外详细程序选项 |
语法验证
在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook命令提供了一个--syntax-check选项,可用于验证playbook的语法。
下例演示了一个playbook成功通过语法验证:
[root@master ansible]# ansible-playbook --syntax-check /root/test.yml
playbook: /root/test.yml
执行空运行
可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改。
下例演示了一个playbook的空运行,它包含单项任务,可确保在受管主机上安装了最新版本的httpd软件包。注意该空运行报告此任务会对受管主机产生的更改。
[root@master ansible]# ansible-playbook -C /root/test.yml
PLAY [192.168.159.3] ***************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [192.168.159.3]
TASK [create a user] ***************************************************************************************************************************************************************
ok: [192.168.159.3]
PLAY RECAP *************************************************************************************************************************************************************************
192.168.159.3 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
实施多个play
缩写多个play
Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。
在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个play,完成后再对另一组主机运行另一个play。
缩写包含多个play的playbook非常简单。Playbook中的各个play编写为playbook中的顶级列表项。各个play是含有常用play关键字的列表项。
示例:
[root@master ansible]# vim /root/test.yml
[root@master ansible]# cat /root/test.yml
---
- hosts: 192.168.159.3
tasks:
- name: create a file
file:
name: ddd
path: /root/dzc/
state: present
- name: Delete file
file:
name: ddd
path: /root/dzc/
state: absent
- hosts: 192.168.159.6
tasks:
- name: Create a directory and specify permissions
file:
path: /root/dzc/
state: directory
mode: 0755
- name: delete directory
file:
path: /root/dzc/
state: absent
[root@master ansible]# ansible-playbook --syntax-check /root/test.yml
playbook: /root/test.yml
用户属性与特权升级属性
Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它。
become: true
如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。
以下示例中指定sudo用于特权升级:
become_method: sudo
此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。
become_user: privileged_user
查找模块
Ansible随附打包的大量模块为管理员提供了许多用于常见管理任务的工具。前面我们介绍了Ansible官方网站的帮助文档链接https://docs.ansible.com/。通过模块索引,可以很轻松的找到对应的模块。例如,适用于用户和服务管理的模块可以在Systems Modules下找到,而适合数据库管理的模块则可在Database Modules下找到。
对于每一个模块,Ansible官网提供了其功能摘要,以及关于如何通过模块的选项来调用各项具体功能的说明。文档还提供了实用的示例,演示各个模块的用法,以及任务中关键字的设置方法。
前面我们用到过ansible-doc -l命令。这将显示模块名称列表以及其功能的概要。
ansible-doc -l
使用ansible-doc [module name]命令来显示模块的详细文档。与Ansible官网一样,该命令提供模块功能的概要、其不同选项的详细信息,以及示例。
ansible-doc yum //显示yum模块的帮助文档
幂等的playbook可以重复运行,确保系统处于特定的状态,而不会破坏状态已经正确的系统。
Playbook的语法变化
YAML注释
注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格。
YAML字符串
YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起。
YAML字典
字典也可以使用以大括号括起的内联块格式编写,大多数情况下应避免内联块格式,因为其可读性较低。不过,至少有一种情形中会较常使用它。当playbook中包含角色列表时,较常使用这种语法,从而更加容易区分play中包含的角色和传递给角色的变量。
YAML列表
列表也有以中括号括起的内联格式,我们应该避免使用此语法,因为它通常更难阅读。
评论区