如何在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
相关产品推荐
相关产品推荐

