Я не уверен, правильно ли я думаю об этом, но вот моя проблема:
Я хочу использовать одно и то же состояние Salt и конфигурацию опоры для рабочих серверов, серверов разработки и тестирования . Единственная разница должна заключаться в следующем:
Я мог бы продолжить и создать разные среды 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 %}
Я все еще ищу лучшие способы решения моей проблемы, хотя
Хотя я не совсем доволен результатом, я хочу опубликовать то, что я сейчас использую, для тех, кто столкнется с той же проблемой.
В начале каждого файла, которому требуются разные значения в зависимости от окружения, я объявляю переменные 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!