2.1:Playbook 中遵循的 YAML 一般语法
YAML官方网站:https://yaml.org/
Ansible YAML 语法介绍:https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
YAML 是一种数据格式,与其它数据格式(XML、JSON等)相比,可读性更好,而且大多数的编程语言都提供了可用于YAML数据格式的库。
XML、JSON、YAML数据格式的比较:
- XML:Extensible Markup Language(可扩展标记语言),用于数据交换和配置。
- JSON:JavaScript Object Notation(JS 对象简谱),是一种轻量级的数据交换格式,用于数据交换和配置,不支持注释。
- YAML:YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
主要用于配置。
可以通过工具对三种数据格式进行相互转换,比如JSON和 YAML的互相转换,可以用:
- https://www.json2yaml.com/
- http://www.bejson.com/json/json2yaml/
整个YAML数据格式的语法比较繁杂,Playbook中经常用到的也不多,下边对Playbook编写时需要遵循的、经常用到的YAML一般语法进行基本的说明。
2.1.1:首先:
- Playbook中数据的基本元素都是“key: value”形式的标量(Scalar),其中“冒号”后必须要跟一个“空格”。
- 标量(Scalar)可以组合成不同的数据结构。
Playbook数据结构的组织方式有三种:- 列表(List)
- 字典(Dictionary)
- 二者混合
- YAML使用严格的缩进级别来组织多个层级的数据结构,所以在编写Playbook时,同一数据结构层级中,成员的缩进级别必须统一。
2.1.2:其次:
以一个简单的Playbook为例,说明在编写Playbook时需要遵循的一般YAML语法,以及列表(List)+字典(Dictionary)混合数据结构是怎么组织的。
#在playbook的第一行用“---”表示开始(这是约定俗成的,不是强制性的标准)。
---
#以“#”号开头的行表示注释(这里是将这个playbook的功能进行说明)。
#Install httpd Server
#playbook的正式内容几乎都以列表开头,列表中的成员以“- ”开头。
#比如这个playbook是以“- host: websrvs"开头的,相当于整个plabook是一个大的列表,”- host: websrvs“是列表中的一个成员。
- hosts: websrvs
remote_user: root
tasks:
- name: Install httpd
yum: name=httpd
- name: Config file
copy: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify: Restart httpd
- name: Web file
copy: src=index.html dest=/var/www/html/index.html
- name: Start service
service: name=httpd state=started enabled=yes
handlers:
- name: Restart httpd
service: name=httpd state=restarted
#在playbook的最后一行用“...”表示结尾(也是约定俗成的,不是强制性的标准)
...
上述playbook的整个数据结构是这样组织的:
-
第一层级:整个playbook是一个大的列表
成员1个:
- hosts: websrvs
(字典)-
第二层级:
hosts: websrvs
(字典)成员3个:
remote_user: root
(标量)、tasks:
(列表)、handlers:
(列表)-
第三层级:
remote_user: root
(标量)标量是单个的,不可再分的值,所以不可能再有成员
-
第三层级:
tasks:
(列表)成员是4个字典,而这4个字典又各自包含多个成员,分别为:
-
name: Install httpd
、yum: name=httpd
-
name: Config file
、copy: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
、notify: Restart httpd
-
name: Web file
、copy: src=index.html dest=/var/www/html/index.html
-
name: Start service
、service: name=httpd state=started enabled=yes
-
-
第三层级:
handlers:
(列表)成员是1个字典,这个字典包含的成员为:
-
name: Restart httpd
、service: name=httpd state=restarted
-
-
-
2.1.3:最后:
-
Playbook中标量的格式除了上述playbook中用到的
key: value
形式外,还可以用多行缩进的方式表示,即:key: value
-
Playbook中列表的格式除了上述playbook中用到的多行表示方式,即:
list: - mem_key1: mem_value1 - mem_key2: mem_value2 - mem_key3: mem_value3
之外,还可以将单个列表写成一行,即:
list: [ mem_key1: mem_value1, mem_key2: mem_value2, mem_key3: mem_value3 ]
列表的所有成员用中括号
[ ]
括起来(为了美观,可以在两侧中括号内各加一个空格);
成员之间使用,
分隔(注意逗号后有一个空格)。 -
字典的格式除了上述playbook中用到的多行表示方式,即:
dictioary: mem_key1: mem_value1 mem_key2: mem_value2 mem_key3: mem_value3
同样可以将单个字典写成一行,即:
dictioary: { mem_key1: mem_value1, mem_key2: mem_value2, mem_key3: mem_value3 }
字典中的所有成员用大括号
{ }
括起来(为了美观,可以在两侧大括号内各加一个空格);
成员之间使用,
分隔(注意逗号后有一个空格)。 -
YAML数据格式是对大小写敏感的,所以在Playbook编写时要特别注意大小写的区分。
-
Playbook文件名一般以
yml
或yaml
结尾,以表示这是一个YAML格式的文件。