Saltstack 和使状态通用

Saltstack and making states generic

需要一些帮助,因为我现在有点卡住了。最终目标是拥有一个通用的状态,并允许我们将我们的 pem 证书文件推送到任何需要它的服务器以及每个服务器的不同目录。我希望这是有道理的。换句话说,我不希望每个服务器都有一个单独的状态来分发 pem 文件。

我目前拥有的:

要包含在相关服务器中的主要状态(我已将变量的具体细节更改为其他内容):

{% if 'custom_id' in pillar.get('the_custom_id')  %} 
{% set theuser = 'relevantuser' %}
{% set certpath = '/path/to/certs' %}
{% elif 'another-custom_id' in pillar.get('the_custom_id') %}
{% set theuser = 'relevantuser' %}
{% set certpath = '/path/to/certs' %}
{% else %}
{% set theuser = 'relevantuser' %}
{% set certpath = '/path/to/certs' %}
{% endif %}

{{ certpath }}:
  file.directory:
    - user: {{ theuser }}
    - group: {{ theuser }}
    - file_mode: 600
    - dir_mode: 755
    - makedirs: True
    - recurse:
    - user
    - group
    - mode

{% for cert_type in pillar.get('pem_certs', {}) %}
{{ certpath }}{{ cert_type }}.pem:
  file.managed:
    - context:
        cert_type: {{ cert_type }}
    - mode: 600
    - source: salt://path/to/file/filename
    - template: jinja
{% endfor %}

以上file.managed来源内容:

{{ pillar['pem_certs'][cert_type] }}

pillar.get 函数中的 pillar 文件将包含 pem 密钥。

pem_certs:
  ca-cert:
    -----BEGIN CERTIFICATE---------
    etc

saltstack 环境已经启动 运行 并且可以正常工作。在为小兵添加 rsa_id 私钥时采用了相同的方法,效果很好。 file.directory 工作正常并创建目录并相应地应用正确的用户。

从调试中我可以看到 file.managed 状态没有被渲染,我不知道为什么。

来自 运行 状态的调试输出:

[DEBUG   ] Rendered data from file:       /var/cache/salt/minion/files/base/path/to/state.sls:

/path/to/certs:
  file.directory:
    - user: theuser
    - group: theuser
    - file_mode: 600
    - dir_mode: 755
    - makedirs: True
    - recurse:
          - user
          - group
          - mode

[DEBUG   ] LazyLoaded config.get

目前我假设 pillar.get 未检索或无法检索 pem_certs。有没有办法专门测试一下?

有人能帮忙吗?

你目前正在做 {% for cert_type in pillar.get('pem_certs', {}) %},其中 returns 如果小兵的柱子中没有空字典 - 我想这是开始的第一件事。

对于调试,您希望通过 salt 'minionid' pillar.get pem_certs 之类的操作 知道 是否有数据可用于您的 minion。如果这没有显示支柱数据,请检查支柱的 top.sls。支柱数据是否正确应用于您的小兵?

此外,您应该考虑使用 {% for cert_type, cert_data in pillar.get('pem_certs', {}).iteritems() %} - 如果这样做,您可以直接将内容交给 file.manage 模板的上下文,而不再需要在模板中查询支柱数据模板了。

非常感谢达伦斯帮助追踪问题。我遗漏了 minion 到包含 pem 证书的支柱数据的包含。

现在一切正常。