
Некоторый контекст
У меня есть экспортер SNMP, работающий как служба на сервере, который позволяет мне получать доступ к данным некоторых PDU, используя следующий URL: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, вам нужно убедиться, что target
, auth
и module
генерируются как массивы, что просто означает, что они должны быть массивами Puppet на входе. Это означает, что [
и должны быть ]
за пределами кавычек, так как они являются частью синтаксиса языка, а не частью строк, но поскольку Puppet требует, чтобы строки были заключены в кавычки, ваши фактические значения ( и т. д 10.0.1.200
. public_v1
) должны быть заключены в кавычки, в противном случае вы получите ошибки синтаксиса Puppet, о которых сообщаете.
Модуль Puppet Prometheus просто преобразует данные scrape_configs
напрямую в YAML, поэтому массивы Puppet выражаются как массивы YAML, а ошибочные строки Puppet выражаются как строки YAML, даже если вы этого не хотите.