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等}
  • 这些模块仅在主机上可用

不完全是我所希望的,但我想是有用的。我以后再试试。谢谢