salt-stack - salt 栈 : how do I repeat other states with context?

标签 salt-stack devops configuration-management

我为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/

相关文章:

gradle - build.gradle中的任务太多

oracle - 应用程序配置管理的工具和过程

python - 从 python 代码获取 highstate 的输出

salt-stack - file.managed salt 状态中的默认值和上下文选项有什么区别?

salt-stack - 在SaltStack中基于file.management设置条件cmd.run

azure - 如何将构建工件移动到当前工作目录

azure - 我们如何才能找到在特定订阅中使用 azure 中的 kubernetes pod 所产生的成本?

iphone - 管理一系列相关 iOS 应用程序的最佳实践

digital-ocean - 如何通过 CLI 或 tfvars 文件将变量传递给 Terraform 模块?

amazon-ec2 - 使用 Saltstack 标记 EC2 实例