Salt Pillar:如何為 prod / dev 使用不同的值?

Salt Pillar:如何為 prod / dev 使用不同的值?

我不確定我是否以正確的方式思考這個問題,但這是我的問題:

我想對生產、開發和測試伺服器使用相同的 Salt 狀態和支柱配置。唯一的區別應該是:

  1. 使用哪些小兵
  2. Pillar 金鑰的值,例如密碼或使用者名

我可以繼續創建不同的 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

這樣的事情可能嗎,還是我使用鹽的方式錯誤?

謝謝!

編輯,添加一些資訊:

我用來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 訊息!

相關內容