Não tenho certeza se estou pensando nisso da maneira certa, mas aqui está o meu problema:
Quero usar o mesmo estado Salt e configuração de pilar para servidores de produção, desenvolvimento e teste. A única diferença deveria ser:
- Quais lacaios são usados
- Os valores das chaves do Pilar, como senhas ou nomes de usuário
Eu poderia prosseguir e criar ambientes Pillar diferentes, mas isso levaria a arquivos sls separados, o que, por sua vez, significaria que as configurações poderiam se separar. Outra abordagem seria usar diferentes ramificações git, uma para cada ambiente. Mas imagino que isso levaria a muitos conflitos de fusão.
Se achar que o problema se resume ao fato de meus arquivos pilares terem estrutura. Por exemplo, meu arquivo pilar para servidores habilitados collectd
:
#!yaml|gpg
collectd:
host:
ip: 1.2.3.4
port: 123
username: my_username
password: |
-----BEGIN PGP MESSAGE-----
...
-----END PGP MESSAGE-----
Eu adoraria poder usar esse arquivo para todos os meus ambientes apenas com valores diferentes, assim:
#!yaml|gpg
collectd:
host:
ip: $HOST_COLLECTD
port: 123
username: $USER_COLLECTD
password: $PASS_COLLECTD
Algo assim é possível ou estou usando o Salt da maneira errada?
Obrigado!
EDITAR, para adicionar algumas informações:
Estou usando git_pillar
para obter os arquivos diretamente do git. Isso me permite ter vários ambientes sem criar vários diretórios, pois cada branch pode ser um ambiente. SobresoluçãoPosso pensar em usar modelos para verificar o arquivo saltenv
. Isso parece um pouco hackeado, mas faria o que eu quero por enquanto:
#!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 %}
Ainda estou procurando maneiras melhores de resolver meu problema, embora
Responder1
Embora não esteja totalmente satisfeito com o resultado, quero postar o que estou usando agora para outras pessoas que se deparam com o mesmo problema.
No topo de cada arquivo que precisa de valores diferentes dependendo do ambiente, declaro variáveis jinja. Isso ainda significa que há alguma lógica autocodificada em cada arquivo, mas pelo menos a estrutura real dos dados do pilar é fácil de entender. Ele vem com alguns desafios de formatação, mas funciona para tudo que preciso. Aqui está um exemplo:
#!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 }}
Você tem que ter muito cuidado com o recuo de strings multilinhas como a mensagem PGP!