我不確定我是否以正確的方式思考這個問題,但這是我的問題:
我想對生產、開發和測試伺服器使用相同的 Salt 狀態和支柱配置。唯一的區別應該是:
- 使用哪些小兵
- 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 訊息!