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

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

我不确定我是否以正确的方式思考这个问题,但这是我的问题:

我想对生产、开发和测试服务器使用相同的 Salt State 和 Pillar 配置。唯一的区别应该是:

  1. 使用哪些 Minion
  2. 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 消息!

相关内容