跳至主要內容

4.8 yaml语法

Clay自动化工具Ansible约 740 字大约 2 分钟

4.8 yaml语法

playbook的语法:YAML

ansible的playbook采用yaml语法,它以非常简洁的方式实现了json格式的事件描述。

yaml之于json就像markdown之于html一样,极度简化了json的书写。

YAML文件后缀通常为.yaml或.yml。

YAML在不少工具里都使用,学习它是"一次学习、终生受益"的,所以很有必要把yaml的语法格式做个梳理,系统性地去学一学。

YAML的基本语法规则如下:

(1).使用缩进表示层级关系

(2).缩进时不允许使用Tab键,只允许使用空格

(3).缩进的空格数目不重要,只要相同层级的元素左对齐即可

(4).yaml文件以"---"作为文档的开始,以表明这是一个yaml文件

即使没有使用---开头,也不会有什么影响

(5).# 表示注释,从这个字符一直到行尾,都会被解析器忽略

(6).字符串不用加引号,但在可能产生歧义时,需加引号(单双引号皆可),比如引用变量时

(7).布尔值非常灵活,不分区大小写的true/false、yes/no、on/off、y/n、0和1都允许

YAML支持三种数据结构:

(1).对象:key/value格式,也称为哈希结构、字典结构或关联数组

(2).数组:也称为列表

(3).标量(scalars):单个值

可以去找一些在线YAML转换JSON网站,比如 http://yaml-online-parser.appspot.comopen in new window 通过在线转换可以验证或查看自己所写的YAML是否出错以及哪里出错。

对象

一组键值对,使用冒号隔开key和value。注意,冒号后必须至少一个空格。

name: clay

等价于json:

{
	"name": "clay"
}

数组

---
- Shell
- Perl
- Python

等价于json:

["Shell","Perl","Python"]

也可以使用行内数组(内联语法)的写法:

---
["Shell","Perl","Python"]

再例如:

---
- lang1: Shell
- lang2: Perl
- lang3: Python

等价于json:

[
    {"lang1": "Shell"},
    {"lang2": "Perl"},
    {"lang3": "Python"}
]

将对象和数组混合:

---
languages:
  - Shell
  - Perl
  - Python

等价于json:

{
	"languages": ["Shell","Perl","Python"]
}

字典

---
person1:
  name: clay
  age: 18
  gender: male

person2:
  name: wangchi
  age: 19
  gender: female

等价于json:

{
  "person2": {
    "gender": "female",
    "age": 19,
    "name": "clay"
  },
  "person1": {
    "gender": "male",
    "age": 18,
    "name": "wangchi"
  }
}

也可以使用行内对象的写法:

---
person1: {name: clay, age: 18, gender: male}

复合结构

---
- person1:
  name: clay
  age: 18
  langs:
    - Perl
    - Ruby
    - Shell

- person2:
  name: xiaofanggao
  age: 19
  langs:
    - Python
    - Javascript

等价于json:

[
    {
        "langs": [
        "Perl",
        "Ruby",
        "Shell"
        ],
        "person1": null,
        "age": 18,
        "name": "clay"
    },
    {
        "person2": null,
        "age": 19,
        "langs": [
        "Python",
        "Javascript"
        ],
        "name": "xiaofanggao"
    }
]

字符串续行

字符串可以写成多行,从第二行开始,必须至少有一个单空格缩进。换行符会被转为空格。

str: hello
  world
  hello world

等价于json:

{
  "str": "hello world hello world"
}

也可以使用 > 换行,它类似于上面的多层缩进写法。此外,还可以使用|在换行时保留换行符。

that: >
  Foo
  Bar
this: |
  Foo
  Bar

等价于json:

{'that': 'Foo Bar', 'this': 'Foo\nBar\n'}

参考链接:

https://blog.51cto.com/cloumn/blog/1543