Salt Pillar: prod / dev に異なる値を使用するにはどうすればいいですか?

Salt Pillar: prod / dev に異なる値を使用するにはどうすればいいですか?

これについて私が正しい考え方をしているかどうかはわかりませんが、私の問題は次のとおりです。

運用、開発、テストの各サーバーに同じ Salt 状態とピラー構成を使用したいと考えています。唯一の違いは次のとおりです。

  1. どのミニオンが使用されるか
  2. パスワードやユーザー名などのピラーキーの値

先に進んで異なる 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

このようなことは可能でしょうか、それとも私が Salt を間違った方法で使用しているのでしょうか?

ありがとう!

編集情報を追加します:

私はgit_pillargitから直接ファイルを取得するために使用しています。これにより、各ブランチが環境になるので、複数のディレクトリを作成せずに複数の環境を持つことができます。解決私が思いつくのは、テンプレートを使用して をチェックすることです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 メッセージのような複数行の文字列のインデントには十分注意する必要があります。

関連情報