2016-06-21 26 views
1

我为API服务创建了一个复杂的状态,它涉及到git checkout,python venv,uwsgi,nginx等等。它工作正常。SaltStack:我如何用上下文重复其他状态?

现在我想把它变成一个模板并且每次执行它几次,从柱子提供的变量 - 即类似的东西。

{% for apiserver in pillar.apiservers %} 
     include apiserver_template.sls, locals: apiserver.config 
    {% endfor %} 

其中apiserver_template将与提供给它的上下文工作,与具有所有配置数据对每个API实例apiserver.config。我知道语法是错误的,但希望我传达这个想法 - 理想情况下,就像执行提供局部变量的ruby部分一样。

它是如何在盐地中妥善处理的?

回答

2

这听起来像金嘉宏是你想用这个东西。你可以找到关于使用这里的更多信息: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 %} 

如果你想 - 你也可以把宏在单独的状态文件,然后导入马可作为普通盐资源。

请不要那些而不是pillar.apiservers我用salt.pillar.get('apiservers',[])。这是从支柱获取数据的更安全的方式。如果由于某种原因支柱不可用 - 后面的代码将导致空字典,而不是在第一种情况下失败。

+0

谢谢,我自己做了一件非常相似的事情,唯一令我困惑一阵子的事情是,在模板状态内,我呈现了一些模板文件,并将变量传递给它们,要求这样做: /opt/{{apisite ini: file.managed: - source://files/api.ini - template:jinja - context:['sitename']}}/api - {{apisite ['sitename']} sitename:{{apisite ['sitename']}} apiport:{{apisite ['apiport']}} whis is very ugly imo – DeeY

相关问题