SaltStack:如何使用上下文重复其他状态?

时间:2016-06-21 14:19:37

标签: salt-stack devops configuration-management

我为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部分一样。

如何在盐地中正确完成?

1 个答案:

答案 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而不是第一种情况下的失败。