Я не уверен, правильно ли я об этом думаю, но вот моя проблема:
Я хочу использовать одно и то же состояние Salt и конфигурацию Pillar для серверов production, development и test. Единственное отличие должно быть:
- Какие миньоны используются
- Значения ключей 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!