yaml 中的破折号和缩进

roc*_*ves 8 yaml prometheus

我正在阅读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'

Run Code Online (Sandbox Code Playgroud)

因此,显然连字符应该指示两件事之一:新列表中的第一项,或键值对。

  • 所以看起来job_name: 'node'是一个键值对。那么为什么它后面的所有内容都是缩进的呢?

  • targets看起来也像一个键值对。但也是如此labels,而且没有连字符。此外,group是从 缩进一个空格labels

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

这个文件的逻辑结构是怎样的?

fly*_*lyx 11

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

\n

这是一个简单的例子,可以让它更清楚:

\n
-\n  a\n- \n  b:\n    c\n-\n  -\n    d\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

现在,YAML 定义了一种紧凑的表示法,您可以将序列指示符视为缩进的一部分。您还可以将某些节点直接放置在隐式键之后。这将示例压缩为:

\n
- a\n- b: c\n- - d\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
scrape_configs:\n  - job_name:       \'node\'\n\n    # Override the global default and scrape targets from this job every 5 seconds.\n    scrape_interval: 5s\n    # \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n