Salt Pillar: ¿Cómo utilizar diferentes valores para prod/dev?

Salt Pillar: ¿Cómo utilizar diferentes valores para prod/dev?

No estoy seguro de si estoy pensando en esto de la manera correcta, pero aquí está mi problema:

Quiero usar la misma configuración de pilar y estado de Salt para servidores de producción, desarrollo y prueba. La única diferencia debería ser:

  1. ¿Qué minions se utilizan?
  2. Los valores de las claves de Pillar, como contraseñas o nombres de usuario.

Podría seguir adelante y crear diferentes entornos de Pillar, pero esto daría lugar a archivos sls separados, lo que a su vez significa que las configuraciones podrían separarse. Otro enfoque sería utilizar diferentes ramas de git, una para cada entorno. Pero imagino que esto daría lugar a muchos conflictos de fusión.

Si siento que el problema se reduce a que mis archivos pilares tienen estructura. Por ejemplo, mi archivo pilar para servidores que tienen collectdhabilitado:

#!yaml|gpg

collectd:
  host:
    ip: 1.2.3.4
    port: 123
    username: my_username
    password: |
      -----BEGIN PGP MESSAGE-----
      ...
      -----END PGP MESSAGE-----

Me encantaría poder usar este archivo para todos mis entornos solo con valores diferentes, así:

#!yaml|gpg

collectd:
  host:
    ip: $HOST_COLLECTD
    port: 123
    username: $USER_COLLECTD
    password: $PASS_COLLECTD

¿Es posible algo como esto o estoy usando Salt de manera incorrecta?

¡Gracias!

EDITAR, para agregar alguna información:

Estoy usando git_pillarpara obtener los archivos directamente desde git. Esto me permite tener múltiples entornos sin crear múltiples directorios, ya que cada rama puede ser un entorno. EnsoluciónSe me ocurre usar plantillas para verificar el archivo saltenv. Esto parece un poco complicado, pero haría lo que quiero por ahora:

#!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 %}

Sin embargo, todavía estoy buscando mejores formas de resolver mi problema.

Respuesta1

Si bien no estoy del todo satisfecho con el resultado, quiero publicar lo que estoy usando ahora para otras personas que se topan con el mismo problema.

En la parte superior de cada archivo que necesita valores diferentes según el entorno, declaro variables jinja. Todavía significa que hay cierta lógica autocodificada en cada archivo, pero al menos la estructura real de los datos del pilar es fácil de entender. Viene con algunos desafíos de formato, pero funciona para todo lo que necesito. Aquí hay un ejemplo:

#!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 }}

¡Hay que tener mucho cuidado con la sangría de cadenas multilínea como el mensaje PGP!

información relacionada