在 SNMP 导出器上配置 Prometheus 抓取时出现 Puppet 语法问题

在 SNMP 导出器上配置 Prometheus 抓取时出现 Puppet 语法问题

一些背景信息

我在服务器上有一个作为服务运行的 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 语法错误。

我的问题

如何/etc/prometheus/prometheus.yaml通过 Puppet 获得此问题顶部所需的显示?我猜一定有某种语法允许生成不带引号的文本字符串,但我不知道如何做。

我正在使用 Puppet 版本 8.2.0 和木偶/普罗米修斯v13.3.0 模块。

答案1

您已经完成一半了——您不想删除引号,但想移动它们:

'job_name'        => 'snmp_scrapper',
      'scrape_interval' => '60s',
      'scrape_timeout'  => '10s',
      'metrics_path'    => '/snmp',
      'static_configs'  => [{ 'targets' => ['my.example.com:9116'], }],
      'params' => {
        'target' => ['10.0.1.200'],
        'auth' => ['public_v1'],
        'module' => ['apcups'],

在 YAML 和 Puppet DDL 中,[]表示数组,在本例中是字符串数组;target: [10.0.1.200]在 YAML 中是包含单个字符串的单元素数组(10.0.1.200),也可以写成:

      target:
        - 10.0.1.200

要生成正确的 Prometheus 配置,您需要确保targetauthmodule生成为数组,这仅仅意味着它们在进入时需要是 Puppet 数组。这意味着将[]放在引号外面,因为它们是语言语法的一部分而不是字符串的一部分,但是因为 Puppet 要求字符串用引号引起来,所以您的实际值(10.0.1.200public_v1等)也需要用引号引起来,否则您会收到报告的 Puppet 语法错误。

Puppet Prometheus 模块直接转换scrape_configs为 YAML,因此 Puppet 数组表示为 YAML 数组 - 并且错误的 Puppet 字符串会表示为 YAML 字符串,即使您不希望它们这样。

相关内容