1.1 playbook介绍
- playbook 剧本是由一个或多个"play"组成的列表
- play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
- Playbook 文件是采用YAML语言编写的
1.2 YAML 语言
1.2.1 YAML语言介绍
YAML:YAML Ain’t Markup Language,即YAML不是标记语言。不过,在开发的这种语言时,YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多最新的软件比较流行采用此格式的文件存放配置信息,如:ubuntu,anisble,docker,kubernetes等
YAML 官方网站:http://www.yaml.org
ansible 官网: https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
1.2.2 YAML语言特性
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
1.2.3 YAML语法简介
- 在单一文件在单一文件第一行,用连续三个连字号"-" 开始第一行,用连续三个连字号"-" 开始
- 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能使用#号注释代码
- 缩进必须是统一的,不能空格和tab混用
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
- YAML文件内容是区别大小写的,key/value的值均需大小写敏感
- 多个key/value可同行写也可换行写,同行使用,分隔 key后面冒号要加一个空格 比如: key: value value可是个字符串,也可是另一个列表
- YAML文件扩展名通常为 yml 或 yaml
1.2.4 支持的数据类型
YAML 支持以下常用几种数据类型:
- 标量:单个的、不可再分的值
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
1.2.4.1 scalar 标量
key对应value
name:zeng
age:18
使用缩进的方式
name:
zeng
age:
18
标量是最基本的,不可再分的值,包括:
字符串
布尔值
整数
浮点数
Null
时间
日期
1.2.4.2 Dictionary 字典
字典由多个key与value构成,key和value之间用 :分隔, 并且 : 后面有一个空格,所有k/v可以放在一行,或者每个 k/v 分别放在不同行
格式
account: {
name: zeng, age: 18 }
使用缩进方式
account:
name: zeng
age: 18
范例:
#不同行
# An employee record
name: Example Developer
job: Developer
skill: Elite(社会精英)
#同一行,也可以将key:value放置于{}中进行表示,用,分隔多个key:value
# An employee record
{
name: "Example Developer", job: "Developer", skill: "Elite"}
1.2.4.3 List列表
列表由多个元素组成,每个元素放在不同行,且元素前均使用"-"打头,并且 - 后有一个空格, 或者将所有元素用 [ ] 括起来放在同一行
格式:
course: [ linux, golang, python ]
也可以写成以 - 开头的多行:
course:
- linux
- golang
- python
数据里面也可以包含字典:
course:
- linux: manjaro
- golang: gin
- python: django
范例:
#不同行,行以-开头,后面有一个空格
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
#同一行
[Apple,Orange,Strawberry,Mango]
范例:YAML 表示一个家庭
name: John Smith
age: 41
gender: Male
spouse: {
name: Jane Smith, age: 37, gender: Female } # 写在一行里
name: Jane Smith #也可以写成多行age: 37
gender: Female
children: [ {
name: Jimmy Smith,age: 17, gender: Male}, {
name: Jenny Smith, age:
13, gender: Female}, {
name: hao Smith, age: 20, gender: Male } ] #写在一行
- name: Jimmy Smith #写在多行,更为推荐的写法
age: 17
gender: Male
- {
name: Jenny Smith, age: 13, gender: Female}
- {
name: hao Smith, age: 20, gender: Male }
1.2.4.4 三种常见的数据格式
XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置
JSON:JavaScript Object Notation, JavaScript 对象表记法,主要用来数据交换或配置,不支持注释
YAML:YAML Ain’t Markup Language YAML 不是一种标记语言, 主要用来配置,大小写敏感,不支持tab
1.3 Playbook核心组件
一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:
- Hosts:执行的远程主机列表
- Tasks:任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task
- Variables :内置变量或自定义变量在playbook中调用
- Templates模板:可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
1.3.1 hosts组件
Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
[webservers]
10.0.0.20
[dbservers]
10.0.0.30
10.0.0.40 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
案例:
- hosts: webservers
1.3.2 remote_user 组件
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
-