Playbook
实施playbook
Ansible playbook
play是针对清单中选定的主机运行的一组有序任务,playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。
Play可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。在playbook中,可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤
Playbook核心元素
- Hosts: 执行的远程主机列表
- Tasks:任务集
- Varniables:内置变量或自定义变量在playbook中调用
- Templates:模板,及使用模板语法的文件,比如配置文件等
- Handlers和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags标签,指定某条任务执行,用于选择运行playbook中的部分代码
格式化playbook
Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对应用与缩进的空格数量没有严格的要求,但有两个基本的规则:
- 处于层次结构中同一级别的数据元素(例如同意列表中的项目)必须具有相同的缩进量
- 如果项目属于其他项目的子项,其缩进量必须大于父项
只有空格字符可以用于缩进,不允许使用tab键。约定俗称的缩进量一般是一级两个空格
Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略
Play本身是一个键值对集合。同一play中的键应当使用相同的缩进量。以下示例显示了具有三个键的YAML代码片段。前两个键具有简单的值。第三个将含有三个项目的列表作为值。
- name:example
hosts:web
tasks:
- first
- second
作为play中的一部分,tasks属性按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合。
还以上面创建用户的play为例,play中唯一任务有两个键:
- name是记录任务用途的可选标签。最好命名所有的任务,从而帮助记录自动流程中的每一步用途。
- user是要为这个任务运行的模块。其参数作为一组键值对传递,它们是模块的子项(name、uid和state)。
tasks:
- name: web
service:
name: httpd
enabled: true
- name: NTP server is enabled
service:
name: chronyd
enabled: true
提高输出的详细程度
ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别。
配置playbook执行的输出详细程序
选项 | 描述 |
---|---|
-v | 显示任务结果 |
-vv | 任务结果和任务配置都会显示 |
-vvv | 包含关于与受管主机连接的信息 |
-vvvv | 增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本 |
执行空运行
可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改。
下例演示了一个playbook的空运行,它包含单项任务,可确保在受管主机上安装了最新版本的httpd软件包。注意该空运行报告此任务会对受管主机产生的更改。
ansible-playbook -C webserver.yml
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值来禁用它。
becom: true
如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。
以下示例中指定sudo用于特权升级:
become_method: sudo
此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。
become_user: privileged_user
运行playbook
在运行playbook时,将生成输出来显示所执行的play和任务。输出中也会报告执行的每一项任务的结果。
以下示例中显示了一个简单的playbook的内容,后面是运行它的结果。
[root@client playbook]# cat playbook.yml
---
- name: create jerry user
hosts: 192.168.8.128
tasks:
- name: jerry
user:
name: jerry
state: present
[root@client playbook]# ansible server -m command -a "id jerry"
192.168.8.128 | CHANGED | rc=0 >>
uid=1001(jerry) gid=1001(jerry) 组=1001(jerry)
缩写多个playbook
Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。
在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个play,完成后再对另一组主机运行另一个play。
缩写包含多个play的playbook非常简单。Playbook中的各个play编写为playbook中的顶级列表项。各个play是含有常用play关键字的列表项。
[root@client playbook]# cat playbook.yml
---
- name: first
hosts: 192.168.8.128
tasks:
- name: httpd install
yum:
name: httpd
status: latest
- name:
service:
name: nginx
enabled: true
- name: second
hosts: 192.168.8.130
tasks:
- name: mkdir /opt/ABC
file:
path: /opt/ABC
state: directory
[root@client playbook]# ansible-playbook playbook.yml
PLAY [first] *********************************************************************************
TASK [Gathering Facts] ***********************************************************************
ok: [192.168.8.128]
TASK [install httpd] *************************************************************************
ok: [192.168.8.128]
TASK [enabled httpd] *************************************************************************
changed: [192.168.8.128]
PLAY [second] ********************************************************************************
TASK [Gathering Facts] ***********************************************************************
ok: [192.168.8.130]
TASK [mkdir /opt/ABC] ************************************************************************
changed: [192.168.8.130]
PLAY RECAP ***********************************************************************************
192.168.8.128 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.8.130 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansible-playbook --syntax-check playbook.yml #用于检查playbook的语法问题
运维发布方式
- 蓝绿部署
- 灰度发布
- 滚动发布
- 红黑部署
蓝绿部署
用于0 downtime应用上线的一套部署策略。它不需要停机,不用停止老版本,额外搞一套新版本,等测试发现新版本OK后,删除老版本。
在部署新版本前,需要将部署新版本的流量掐断,全部打到OK的老版本上,使用条件,需要两倍的机器资源。
灰度发布
灰度发布又称金丝雀发布
不停止老版本,额外搞一套新版本,常常按照用户设置路由权重,例如90%的用户维持使用老版本,10%的用户尝鲜新版本。不同版本应用共存,经常与A/B测试一起使用,用于测试选择多种方案。
它是对某一产品的发布逐步扩大使用群体范围的一种发布方式,让用户尽早参与,获取用户反馈,完善产品功能,提升产品质量。
滚动发布
一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本
比蓝绿部署节约资源,但服务器节点数量多,会很慢。
红黑部署
红黑部署的好处是服务始终在线,同时采用不可变部署的方式,也不像蓝绿部署一样得保持冗余的服务始终在线。
需要注意: 在蓝绿色部署中,两个版本可能暂时同时获取请求,而在红黑中,只有一个版本在任何时间点获得流量。