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

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

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

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

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

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

Если вы чувствуете, что проблема сводится к моим файлам Pillar, имеющим структуру. Например, мой файл Pillar для серверов, которые 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

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

Спасибо!

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

Я использую 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 %}

Я все еще ищу лучшие способы решения моей проблемы.

решение1

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

В верхней части каждого файла, которому требуются разные значения в зависимости от среды, я объявляю переменные 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!

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