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'
显然,连字符应该表示以下两种情况之一:新列表中的第一项,或键值对。
所以看起来job_name: 'node'
是一个键值对。为什么后面的都是缩进的?
targets
看起来也像键值对。但 labels
也是如此,它没有连字符。此外,group
从 labels
.
缩进一个 space
我很难说清楚这里发生了什么。我需要知道我是否要自定义此文件(我已经尝试过并在启动 Prometheus 时收到错误)。
这个文件的逻辑结构是什么?
YAML 文档由三种类型的节点组成:标量、序列和映射。
使用块语法时,每个节点都存在于特定的缩进级别,其中定义了其内容。
这里有一个简单的例子可以更清楚地说明:
-
a
-
b:
c
-
-
d
在缩进级别 0,有连字符定义序列项。因此,顶级节点是一个序列。
在第一个序列项中,有一个 a
。它是序列项的一部分,因为它有更多的缩进。
这被解析为标量。
在第二个序列项中,有一个将标量b
映射到标量c
的映射。我们看到,因为b:
是一个隐式key(冒号后接的单行节点),隐式key的出现表明存在一个映射(只是就像序列项的存在表明序列的存在一样)。 c
是 b
的值,因为它再次缩进。
现在 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_interval
和 static_configs
。 static_configs
映射到一系列映射,其中每个映射包含键 targets
和 labels
.
[]
语法是一种用于定义序列的替代语法,通常用于适合单行的短序列。标量可以被引用,这通常在值包含 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'
显然,连字符应该表示以下两种情况之一:新列表中的第一项,或键值对。
所以看起来
job_name: 'node'
是一个键值对。为什么后面的都是缩进的?
缩进一个 spacetargets
看起来也像键值对。但labels
也是如此,它没有连字符。此外,group
从labels
.
我很难说清楚这里发生了什么。我需要知道我是否要自定义此文件(我已经尝试过并在启动 Prometheus 时收到错误)。
这个文件的逻辑结构是什么?
YAML 文档由三种类型的节点组成:标量、序列和映射。 使用块语法时,每个节点都存在于特定的缩进级别,其中定义了其内容。
这里有一个简单的例子可以更清楚地说明:
-
a
-
b:
c
-
-
d
在缩进级别 0,有连字符定义序列项。因此,顶级节点是一个序列。
在第一个序列项中,有一个 a
。它是序列项的一部分,因为它有更多的缩进。
这被解析为标量。
在第二个序列项中,有一个将标量b
映射到标量c
的映射。我们看到,因为b:
是一个隐式key(冒号后接的单行节点),隐式key的出现表明存在一个映射(只是就像序列项的存在表明序列的存在一样)。 c
是 b
的值,因为它再次缩进。
现在 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_interval
和 static_configs
。 static_configs
映射到一系列映射,其中每个映射包含键 targets
和 labels
.
[]
语法是一种用于定义序列的替代语法,通常用于适合单行的短序列。标量可以被引用,这通常在值包含 YAML 特殊符号时完成。例如,在 []
中逗号开始下一个项目,所以如果你想在你的标量中有一个逗号,你需要引用标量。
所以,底线:连字符和隐式键是独立的结构。不要将连字符视为密钥的一部分。