ansible的playbook是用yaml书写的,因此在学习ansible之前,应该对yaml有一定的了解。
yaml与json、xml一样,是一种通用的数据序列化方式。yaml的设计目标是方便人类读写。因此,现在很多程序都支持使用yaml书写配置文件。
yaml的基本语法规则,如下:
yaml支持两大类数据类型:
标量(scalar):原子的、不可再分的量。包括:
矢量(vector):可以再分的量。其成分可以是标量,也可以是矢量。包括:
每行一个键值对。
每行的键和值之间用":"进行分隔。
所有行左侧对齐。
比如:
- cat: miaomiao dog: wangwang
会被转换成:
[{'dog': 'wangwang', 'cat': 'miaomiao'}]
yaml也支持将所有键值对写在一行,比如:
- {cat: miaomiao, dog: wangwang}
和上面的例子是等价的。
每行一个元素。
每行的格式是:"-"加上若干空格,后面跟着数据元素。
所有行左侧对齐。
比如:
- - 1 - 2 - 3 - 4 - - 5 - 6 - 7 - 8
会被转换成:
[[1, 2, 3, 4], [5, 6, 7, 8]]
yaml也支持将所有元素写在一行,比如:
[[1, 2, 3, 4], [5, 6, 7, 8]]
和上面的例子是等价的。
字符串可以不放在引号中。比如:
这是一个字符串
也可以放在单引号或双引号中,比如:
- "这是一个字符串" - '这是一个字符串'
单引号和双引号的区别是:双引号不会对特殊字符进行转义。比如:
- '内容\n字符串' - "内容\n字符串"
会被转换成:
['内容\\n字符串', s2: '内容\n字符串']
字符串可以写成多行。对于多行字符串,每行前面都必须有一个或多个空格。换行符会被转成空格。每行前面的空格会被忽略掉。比如:
str1: this is str1 str2: this is str2
会被转换成:
{'str2': 'this is str2', 'str1': 'this is str1'}
对于多行字符串,可以使用"|"保留换行符,可以使用">"折叠换行符。比如:
str1: | this is str1 str2: > this is str2 str3: this is str3
会被转换成:
{'str3': 'this is str3', 'str2': 'this is str2\n', 'str1': 'this\nis\nstr1\n'}
也可以使用"+"保留末尾的换行符,"-"删除末尾的换行符。比如:
str1: |- this is str1 str2: >+ this is str2
会被转换成:
{'str2': 'this is str2\n', 'str1': 'this\nis\nstr1'}
在yaml中,使用"&"创建锚点,使用"*"引用锚点,使用"<<:"将引用的内容合并到当前对象。比如:
merge: - &CENTER { x: 1, y: 2 } - &LEFT { x: 0, y: 2 } - &BIG { r: 10 } - &SMALL { r: 1 } sample1: <<: *CENTER r: 10 sample2: <<: [ *CENTER, *BIG ] other: haha sample3: <<: [ *CENTER, *BIG ] r: 100
会被转换成:
{'merge': [{'y': 2, 'x': 1}, {'y': 2, 'x': 0}, {'r': 10}, {'r': 1}], 'sample1': {'y': 2, 'x': 1, 'r': 10}, 'sample3': {'y': 2, 'x': 1, 'r': 100}, 'sample2': {'y': 2, 'x': 1, 'r': 10, 'other': 'haha'}}
在merge中,定义了四个锚点。
在sample1中,<<: *CENTER的意思是引用{x: 1, y: 2},并且合并到sample1中,那么合并的结果为:sample1={r=10, y=2, x=1}。
在sample2中,<<: [*CENTER, *BIG] 的意思是联合引用{x: 1, y: 2}和{r: 10},并且合并到sample2中,那么合并的结果为:sample2={other=haha, x=1, y=2, r=10}。
在sample3中,引用了*CENTER和*BIG,还使用了r: 100覆盖了引入的r: 10,所以sample3值为:sample3={r=100, y=2, x=1}。
1,在一个yml文件中,可以写多个文档。"—"(三个中划线)表示一个文档的开始;"…"(三个点)表示一个文档的结束。
2,在yaml中,可以使用"!!数据类型"做强制数据类型转换。比如:
string: - !!str 54321 - !!str true
会被转换成:
{'string': ['54321', 'true']}