You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SaltStack的Python格式Pillar文件中导入并使用Jinja宏

在Python格式的SaltStack Pillar文件中复用Jinja宏

Python格式的Salt Pillar文件无法直接使用Jinja模板语法(比如{% from %})导入宏,也不能通过普通Python import定位到SLS文件(因为Salt的file_roots不在Python sys.path中)。要复用现有Jinja宏,需借助Salt的内部Jinja工具或渲染API实现,以下是两种可行方案:

方案一:通过SaltJinjaEnv加载宏文件

直接初始化Salt的Jinja环境,加载宏所在的SLS文件并提取宏函数使用:

#!py
import json
from salt.utils.jinja import SaltJinjaEnv

def somefunc():
    # 从JSON文件拉取数据的逻辑
    with open('/path/to/your/data.json', 'r') as f:
        return json.load(f)

def secondfunc():
    # 基于当前Salt配置初始化Jinja环境
    jinja_env = SaltJinjaEnv(__opts__)
    # 加载宏所在的SLS模板文件(路径对应file_roots中的位置)
    macro_template = jinja_env.get_template('my/code/struct/macros1.sls')
    # 提取目标宏函数
    getMacro = macro_template.module.getMacro
    # 调用宏,传入所需参数
    macro_result = getMacro(your_parameter_here)
    
    # 结合宏结果返回Pillar数据
    return {
        'json_data': somefunc(),
        'macro_output': macro_result
    }

方案二:通过render.jinja API渲染宏调用

构造包含宏调用的Jinja字符串,借助Salt的render.jinja函数执行渲染:

#!py
import json

def somefunc():
    with open('/path/to/your/data.json', 'r') as f:
        return json.load(f)

def secondfunc():
    # 构造调用宏的Jinja代码片段
    jinja_snippet = "{% from 'my/code/struct/macros1.sls' import getMacro %}{{ getMacro(your_parameter_here) }}"
    # 调用Salt的Jinja渲染函数,自动继承当前环境变量
    macro_result = __salt__['render.jinja'](jinja_snippet, saltenv=__env__)
    
    return {
        'json_data': somefunc(),
        'macro_output': macro_result
    }

关键说明

  • 确保宏文件路径my/code/struct/macros1.sls在Salt的pillar_roots配置对应的目录下,否则Jinja环境无法找到该文件。
  • 两种方案都会自动继承Salt的上下文变量(如__pillar__、__grains__),宏中若依赖这些变量无需额外传递。
  • 若宏有参数,需根据实际需求替换示例中的your_parameter_here。

内容的提问来源于stack exchange,提问作者Sammy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:45:43