YAML介绍
YAML是一个可读性高的用来表达资料系列的格式。YAML参考了其他多种语言,包括XML,C语言,Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。
YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。其特性:
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
语法规则
它的基本语法规则如下:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用 Tab 键,只允许使用空格
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
基本的 YAML
对于 Ansible, 每一个 YAML 文件都是从一个列表开始. 列表中的每一项都是一个键值对, 通常它们被称为一个 “哈希” 或 “字典”. 所以, 我们需要知道如何在 YAML 中编写列表和字典.
YAML 还有一个小的怪癖. 所有的 YAML 文件(无论和 Ansible 有没有关系)开始行都应该是 ---. 这是 YAML 格式的一部分, 表明一个文件的开始.
---
# 一个美味水果的列表
- Apple
- Orange
- Strawberry
- Mango
一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格):
---
# 一位职工的记录
name: Example Developer
job: Developer
skill: Elite
字典也可以使用缩进形式来表示, 如果你喜欢这样的话:
---
# 一位职工的记录
{name: Example Developer, job: Developer, skill: Elite}
Ansible并不是太多的使用这种格式, 但是你可以通过以下格式来指定一个布尔值(true/fase):
---
create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false
组合
---
# 一位职工记录
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
ruby: Elite
python: Elite
dotnet: Lame
Gotchas
语法错误
foo: somebody said I should put a colon here: so I did
正确的是使用引号来包裹任何包含冒号的哈希值
foo: "somebody said I should put a colon here: so I did"
此外, Ansible 使用 “{{ var }}” 来引用变量. 如果一个值以 “{” 开头, YAML 将认为它是一个字典, 所以我们必须引用它, 像这样:
foo: "{{ variable }}"
也可以将key:value放置于{}中进行表示,例如:
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
这里#也代表注释
数据合并
为了维持文件的简洁,并避免数据输入的错误,YAML提供了结点参考(*)和散列合并(<<)参考到其他结点标签的锚点标记(&)。参考会将树状结构加入锚点标记的内容,并可以在所有数据结构中运作(可以参考上面"ship-to"的示例)合并只有散列表可以使用,可以将键值自锚点标记复制到指定的散列表中。
当数据被instantiate合并和参考会被剖析器自动展开。
---
- step: &id001 # 定义锚点 &id001
instrument: Lasik 2000
pulseEnergy: 5.4
pulseDuration: 12
repetition: 1000
spotSize: 1mm
- step:
<<: *id001 # 合併鍵值:使用在锚点定义标记的內容
spotSize: 2mm # 覆盖"spotSize"键值
- step:
<<: *id001 # 合并键值:使用在锚点定义标记的內容
pulseEnergy: 500.0 # 覆盖键值
alert: > # 加入其他键值
warn patient of
audible pop
数据类型
---
a: 123 # 整数
b: "123" # 字串(使用双括号)
c: 123.0 # 浮点数
d: !!float 123 # 浮点数,使用!!表达的严格形态
e: !!str 123 # 字串,使用严格形态
f: !!str Yes # 字串,使用严格形态
g: Yes # 布林值"真"
h: Yes we have No bananas # 字串(包含"Yes"和"No")
在 YAML 中用 ~ 符号来表示 Null 字符
YAML 中的字符串可以用单引号(''),也可用双引号(""),也可以不用引号来表示
至于区别是在双引号里可以实别转义字符,在单引号里不行
# 这里是 yaml.ym 文件
string1: "abcd\nefg"
string2: 'abcd\nefg'
string3: abcd\nefg
# 这是解析后的内容
[root@localhost www.study.com]# php index.php
Array
(
[string1] => abcd
efg
[string2] => abcd\nefg
[string3] => abcd\nefg
一般情况下,我们用 YAML 就是做配置文件,也不会涉及转义,可以直接不用引号就行。如果字符串太长,也可以直接换行,但是新行前要有空格