参考:https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html#yaml-syntax
语法检测:
http://www.yamllint.com/
这里只是YAML语法,与ansible使用无关。
1、 ---
表示YAML文档的开始与结束。
推荐加上 ---
,看起来更清晰 , 而且多个YAML文档也可以合并成一个, 因为有 ---
分割,不会产生语法冲突。 如下面两个文档的缩进不会相互影响。
---
apiVersion: v1
kind: Namespace
metadata:
name: log
---
apiVersion: v1
kind: Namespace
metadata:
name: data
---
2、列表
-
横杠表示一个列表项, 相同缩进级别的 -
,一起表示一个列表。
每个 -
后面必须有一个空格或换行。
每个 -
之后的缩进级别,都是这个列表项的内容。
- web
- db
- test
翻译成列表就是: ['web', 'db', 'test']
-
只是表示列表项的开始,后面的web也可以写在下一行。
-
web
-
db
-
test
一般像这种,-
后面是单独的值, 不会使用换行的方式。 如果列表项的内容是字典。换行的方式还多点。
这个只是一种书写习惯,允许这样写,没有规定必须这样写。
3、字典
:
冒号表示字典项。相同级别的 :
, 一起表示一个字典。
:
后面必须要有一个空格或换行。key: value
。
每个 :
后面缩进级别的内容都是这个字典项的value。
如:
- hosts: web
- hosts: db
- hosts: web
-
hosts: web
-
hosts: db
-
hosts: web
上面每一个列表项都是一个字典 , 翻译过来就是:
[{'hosts': 'web'}, {'hosts': 'db'}, {'hosts': 'web'}
]
all:
name: nginx
version: 1.17
system: centos
state: installed
{'all': {'name': 'nginx', 'version': '1.17', 'system': 'centos', 'state': 'installed'}}
在python里字典项的顺序是随机的。这就取决于解析yaml的程序是否放到顺序字典里了。
不过一般来说YAML文档里字典项的顺序不是固定的,除非专门说明。
所以,在这里name, version,system,state谁前谁后都一样。
4、列表字典例子
---
-
hosts: web
tasks:
-
name: "install nginx"
yum: "name=nginx state=present"
-
name: "install php"
yum: "name=nginx state=present"
-
hosts: db
tasks:
-
name: "install mariadb"
yum: "name=mariadb state=present"
总体是一个包含两个元素的列表。下面又有字典,tasks字典项又是列表。翻译一下:
[{'hosts': 'web', 'tasks': [{'name': 'install nginx', 'yum': 'name=nginx state=present'}, {'name': 'install php', 'yum': 'name=nginx state=present'}]},
{'hosts': 'db', 'tasks': [{'name': 'install mariadb', 'yum': 'name=mariadb state=present'}]}]
# 下面的可能容易读点
[
{'hosts': 'web', 'tasks':
[
{'name': 'install nginx', 'yum': 'name=nginx state=present'},
{'name': 'install php', 'yum': 'name=nginx state=present'}
]
},
{'hosts': 'db', 'tasks':
[
{'name': 'install mariadb', 'yum': 'name=mariadb state=present'}
]
}
]
上面的例子中,下级的列表项,如 tasks
下面的, 可以跟task对齐:
-
hosts: web
tasks:
-
name: "install nginx"
yum: "name=nginx state=present"
-
name: "install php"
yum: "name=nginx state=present"
如果不换行,就是这样。意思都是一样的。
- hosts: web
tasks:
- name: "install nginx"
yum: "name=nginx state=present"
- name: "install php"
yum: "name=nginx state=present"
5、列表字典可以使用缩写形式
一些复杂的情况,可能就需要直接写列表与字典了。直接写python种的列表与字典。比如:
- hosts: web
tasks:
- {'name': 'install nginx', 'yum': 'name=nginx state=present'}
- {'name': 'install php', 'yum': 'name=php state=present'}
直接写字典的少点, 写列表的情况还是很多的。
比如这种:
names:
- zhangsan
- lisi
- wangwu
- zhaoliu
names: ['zhangsan', 'lisi', 'wangwu', 'zhaoliu']
比如一个现实的例子:
命令与参数:
command:
- nginx
args:
- -g
- "daemon off;"
command: ["nginx"]
args: ["-g", "daemon off;"]
6、跨越多行,>
, |
, |+
, |-
把跨行字符串处理成一行的。
忽略字符之前的缩进。
>
: 会把字符串里的换行符转换成空格,其他字符不变。
如:
1、常规
names: >
abcdefg
1234556
hhhhhhh
state: online
names: "abcdefg 1234556 hhhhhhh\n"
state: online
2、结尾有空格
names: >
abcdefg
1234556
hhhhhhh
state: online
names: "abcdefg 1234556 hhhhhhh \n"
state: online
|
包含换行符与其他字符。
如:
names: |
abcdefg
123123
hhhhh
state: online
{'names': 'abcdefg\n123123\nhhhhh\n', 'state': 'online'}
|+
保留文本块末尾的换行。注意不是文本块之间的换行。
names: |+
abcdefg
123123
hhhhh
state: online
{'names': 'abcdefg\n123123\nhhhhh\n', 'state': 'online'}
|-
删除文本快末尾的换行
names: |-
abcdefg
123123
hhhhh
state: online
{'names': 'abcdefg\n123123\nhhhhh', 'state': 'online'}
7、注释
#
号开头是注释。
8、其他
1、一般情况字符不需要使用引号,但是如果包含特殊符号,如 :
,冒号是字典, 需要引号引起来。
2、单引号与双引号的区别, 双引号里可以使用 \
转义符。