我不确定我是否以正确的方式思考这个问题,但这是我的问题:
我想对生产、开发和测试服务器使用相同的 Salt State 和 Pillar 配置。唯一的区别应该是:
- 使用哪些 Minion
- Pillar 键的值,如密码或用户名
我可以继续创建不同的 Pillar 环境,但这会导致 sls 文件分离,进而意味着配置可能会分离。另一种方法是使用不同的 git 分支,每个环境一个。但我想这会导致很多合并冲突。
如果觉得问题归结于我的 pillar 文件具有结构。例如,我的 Pillar 文件针对已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_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 消息!