YAML 语言

YAML 是一种用来表达数据序列的编程语言,它的主要特点包括:可读性强、语法简单明了、支持丰富的语言解析库、通用性强等。Ansible 与 Saltstack 环境中配置文件都以 YAML 格式存在,熟悉 YAML 结构及语法对我们理解两环境的相关配置至关重要。下面的示例定义了在 master 的不同业务环境下文件根路径的描述:

file_roots:
  base:
    - /srv/salt/
  dev:
    - /srv/salt/dev
  prod:
    - /srv/salt/prod

本节主要通过 YAML 描述与 Python 的对应关系,从而方便读者了解 YAML 的层次及结构,最常见的是映射到 Python 中的列表(List)、字典(Dictionary)两种对象类型。下面通过块序列与块映射的示例详细说明。

块序列描述

块序列就是将描述的元素序列到 Python 的列表(List)中。以下代码演示了 YAML 与 Python 的对应关系:

import yaml

obj = yaml.load(
    """
- Hesperiidae
- Papilionidae
- Apatelodidae
- Epiplemidae
    """)
print(obj)

本例中引用 “-” 来分隔列表中的每个元素,运行结果如下:

['Hesperiidae', 'Papilionidae', 'Apatelodidae', 'Epiplemidae']

YAML 也存在类似于 Python 块的概念,例如:

-
    - Hesperiidae
    - Papilionidae
    - Apatelodidae
    - Epiplemidae
-
    - China
    - USA
    - Japan

对应的 Python 结果为:

[['Hesperiidae',  'Papilionidae',  'Apatelodidae',  'Epiplemidae'],  ['China','USA', 'Japan']]

块映射描述

块映射就是将描述的元素序列到 Python 的字典(Dictionary)中,格式为“键(key):值(value)”,以下为 YAML 例子:

hero:
  hp: 34
  sp: 8
  level: 4
orc:
  hp: 12
  sp: 0
  level: 2

对应的 Python 结果为:

{'hero': {'hp': 34, 'sp': 8, 'level': 4}, 'orc': {'hp': 12, 'sp': 0, 'level': 2}}

当然,YAML 块序列与块映射是可以自由组合在一起的,它们之间可以相互嵌套,通过非常灵活的组合,可以帮助我们描述更加复杂的对象属性,例如:

- hero:
    hp: 34
    sp: 8
    level: 4
- orc:
    hp:
        -12
        -30
    sp: 0
    level: 2

对应的 Python 结果为:

[{'hero': {'hp': 34, 'sp': 8, 'level': 4}}, {'orc': {'hp': [12, 30], 'sp': 0,'level': 2}}]