Salt Pillar: Como usar valores diferentes para prod/dev?

Salt Pillar: Como usar valores diferentes para prod/dev?

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:

  1. Quais lacaios são usados
  2. 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_pillarpara 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!

informação relacionada