4 Playbook
4.1 playbook介绍
playbook 剧本是由一个或多个“play”组成的列表
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作。
Playbook 文件是采用YAML语言编写的
4.2 YAML 语言
4.2.1 YAMl 语言介绍YAML是一个可读性高的用来表达资料序列的格式。
YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingydöt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多软件中采有此格式的文件,如:ubuntu,anisble,docker,k8s等
YAML:YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)
YAML 官方网站:http://www.yaml.org
4.2.2 YAML 语言特性
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
4.2.3 YAML语法简介
1、在单一文件第一行,用连续三个连字号“-”开始,还有选择性的连续三个点号(...)用来表示文件的结尾
2、次行开始正常写playbook的内容,一般建议写明该playbook的功能
3、使用#号注释代码
4、所进的级别也必须一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现
5、YAML文件内容是区分大小写的,key/value的值军需大小写敏感
6、多个k/v可同行写也可换行写,同行使用“,”分隔
7、v可以个字符串,也可以是另一个列表
8、一个完整的代码块功能最少元素需包括name和task
9、一个name只能包含一个task
10、YAML文件扩展名通常为yml或yaml
YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔,下面介绍常见的数据结构。
4.3 Playbook核心元素
hosts 执行的远程主机列表
Tasks 任务集
Variables 内置变量或自定义变量在playbook中的调用
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。
4.3.1 hosts 组件
Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。
案例:
- hosts: websrvs:appsrvs
4.3.2 remote_user 组件
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
案例
- hosts: websrvs
remote_user: root
tasks:
- name: test connection
ping:
remote_user: magedu
sudo: yes #默认sudo为root
sudo_user:wang #sudo为wang
4.3.3 task列表和action组件
play的主体部分是task list , task list中有一个或多个task,各个task按序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task之后,再开始第二个task。
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。
每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未能提供name,则action的结果将用于输出。
task两种格式:
(1) action: module arguments
(2) module: arguments 建议使用
注意:shell和command模块后面跟命令,而非key=value
---
- hosts: lou
remote_user: root
tasks:
- name: install httpd
yum: name=httpd
- name: start httpd
service: name=httpd state=started enabled=yes