Назад | Перейти на главную страницу

Salt Pillar: как использовать разные значения для prod / dev?

Я не уверен, правильно ли я думаю об этом, но вот моя проблема:

Я хочу использовать одно и то же состояние Salt и конфигурацию опоры для рабочих серверов, серверов разработки и тестирования. Единственная разница должна быть:

  1. Какие миньоны используются
  2. Значения ключей Pillar, такие как пароли или имена пользователей.

Я мог бы пойти дальше и создать разные среды Pillar, но это привело бы к разделению файлов sls, что, в свою очередь, означает, что конфигурации могут расходиться. Другой подход - использовать разные ветки git, по одной для каждой среды. Но я полагаю, что это приведет к множеству конфликтов слияния.

Если кажется, что проблема сводится к тому, что мои файлы столбов имеют структуру. Например, мой файл столба для серверов с collectd включен:

#!yaml|gpg

collectd:
  host:
    ip: 1.2.3.4
    port: 123
    username: my_username
    password: |
      -----BEGIN PGP MESSAGE-----
      ...
      -----END PGP MESSAGE-----

Я хотел бы иметь возможность использовать этот файл для всех моих сред, только с разными значениями, например:

#!yaml|gpg

collectd:
  host:
    ip: $HOST_COLLECTD
    port: 123
    username: $USER_COLLECTD
    password: $PASS_COLLECTD

Возможно ли что-то подобное, или я неправильно использую соль?

Спасибо!

РЕДАКТИРОВАТЬ, чтобы добавить некоторую информацию:

Я использую git_pillar чтобы получить файлы прямо из git. Это позволяет мне иметь несколько сред без создания нескольких каталогов, поскольку каждая ветвь может быть средой. На решение Я могу думать об использовании шаблонов для проверки saltenv. Это кажется немного взломанным, но сейчас будет делать то, что я хочу:

#!yaml|gpg

collectd:
  host:
    ip: 1.2.3.4
    port: 123
    username: my_username
    password: |
      {% if saltenv == 'dev' %}
      -----BEGIN PGP MESSAGE-----
      ...
      -----END PGP MESSAGE-----
      {% else %}
      -----BEGIN PGP MESSAGE-----
      ...
      -----END PGP MESSAGE-----
      {% endif %}

Я все еще ищу более эффективные способы решения моей проблемы, хотя

Хотя я не очень доволен результатом, я хочу опубликовать то, что использую сейчас, для тех, кто сталкивается с той же проблемой.

Вверху каждого файла, для которого требуются разные значения в зависимости от среды, я объявляю переменные jinja. Это по-прежнему означает, что в каждом файле есть некоторая самокодируемая логика, но, по крайней мере, фактическая структура данных столбца легко понять. Он имеет некоторые проблемы с форматированием, но работает со всем, что мне нужно. Вот пример:

#!jinja|yaml|gpg

{# Set values based on saltenv #}
{% if saltenv == 'test' %}
  {% set ip = 1.2.3.4 %}
  {% set username = 'user_test'%}
  {% set password = '
      -----BEGIN PGP MESSAGE-----
      ...
      -----END PGP MESSAGE-----'%}
{% elif saltenv == 'production' %}
  {% set ip = 5.6.7.8 %}
  {% set username = 'user_prod' %}
  {% set password = '
      -----BEGIN PGP MESSAGE-----
      ...
      -----END PGP MESSAGE-----'%}
{% else %}
  {{ raise('Invalid / Unknown saltenv:' ~ saltenv)}}
{% endif %}

collectd:
  host:
    ip: {{ ip }}
    port: 123
    username: {{ username }}
    password: |- {{ password }}

Вы должны быть очень осторожны с отступом многострочных строк, таких как сообщение PGP!