我为API服务创建了一个复杂的状态,它涉及git checkout,python venv,uwsgi,nginx等等。它运行正常。
现在我想把它变成一个模板,每个minion执行几次,变量由柱子提供 - 就像是。
{% for apiserver in pillar.apiservers %}
include apiserver_template.sls, locals: apiserver.config
{% endfor %}
其中apiserver_template将与提供给它的上下文一起使用,apiserver.config包含每个API实例的所有配置数据。我知道语法是错误的,但希望我正在传达这个想法 - 理想情况下,就像执行局部变量执行ruby部分一样。
如何在盐地中正确完成?
答案 0 :(得分:2)
听起来像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 %}
如果需要 - 您还可以将宏放在单独的状态文件中,然后将marco作为常规盐资源导入。
请注意,我使用的是salt.pillar.get(' apiservers',[])而不是pillar.apiservers。这是从支柱获取数据的更安全的方法。如果由于某种原因支柱不可用 - 后面的代码将导致空的dict而不是第一种情况下的失败。