一些背景
我有一个 SNMP 导出器作为服务在服务器上运行,它允许我使用以下 URL 访问某些 PDU 的数据:http://my.host.name:9116/snmp?target=10.0.1.200&auth=public_v1&module=apcups
我有一个 Prometheus 服务器,我在同一主机上使用 puppet 配置了该服务器。我想添加一个抓取作业来检索 PDU 提供的信息。
依靠本页上的教程和其他一些来源,我能够确认手动修改文件/etc/prometheus/prometheus.yaml
以插入以下内容可以给我带来预期的结果。为了简短起见,我只包含配置文件的相关部分。
- job_name: snmp_scrapper
scrape_interval: 60s
scrape_timeout: 10s
metrics_path: /snmp
static_configs:
- targets:
- my.host.name:9116
params:
target: [10.0.1.200] # IP of the PDU on the private network
auth: [public_v1] # authentication method
module: [apcups] # module to retrieve APC PDU/UPS information
这完全符合我的预期,我可以在 Prometheus 和 Grafana 等中绘制我的功耗。
我的问题
为了配置 Puppet 来生成上面的 prometheus 配置,我在配置了 prometheus 的配置文件中添加了以下作业(我还有另一项作业在许多主机上抓取 node_exporter,我可以从中获得灵感):
{
'job_name' => 'snmp_scrapper',
'scrape_interval' => '60s',
'scrape_timeout' => '10s',
'metrics_path' => '/snmp',
'static_configs' => [{ 'targets' => ['my.host.name:9116'], }],
'params' => {
'target' => '[10.0.1.200]',
'auth' => '[public_v1]',
'module' => '[apcups]',
}
},
问题是这会产生prometheus.yaml
下面的错误文件,其中metrics_path
和 的三个元素周围有额外的引号params
。
- job_name: snmp_scrapper
scrape_interval: 60s
scrape_timeout: 10s
metrics_path: "/snmp"
static_configs:
- targets:
- my.host.name:9116
params:
target: "[10.0.1.200]"
auth: "[public_v1]"
module: "[apcups]"
Prometheus 的配置解析器失败并出现以下错误:
FAILED: parsing YAML file /etc/prometheus/prometheus.yaml20231023-1016214-j3iqrx: yaml: unmarshal errors:
line 47: cannot unmarshal !!str `[10.0.1...` into []string
line 48: cannot unmarshal !!str `[public...` into []string
line 49: cannot unmarshal !!str `[apcups]` into []string
天真地,我认为删除参数/snmp
中方括号周围的引号可以解决我的问题,即:
'job_name' => 'snmp_scrapper',
'scrape_interval' => '60s',
'scrape_timeout' => '10s',
'metrics_path' => /snmp,
'static_configs' => [{ 'targets' => ['my.host.name:9116'], }],
'params' => {
'target' => [10.0.1.200],
'auth' => [public_v1],
'module' => [apcups],
但这会导致 Puppet 语法错误。
我的问题
如何通过 Puppet 获得/etc/prometheus/prometheus.yaml
此问题顶部所需的显示?我的猜测是一定有某种语法允许生成不带引号的文本字符串,但我不知道如何。
我正在使用 Puppet 版本 8.2.0 和puppet/prometheus v13.3.0 模块。
你已经完成了一半 - 你不想删除引号,而是移动它们:
在 YAML 和 Puppet DDL 中,
[
and]
表示数组,在本例中为字符串数组;target: [10.0.1.200]
YAML 中是包含单个字符串 ( ) 的单元素数组10.0.1.200
,也可以写为:要生成正确的 Prometheus 配置,您需要确保
target
、auth
和module
生成为数组,这意味着它们在传入时必须是 Puppet 数组。这意味着在引号之外包含 和[
,]
因为它们是语言语法而不是字符串的一部分,但是因为 Puppet 需要引用字符串,所以需要引用您的实际值( 等),否则您会收到报告的 Puppet 语法错误10.0.1.200
。public_v1
Puppet Prometheus 模块只是
scrape_configs
直接转换为 YAML,因此 Puppet 数组表示为 YAML 数组 - 并且错误的 Puppet 字符串会表示为 YAML 字符串,即使您不希望它们如此。