82.学习Ansible[5]:YAML文件格式浅析,ansibleyaml

文章目录关于YAML

Ansible中的YAML列表

字典

复杂格式

Ansible中不常用的YAML特性布尔型值

跨行

特殊字符处理

Ansible的变量替换

掌握Ansible的ad-hoc command、inventory管理后,可以继续深入了解playbook的编写。在学习playbook之前,我们先了解一下playbook使用的YAML的语法格式。

关于YAML

Ansible的Playbook之所以采用YAML,是因为YAML可读性强,比XML、JSON易编写。另外,大多数语言有成熟的YAML解析工具。

YAML档案以---开头,…结尾(可选,如果多个YAML档案保存在一个文件,建议用…结尾,这样在流式传输中不用关闭流就知道遇到了档案结尾)。

使用#(井号加一个空格)作为单行注释的开头,YAML没有多行注释。

只能使用空格缩进,不能使用tab。

字符串不必用引号括起。如果用双引号括起来,支持特殊字符的转义。

Ansible中的YAML

Ansible几乎所有的YAML档案的最顶层都是列表,列表中的每个元素是key/value对(字典)。

列表

YAML中,列表的所有元素,都是同样缩进、以-(短横线和空格,或者短横线和换行符)开头的一行,例如:

---
# A list of fruits
fruits:
- Apple
- Orange
- Mango
…

无所谓缩进的空格数量,只要保证同样层级的元素缩进量一样就可以。

字典

字典按照key: value(冒号后面跟一个空格,或者冒号后跟一个换行符)的格式定义:

# An employee record
mars:
name: mars loo
job: qa
skill: ansible

复杂格式

列表和字典可以互相嵌套,比如字典的列表、字典的值是列表或者两种情况的混合:

# Employee records
- mars:
name: mars loo
job: qa
skill:
- ansible
- python
- loo:
name: loo mars
job: rd
skill:
- java
- C++

字典和列表可以简写:

---
mars: {name: mars loo, job: qa, skill: ansible}
fruits: ['Apple', 'Orange', 'Mango']

Ansible中不常用的YAML特性

布尔型值

表示布尔型的true/false有多种形式:

create_key: yes
need_agent: no
knows_oop: True
like_vim: TRUE
use_cvs: false

跨行

一行文字长度过长可以跨行:|会包含换行符和尾随空格,>会把换行符替换为空格,并去掉多余的尾随空格。两种情况下,缩进的空格都会被忽略。例如:

include_newlines: |
exactly as you see
will appear these three
lines of poetry
fold_newlines: >
this is really a
single line of text
despite appearances

特殊字符处理

YAML中字符串不需要用引号扩起来,内容可以是任意值。某些场景下为了保留特殊字符可能需要用引号括起来,例如:

---

windows_drive: "C:"

否则C:后面跟了一个换行符,会被认为是一个字典。或者需要转义:

---
windows_drive: "C:\\a\\b"

Ansible的变量替换

Ansible使用{{ var }}表示变量,但是在YAML中,冒号后面跟着花括号会被认为是一个字典,所以需要用双引号括起来。如果一个值以{{ var }}的形式开头,则整个值都需要用双引号括起来,而不仅仅是{{ var }}的部分:

---
foo: "{{ variable }}/additional/string/literal"
foo2: "{{ variable }}\\backslashes\\are\\also\\special\\characters"
foo3: "even if it's just a string literal it must all be quoted"

如下字符都不能用于未被引号括起来的标量的开头:[] {} > | * & ! % # @ , ' "。虽然YAML规定? : -后面如果跟的不是空白字符,可以作为未被引号括起来的标量的开头,但是不同YAML解析器的实现不同,最好也都用引号括起来。

其他明确需要字符串的场景,也可以把标量中引号括起来,例如:

version : "1.0"

避免版本号1.0被解析成浮点数。

YAMLLint网站可以检查YAML文件的格式,并给出优化后的YAML定义。

至此,我们掌握的内容对于编写playbook已经足够,建议继续阅读下一篇博客:学习Ansible[6]:playbook。