Salt 2019.2.0:如何在自定义模块更新Pillar数据简化Jinja代码?
我明白你想要解决的问题——在Jinja模板里反复写{% if pillar.database_replication|default(False) %}这类代码确实很冗余,通过自定义模块给Pillar统一注入默认值是个非常实用的优化方案,正好在Salt 2019.2.0版本里可以完美实现。下面是具体的操作步骤:
1. 创建自定义Pillar扩展模块
Salt允许我们通过自定义ext_pillar模块来修改或补充Pillar数据,我们可以利用这个特性统一设置默认值。
首先在Salt Master的srv/salt/_pillar/目录下创建一个新文件,比如defaults.py,写入以下代码:
def ext_pillar(minion_id, pillar, *args, **kwargs): # 定义所有需要设置默认值的Pillar键及其默认值 default_settings = { 'database_replication': False, # 你可以在这里添加更多需要默认值的配置项,比如: # 'redis_enable': True, # 'app_log_level': 'info' } # 遍历默认值字典,仅当Pillar中不存在对应键时才添加默认值 for key, default_val in default_settings.items(): if key not in pillar: pillar[key] = default_val # 返回修改后的Pillar数据 return pillar
这段代码的核心逻辑是:接收Salt加载好的原始Pillar数据,把我们预设的默认值补充进去(不会覆盖已存在的Pillar键值),最终返回处理后的Pillar供后续使用。
2. 配置Salt Master加载这个自定义模块
接下来需要让Salt Master知道要加载我们的自定义Pillar模块。打开Master的配置文件(通常是/etc/salt/master),添加以下配置:
ext_pillar: - defaults:
配置完成后,重启Salt Master服务让配置生效:
systemctl restart salt-master
3. 简化Jinja模板中的代码
现在你可以完全去掉Jinja里的|default()过滤器了,直接写成:
{% if pillar.database_replication %} # 这里写数据库复制相关的配置逻辑 {% endif %}
因为如果database_replication没有在其他Pillar文件中定义,我们的自定义模块已经自动把它设置为False了;如果已经有定义,就会优先使用已有的值,完全不影响原有逻辑。
4. 验证效果
你可以用以下命令验证默认值是否生效:
salt <你的Minion ID> pillar.get database_replication
即使没有在任何Pillar文件中定义这个键,也会返回False;如果手动在其他Pillar里设置了database_replication: True,执行命令会返回True,说明默认值不会覆盖已有的自定义配置。
注意事项
- 由于你使用的是Salt 2019.2.0,这个版本完全支持
ext_pillar模块的这种用法,不存在兼容性问题。 - 如果有多个
ext_pillar模块,建议把默认值模块放在配置的最前面,确保它先加载,这样后续模块设置的键值会优先于默认值(符合我们的预期:默认值仅在没有自定义配置时生效)。
内容的提问来源于stack exchange,提问作者guettli

