Python SaltStack:在支柱文件中使用regexp
我想为所有框做一些基本的柱值设置,以便以后可以统一使用它们。我们的部下通常以以下格式命名:Python SaltStack:在支柱文件中使用regexp,python,regex,jinja2,salt-stack,Python,Regex,Jinja2,Salt Stack,我想为所有框做一些基本的柱值设置,以便以后可以统一使用它们。我们的部下通常以以下格式命名: <project>-<env>.<role>-<sequence>.<domain> 示例支柱/基础/基础/init.sls: base: '*': - basics 'I@project:mycoolproject and I@role:nginx': - etc. {% if '-live.
<project>-<env>.<role>-<sequence>.<domain>
示例支柱/基础/基础/init.sls
:
base:
'*':
- basics
'I@project:mycoolproject and I@role:nginx':
- etc.
{% if '-live.' in grains['id'] %}
env: production
{% elif '-qa.' in grains['id'] %}
env: qa
{% elif '-staging.' in grains['id'] %}
env: staging
{% else %}
env:
{% endif %}
{% set role = re.match("(?:live|qa|staging)\.([a-z_\-]+)\-', grains['id']).group(1) -%}
role: {{ role }}
env
部分显然可以工作,但我无法让正则表达式工作。据我所知,在jinja模板中无法导入python模块(即,import re
)。如果可能的话,有没有关于如何在支柱文件中使用regex功能的建议?简单的答案是“没有”。没有一种方法可以将正则表达式功能直接注入到jinja环境中(我确信有一种方法可以扩展jinja,但无论如何……)
我解决这个问题的方法是使用一个外部模块函数id_info.explode()和一个外部支柱
在主机上启用外部模块:
external_modules: /srv/extmod
外部模块不需要任何特殊的基础设施——它们只是普通的python模块(请注意,不是包——加载程序目前还不知道如何正确地侧向加载包)
将python+regex逻辑放在那里。归还一本字典,根据您的喜好汇编
您的外部模块将位于/srv/extmod/modules中。您可以从posal.sls调用此函数
{% id_info = __salt__[id_info.explode()] -%}
{% subcomponent = id_info['subcomponent'] -%}
{% project = id_info['project'] -%}
等等
有几件事需要知道:
- 添加或修改外部模块时,必须重新启动salt主机。据我所知,没有一种方法可以激发对salt master的saltutil.refresh_modules()调用,所以就这样吧
- external_modules指令不仅仅适用于执行模块。在这个场景中,您还将创建
/srv/extmod/{pillar、runner、outputer等}
- 这些模块仅在主机上可用