
背景
サーバー上でサービスとして実行されている 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.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 の両方で、[
と は]
配列を示します。この場合は文字列の配列です。YAMLtarget: [10.0.1.200]
では、 は単一の文字列 ( 10.0.1.200
) を含む単一要素の配列であり、次のように記述することもできます。
target:
- 10.0.1.200
target
正しい Prometheus 構成を生成するには、、auth
およびが配列として生成されるようにする必要がありますmodule
。つまり、これらは入力時に Puppet 配列である必要があります。つまり、およびは文字列の一部ではなく言語構文の一部であるため、引用符の外側に置く必要があります[
が]
、Puppet では文字列を引用符で囲む必要があるため、実際の値 ( 10.0.1.200
、public_v1
など) を引用符で囲む必要があります。そうしないと、報告されている Puppet 構文エラーが発生します。
Puppet Prometheus モジュールは単純にscrape_configs
YAML に直接変換するため、Puppet 配列は YAML 配列として表現されます。また、誤った Puppet 文字列は、意図しない場合でも YAML 文字列として表現されます。