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。