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 证书的支柱数据的包含。
现在一切正常。
需要一些帮助,因为我现在有点卡住了。最终目标是拥有一个通用的状态,并允许我们将我们的 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 证书的支柱数据的包含。
现在一切正常。