SaltStack:在支柱文件中使用regexp

时间:2015-02-04 17:35:34

标签: python regex jinja2 salt-stack

我想为所有盒子做一些基本的柱值设置,以便我以后可以统一使用它们。我们的爪牙通常以这种格式命名:

<project>-<env>.<role>-<sequence>.<domain>

示例pillar/base/top.sls

base:
    '*':
        - basics
    'I@project:mycoolproject and I@role:nginx':
        - etc.

示例pillar/base/basics/init.sls

{% 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)。如果可能的话,有关如何在支柱文件中提供正则表达式功能的任何建议吗?

1 个答案:

答案 0 :(得分:0)

简单的答案是“不”。没有办法直接将正则表达式功能注入jinja环境(我确信有一种方法可以扩展jinja,但无论如何......)

我解决这个问题的方法是使用外部模块函数id_info.explode()和外部支柱。

在主服务器上启用外部模块:

external_modules: /srv/extmod

外部模块不需要任何特殊的基础设施 - 它们只是常规的python模块(不是包,请注意 - 加载器目前还不知道如何正确地加载包)

将python + regex逻辑放在那里。根据自己的喜好返回字典。

您的外部模块将进入/ srv / extmod / modules。你可以从你的pillar.sls中调用这个函数

{% id_info = __salt__[id_info.explode()] -%}
{% subcomponent = id_info['subcomponent'] -%}
{% project = id_info['project'] -%}

等...

要了解的几件事:

  • 添加或修改外部模块时,必须重新启动salt-master。我知道没有办法在salt-master上煽动相当于saltutil.refresh_modules()的调用,所以你可以去。
  • external_modules指令不仅适用于执行模块。在这种情况下,您还可以创建/srv/extmod/{pillar,runners,outputers,etc}
  • 这些模块仅在主人
  • 上可用