我为API服务创建了一个复杂的状态,它涉及git checkouts、python venv、uwsgi、nginx等。它工作得很好。
现在我想将它变成一个模板并为每个minion执行几次,并使用从pillar提供的变量 - 即类似的东西。
{% for apiserver in pillar.apiservers %}
include apiserver_template.sls, locals: apiserver.config
{% endfor %}
其中 apiserver_template 将使用提供给它的上下文,而 apiserver.config 包含每个 API 实例的所有配置数据。我知道语法是错误的,但希望我能传达这个想法 - 理想情况下,类似于通过提供局部变量来执行 ruby 部分。
如何在 salt 地正确完成它?
最佳答案
在我看来,Jinja Macro 就是您想要用于此目的的东西。您可以在这里找到有关使用的更多信息:https://docs.saltstack.com/en/2015.8/topics/development/conventions/formulas.html#jinja-macros
简而言之,您的情况可能如下所示:
{% macro api_server(git_repo, python_venv_path, python_venv_requirements) %}
{{python_venv_path}}:
virtualenv.managed:
- system_site_packages: False
- requirements: salt://{{python_venv_requirements}}
{{git_repo}}:
git.latest:
- name: {{git_repo}}
{% endmacro %}
假设您有一个支柱 apiservers,其中每个 api 服务器都有 git_repo、python_venv_path 和 python_venv_requirements 值,您可以使用如下宏:
{% for server in salt.pillar.get('apiservers', []) %}
{{ api_server(server['git_repo'], server['python_venv_path'], server['python_venv_requirements']) }}
{% endfor %}
如果您愿意 - 您还可以将宏放入单独的状态文件中,然后导入宏作为常规 salt 资源。
也请注意,我使用 salt.pillar.get('apiservers', []) 代替pillar.apiservers。这是从支柱获取数据的更安全的方法。如果由于某种原因支柱不可用 - 后面的代码将导致空字典而不是第一种情况下的失败。
关于salt-stack - salt 栈 : how do I repeat other states with context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37946983/