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

同じホスト上で puppet を使用して構成した Prometheus サーバーがあります。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 などで電力消費をプロットできます。

私の問題

上記の Prometheus 構成を生成するように Puppet を構成するために、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、 の中に 3 つの要素がある以下のような誤ったファイルが生成されることです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.yamlPuppet で取得するにはどうすればよいでしょうか。引用符なしでテキスト文字列を生成できる何らかの構文があるはずだと私は推測しますが、方法がわかりません。

私は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 の両方で、[と は]配列を示します。この場合は文字列の配列です。YAMLtarget: [10.0.1.200]では、 は単一の文字列 ( 10.0.1.200) を含む単一要素の配列であり、次のように記述することもできます。

      target:
        - 10.0.1.200

target正しい Prometheus 構成を生成するには、、authおよびが配列として生成されるようにする必要がありますmodule。つまり、これらは入力時に Puppet 配列である必要があります。つまり、およびは文字列の一部ではなく言語構文の一部であるため、引用符の外側に置く必要があります[]、Puppet では文字列を引用符で囲む必要があるため、実際の値 ( 10.0.1.200public_v1など) を引用符で囲む必要があります。そうしないと、報告されている Puppet 構文エラーが発生します。

Puppet Prometheus モジュールは単純にscrape_configsYAML に直接変換するため、Puppet 配列は YAML 配列として表現されます。また、誤った Puppet 文字列は、意図しない場合でも YAML 文字列として表現されます。

関連情報