YAML 语法

此页面提供了有关正确 YAML 语法的基本概述,该语法是 Ansible 剧本(我们的配置管理语言)的表达方式。

我们使用 YAML,因为它比其他常见数据格式(如 XML 或 JSON)更易于人类阅读和编写。此外,大多数编程语言中都有用于处理 YAML 的库。

您可能还想同时阅读 使用剧本,以了解它在实践中的应用方式。

YAML 基础

对于 Ansible,几乎每个 YAML 文件都以列表开头。列表中的每个项目都是键值对列表,通常称为“哈希”或“字典”。因此,我们需要知道如何在 YAML 中编写列表和字典。

YAML 还有一个小的怪癖。所有 YAML 文件(无论是否与 Ansible 相关)都可以选择以 --- 开头,以 ... 结尾。这是 YAML 格式的一部分,表示文档的开始和结束。

列表的所有成员都是以相同缩进级别开头的行,以 "- "(破折号和空格)开头。

---
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
...

字典以简单的 key: value 形式表示(冒号后必须紧跟空格)。

# An employee record
martin:
  name: Martin D'vloper
  job: Developer
  skill: Elite

可以创建更复杂的数据结构,例如字典列表,其值为列表或两者混合。

# Employee records
- martin:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
- tabitha:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang

如果您确实想要,字典和列表也可以以缩写形式表示。

---
martin: {name: Martin D'vloper, job: Developer, skill: Elite}
fruits: ['Apple', 'Orange', 'Strawberry', 'Mango']

这些称为“流集合”。

Ansible 并不经常使用它们,但您也可以指定一个 布尔值(true/false)以多种形式。

create_key: true
needs_agent: false
knows_oop: True
likes_emacs: TRUE
uses_cvs: false

如果您希望与默认的 yamllint 选项兼容,请在字典中使用小写“true”或“false”作为布尔值。

可以使用 |> 将值跨多行。使用“文字块标量” | 跨多行将包含换行符和任何尾随空格。使用“折叠块标量” > 将换行符折叠为空格;它用于使原本非常长的行更易于阅读和编辑。无论哪种情况,缩进都会被忽略。示例如下:

include_newlines: |
            exactly as you see
            will appear these three
            lines of poetry

fold_newlines: >
            this is really a
            single line of text
            despite appearances

虽然在上面的 > 示例中所有换行符都被折叠为空格,但有两种方法可以强制保留换行符。

fold_some_newlines: >
    a
    b

    c
    d
      e
    f

或者,可以通过包含换行符 \n 字符来强制执行。

fold_same_newlines: "a b\nc d\n  e\nf\n"

让我们在任意 YAML 示例中组合我们到目前为止学到的知识。这与 Ansible 没有任何关系,但可以让你了解这种格式。

---
# An employee record
name: Martin D'vloper
job: Developer
skill: Elite
employed: True
foods:
  - Apple
  - Orange
  - Strawberry
  - Mango
languages:
  perl: Elite
  python: Elite
  pascal: Lame
education: |
  4 GCSEs
  3 A-Levels
  BSc in the Internet of Things

这就是你开始编写 Ansible 剧本所需的关于 YAML 的所有知识。

注意事项

虽然你可以将几乎任何东西放入未引用的标量中,但也有一些例外。冒号后跟空格(或换行符)": " 是映射的指示符。空格后跟井号 " #" 表示注释的开始。

因此,以下将导致 YAML 语法错误。

foo: somebody said I should put a colon here: so I did

windows_drive: c:

…但这样可以工作。

windows_path: c:\windows

您需要使用冒号后跟空格或行尾来引用哈希值。

foo: 'somebody said I should put a colon here: so I did'

windows_drive: 'c:'

…然后冒号将被保留。

或者,您可以使用双引号。

foo: "somebody said I should put a colon here: so I did"

windows_drive: "c:"

单引号和双引号之间的区别在于,在双引号中,您可以使用转义符。

foo: "a \t TAB and a \n NEWLINE"

允许的转义符列表可以在 YAML 规范的“转义序列”(YAML 1.1)或“转义字符”(YAML 1.2)中找到。

以下是无效的 YAML。

foo: "an escaped \' single quote"

此外,Ansible 使用“{{ var }}”作为变量。如果冒号后的值以“{”开头,YAML 会认为它是一个字典,因此您必须对其进行引用,如下所示。

foo: "{{ variable }}"

如果您的值以引号开头,则必须引用整个值,而不仅仅是部分。以下是一些有关如何正确引用事物的其他示例。

foo: "{{ variable }}/additional/string/literal"
foo2: "{{ variable }}\\backslashes\\are\\also\\special\\characters"
foo3: "even if it is just a string literal it must all be quoted"

无效。

foo: "E:\\path\\"rest\\of\\path

除了 '" 之外,还有许多字符是特殊的(或保留的),不能用作未引用的标量的第一个字符:[] {} > | * & ! % # ` @ ,

您还应该注意 ? : -。在 YAML 中,如果非空格字符紧随其后,则它们可以在字符串的开头使用,但 YAML 处理器实现会有所不同,因此最好使用引号。

在流集合中,规则更加严格。

a scalar in block mapping: this } is [ all , valid

flow mapping: { key: "you { should [ use , quotes here" }

布尔值转换很有用,但当您想要将文字“yes”或其他布尔值作为字符串使用时,这可能会成为问题。在这些情况下,只需使用引号即可。

non_boolean: "yes"
other_string: "False"

YAML 将某些字符串转换为浮点值,例如字符串“1.0”。如果您需要指定版本号(例如在 requirements.yml 文件中),则如果它看起来像浮点值,您需要引用该值。

version: "1.0"

另请参阅

使用剧本

了解剧本的功能以及如何编写/运行它们。

YAMLLint

YAML Lint(在线)可以帮助您调试 YAML 语法,如果您遇到问题。

维基百科 YAML 语法参考

YAML 语法的好指南。

邮件列表

有问题吗?需要帮助?有想法吗?请访问 Google Groups 上的邮件列表。

实时聊天

如何加入 Ansible 聊天频道(加入 #yaml 以获取有关 yaml 的特定问题)。

YAML 1.1 规范

YAML 1.1 的规范,PyYAML 和 libyaml 目前正在实现该规范。

YAML 1.2 规范

为了完整起见,YAML 1.2 是 1.1 的后续版本。