YAML 语法

大番茄 2020年02月12日 1,379次浏览

参考: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、单引号与双引号的区别, 双引号里可以使用 \ 转义符。