YAML 自学入门YAML Tutorial
语法样式
YAML 与 JSON 和 XML 类似,均为 描述数据的语言,用来存储结构化数据。
YAML 跟 JSON 更类似,但比 JSON 更简洁,更灵活。
用途
YAML 多用于当做程序的配置文件。
Docker,Kubernetes,Travis CI 等 都有大篇幅使用该格式 作为 配置文件格式之一。
Overview概览
文档组成元素
YAML 基本由 Scalar / Sequence / Map 组合而成
样例
由 Scalar 组成的 yaml 文件
1 zzax.io
代表文件里有个字符串。
对应 json
"zzax.io"
注意,在 json 里,只能以 数组和映射 作为文档 根节点。但在 YAML 里,可以使用 Scalar 作为根节点
由 Sequence 组成的 yaml 文件
1 2 3 - xml - json - yaml
代表文件里有个数组,数组里是字符串
对应 json
["xml", "json", "yaml"]
由 Map 组成的 yaml 文件
1 2 name: ZZAXurl: zzax.io
代表文件里有个映射,映射的键和值均是字符串
对应 json
{
"name": "ZZAX",
"url": "zzax.io"
}
一个自由组合的 yaml 文件
下面是 Kubernetes yaml 配置文件的一部分
1 2 3 4 5 6 spec: containers: - name: webapp image: zzax/docker-http-server:latest ports: - containerPort: 80
对应 json
{ "spec": { "containers": { [ { "name": "webapp" "image": "zzax/docker-http-server:latest" "ports": [ { "containerPort": 80 } ] } ] } } }
注释
可以使用 #
引导单行注释
1 2 name: ZZAX #最棒url: zzax.io
等效于
1 2 name: ZZAXurl: zzax.io
Scalar纯量 / 单元素
纯量的种类
纯量可以为
整数
1 9
小数
1 9.917
布尔值
1 true
或
1 false
字符串
1 zzax.io
空
1 null
String字符串
不用加引号
yaml 中的 字符串无需加引号。你也可以加
1 zzax
1 "zzax"
1 'zzax'
以上三个 均 等效于 JSON 中的
"zzax"
换行为空格
1 2 zzax document
等效于
"zzax document"
换行为换行
增加 |
符号后,后面的字符串会变为换行为真的换行
1 2 3 |zzax doc
等效于
"zzax\ndoc"
Sequence序列 / 数组
基本表达
对于这样的数据结构:
[
"zzax",
"doc"
]
你可以使用 以下几种写法 在 yaml 里表达
类似 json 的写法 单行(还好)
1 [zzax, doc]
类似 json 的写法 多行(不推荐)
1 2 3 4 [ zzax, doc]
简约写法 (推荐)
1 2 - zzax - doc
这两个 -
必须对齐,否则会有别的意义。
简约写法 换行缩进
1 2 3 4 - zzax - doc
第 2 4 行,必须相对 1 3 行 有至少一个 空格 作为 缩进。
一般采用 2 个空格作为缩进。
元素类型无需一致
1 2 - zzax- 9917
对应 json
["zzax", 9917]
Map映射
基本表达
对于这样的数据结构:
{
"name": "ZZAX Doc"
"url": "doc.zzax.io"
}
你可以使用 以下几种写法 在 yaml 里表达
类似 json 的写法 单行 (不推荐)
1 { name: zzax doc, url: doc.zzax.io }
类似 json 的写法 多行 (不推荐)
1 2 3 4 { name: zzax doc, url: doc.zzax.io }
简约写法 单行 (推荐)
1 2 name: zzax doc url: doc.zzax.io
这两行的开头 必须对齐,否则为非法 yaml 文档。
简约写法 换行缩进
1 2 3 4 name: zzax doc url: doc.zzax.io
第 2 4 行,必须相对 1 3 行 有至少一个 空格 作为 缩进。
一般采用 2 个空格作为缩进。
元素类型无需一致
1 2 url: doc.zzax.ioport: 9917
对应 json
{
"url": "zzax",
"port": 9917
}
元素嵌套
Sequence 和 Map 的 元素 均可以为 任意 Scalar / Sequence / Map
Sequence 嵌套 Sequence
1 2 3 4 - zzax- - 9917 - 8080
上面(推荐)或者 下面(不推荐)的合并 写法
1 2 3 - zzax- - 9917 - 8080
均 等效于 JSON 的
[
"zzax",
[
9917,
8080
]
]
Sequence 嵌套 Map
1 2 3 4 5 6 - x: 3 y: 4- x: 5 y: 6
上面(还好)或者 下面(推荐)的合并 写法
1 2 3 4 - x: 3 y: 4- x: 5 y: 6
均 等效于 JSON 的
[
{
"x": 3,
"y": 4
},
{
"x": 5,
"y": 6
}
]
Map 嵌套 Map
1 2 3 4 5 6 left: x: 3 y: 4right: x: 5 y: 6
等效于 JSON 的
{
"left": {
"x": 3,
"y": 4
},
"right": {
"x": 5,
"y": 6
}
}
Map 嵌套 Sequence
1 2 3 4 5 ports: - 80devPorts: - 9917 - 8080
上面(推荐)或者 下面(不推荐)的省略缩进 写法
1 2 3 4 5 ports: - 80devPorts: - 9917- 8080
均 等效于 JSON 的
{
"ports": [
80
],
"devPorts": [
9917,
8080
]
}
案例
Kubernetes 配置案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2kind: Deploymentmetadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
Travis CI 配置样例
1 2 3 4 5 6 7 8 9 language: node_jsnode_js: - "7"before_install: - "curl -L https://raw.githubusercontent.com/arunoda/travis-ci-laika/6a3a7afc21be99f1afedbd2856d060a02755de6d/configure.sh | /bin/sh"services: - mongodbenv: - LAIKA_OPTIONS="-t 5000"