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"
广告

ZZAX 微信公众

文档一更新,立刻告诉你