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

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

Спасибо!

EDIT , чтобы добавить некоторую информацию:

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

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

0
задан 24 August 2020 в 19:05
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!

0
ответ дан 27 August 2020 в 13:23

Теги

Похожие вопросы