Файл конфигурации Prometheus с Puppet: как обрабатывать кавычки и скобки в файле конфигурации yaml?

Я пытаюсь написать конфигурацию Prometheus с этим модулем: https://github.com/voxpupuli/puppet-prometheus

Но я не могу заставить его сгенерировать действительный конфигурационный файл для Prometheus.

Это соответствующая часть моей текущей конфигурации:

'relabel_configs' => [
  {
    'source_labels' => '[__meta_consul_node]',
    'regex'         => '^(.*)$',
    'target_label'  => 'instance',
    'replacement'   => '$1',
  },
  {
    'source_labels' => '[__meta_consul_service]',
    'regex'         => '^(.*)$',
    'target_label'  => 'job',
    'replacement'   => '$1',
  }
],

Вот что я получаю в моем prometheus.yml:

relabel_configs:
  - source_labels: '[__meta_consul_node]'
    regex: ^(.*)$
    target_label: instance
    replacement: $1
  - source_labels: '[__meta_consul_service]'
    regex: ^(.*)$
    target_label: job
    replacement: $1

Что я хочу это:

relabel_configs:
  - source_labels: ['__meta_consul_node']
    regex: '^(.*)$'
    target_label: 'instance'
    replacement: '$1'
  - source_labels: ['__meta_consul_service']
    regex: '^(.*)$'
    target_label: 'job'
    replacement: '$1'

Я перепробовал кучу вещей, но не смог понять, как отформатировать хеш-значения в моем манифесте, чтобы получить правильный файл конфигурации для Прометея.

Это похоже на проблему с анализатором ruby? Как мне избежать ' правильно?

1 ответ

Решение

Я думаю, что путаница заключается в том, как обрабатываются переменные массивы в Puppet и в YAML, и как строки анализируются в YAML.

В YAML переменные массивы могут быть:

array:
- element
- another_element

или же:

array: [element, another_element]

В Puppet они выглядят так:

$array = [element, another_element]

Следовательно, вы можете иметь чистое взаимно однозначное сопоставление массивов, просто указав массив строк в хеше Puppet для source_labels ключ как:

'relabel_configs' => [
  {
    'source_labels' => ['__meta_consul_node'], # single element string array
    'regex'         => '^(.*)$',
    'target_label'  => 'instance',
    'replacement'   => '$1',
  },
  {
    'source_labels' => ['__meta_consul_service'], # single element string array
    'regex'         => '^(.*)$',
    'target_label'  => 'job',
    'replacement'   => '$1',
  }
],

и это правильно сгенерирует массив строк для вашего source_labels как вы описали для того, что вы хотели.

relabel_configs:
  - source_labels: ['__meta_consul_node'] # single element string array
    regex: ^(.*)$
    target_label: instance
    replacement: $1
  - source_labels: ['__meta_consul_service'] # single element string array
    regex: ^(.*)$
    target_label: job
    replacement: $1

Обратите внимание, что YAML будет анализироваться одинаково для строк в кавычках и без кавычек (например, target_label: job такой же как target_label: 'job').

Другие вопросы по тегам