概述

ansible的playbook是用yaml书写的,因此在学习ansible之前,应该对yaml有一定的了解。

yaml与json、xml一样,是一种通用的数据序列化方式。yaml的设计目标是方便人类读写。因此,现在很多程序都支持使用yaml书写配置文件。

yaml的基本语法规则,如下:

yaml支持两大类数据类型:


映射的表示

每行一个键值对。

每行的键和值之间用":"进行分隔。

所有行左侧对齐。

比如:

-
    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']}

参考文档