Я не уверен, правильно ли я думаю об этом, но вот моя проблема:
Я хочу использовать одно и то же состояние 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
Возможно ли что-то подобное, или я неправильно использую соль?
Спасибо!
РЕДАКТИРОВАТЬ, чтобы добавить некоторую информацию:
Я использую 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!