在salt-stack状态中编写python函数

时间:2018-02-22 15:19:02

标签: python salt-stack

编写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。

有办法做到这一点吗?

2 个答案:

答案 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使用渲染器管道来决定如何生成数据结构。

默认值为jinjayaml,这意味着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') %}