Проблема синтаксиса Puppet при настройке Prometheus scrape на экспортере SNMP

Проблема синтаксиса Puppet при настройке Prometheus scrape на экспортере SNMP

Некоторый контекст

У меня есть экспортер 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, даже если вы этого не хотите.

Связанный контент