我想为所有盒子做一些基本的柱值设置,以便我以后可以统一使用它们。我们的爪牙通常以这种格式命名:
<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
)。如果可能的话,有关如何在支柱文件中提供正则表达式功能的任何建议吗?
答案 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'] -%}
等...
要了解的几件事:
/srv/extmod/{pillar,runners,outputers,etc}
。