yaml 中的破折号和缩进

dashes and indentations in yaml

我正在完成“入门”tutorial for Prometheus。我对 YAML 配置文件非常着迷:

scrape_configs:
  - job_name:       'node'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:8080', 'localhost:8081']
        labels:
          group: 'production'

      - targets: ['localhost:8082']
        labels:
          group: 'canary'

显然,连字符应该表示以下两种情况之一:新列表中的第一项,或键值对。

我很难说清楚这里发生了什么。我需要知道我是否要自定义此文件(我已经尝试过并在启动 Prometheus 时收到错误)。

这个文件的逻辑结构是什么?

YAML 文档由三种类型的节点组成:标量、序列和映射。 使用块语法时,每个节点都存在于特定的缩进级别,其中定义了其内容。

这里有一个简单的例子可以更清楚地说明:

-
  a
- 
  b:
    c
-
  -
    d

在缩进级别 0,有连字符定义序列项。因此,顶级节点是一个序列。 在第一个序列项中,有一个 a。它是序列项的一部分,因为它有更多的缩进。 这被解析为标量。

在第二个序列项中,有一个将标量b映射到标量c的映射。我们看到,因为b:是一个隐式key(冒号后接的单行节点),隐式key的出现表明存在一个映射(只是就像序列项的存在表明序列的存在一样)。 cb 的值,因为它再次缩进。

现在 YAML 定义了一个紧凑的符号,您可以在其中将序列指示符视为缩进的一部分。您也可以将某些节点直接放在隐式键之后。这将示例浓缩为:

- a
- b: c
- - d

不过,键 b: 完全独立于序列项指示符 -。现在让我们将其应用到您的文件中:

scrape_configs:
  - job_name:       'node'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    # …

顶层是一个映射,因为有一个隐式键 scrape_configs。它包含一个带有一个项目的序列。这一项是一个映射,从 job_name: 开始。其他键是 scrape_intervalstatic_configsstatic_configs 映射到一系列映射,其中每个映射包含键 targetslabels.

[] 语法是一种用于定义序列的替代语法,通常用于适合单行的短序列。标量可以被引用,这通常在值包含 YAML 特殊符号时完成。例如,在 [] 中逗号开始下一个项目,所以如果你想在你的标量中有一个逗号,你需要引用标量。

所以,底线:连字符和隐式键是独立的结构。不要将连字符视为密钥的一部分。