编写saltstack代码,我发现自己想要以python中容易的方式操作支柱中的数据结构,而在jinja中则相当繁琐。起初,似乎python-salt集成很容易,但我还没有找到有关如何实现它的细节。
我想要的是在salt/foo/init.sls
中添加类似于此的内容:
{% for key, value in my_function(pillar['one_thing'], pillar['another_thing']) %}
# declare some states parameterised by key and value
{% endfor %}
其中my_function()
只是一个python函数,期望接收两个dicts(我从柱子传递的内容)并返回另一个dict。
有办法做到这一点吗?
答案 0 :(得分:3)
默认情况下,salt支持不同的renderers to write state files
其中一个只是plain python,您需要做的就是使用正确的shebang启动文件,实现run
方法并返回与使用默认yaml
渲染器时相同的dict:
#!py
def run():
return {"state_id": {
"cmd.run": [
{"name": "ls -al"}
]
}}
作为示例,您可以查看此状态describing redis orchestration
答案 1 :(得分:1)
添加到@lakier的答案和您在其评论中提供的信息。状态文件只是数据结构生成器,salt使用渲染器管道来决定如何生成数据结构。
默认值为jinja
到yaml
,这意味着jinja
完成其工作并将结果通过管道传输到yaml
然后执行其工作,其表示为{{ 1}}。您可以根据自己的喜好使用此管道来compose renderers并连接一系列渲染器。
这里是一个full list of renderers,您可以将其用作撰写和创建自定义渲染器的参考,例如jinja | yaml
还有一个renderer function in slsutil执行模块,可用于以#!jinja|py
语法或所需的任何语法编写sls,并将其放入python
,
示例
jinja
可以从任何其他sls文件访问它。以下是Jinja中的用法示例,
map.sls
#!py
def run():
apache = __salt__.grains.filter_by({
...normal map here but as a python dict...
}, merge=__salt__.pillar.get('apache:lookup'))
return apache
您也可以使用slsutil从命令行直接渲染
{% set apache = salt.slsutil.renderer('map.sls') %}