SaltStack自定义Runner无法获取Pillar问题求助
在SaltStack自定义Runner中获取Master的Pillar数据
我在编写SaltStack自定义Runner时,尝试获取存储在Master专属Pillar中的密钥,但调用pillars.get始终返回空值。我的Pillar配置top.sls如下:
prd: 'my_saltmaster': - match: pcre - salt_secrets
原尝试代码:
import salt.runner import logging log = logging.getLogger(__name__) runner = salt.runner.Runner(__opts__) secret = runner.cmd(fun='salt.cmd', arg=['pillars.get', 'my_secret']) log.info(f"my_secret = {secret}")
返回结果为空,需要解决如何在Runner中正确获取Master的Pillar。
问题原因
你之前的方法错误在于使用salt.cmd调用pillars.get,这个组合默认是向Minion发送命令,但你需要的是Master自身的Pillar数据。Runner运行在Master上,无需通过Minion路由来获取。
解决方法
有两种可靠的方式可以在Runner中获取Master的Pillar:
方法1:直接加载并编译Master的Pillar(推荐)
直接调用Salt的Pillar模块在Runner进程内编译Master的Pillar数据,效率更高:
import logging import salt.pillar log = logging.getLogger(__name__) def get_master_secret(): # 获取SaltMaster自身的Minion ID master_id = __opts__['id'] # 初始化Pillar编译器 pillar_compiler = salt.pillar.get_pillar( opts=__opts__, grains=__grains__, minion_id=master_id, env=__opts__['environment'], pillar_roots=__opts__['pillar_roots'], pillar_top=__opts__['pillar_top'] ) # 编译生成完整的Pillar数据 pillar_compiler.compile_pillar() # 获取目标密钥,第二个参数是默认值(可选) secret = pillar_compiler.get('my_secret', None) log.info(f"my_secret = {secret}") return secret
方法2:通过Runner调用pillar.show_pillar指定Master目标
利用Runner的pillar.show_pillar函数,明确指定目标为Master的ID:
import salt.runner import logging log = logging.getLogger(__name__) runner = salt.runner.Runner(__opts__) # 调用pillar.show_pillar,指定目标为Master的ID,匹配模式为glob pillar_result = runner.cmd( fun='pillar.show_pillar', kwarg={ 'target': __opts__['id'], 'expr_form': 'glob' } ) # 从返回结果中提取Master的Pillar数据(返回结构为 {minion_id: pillar_data}) secret = pillar_result.get(__opts__['id'], {}).get('my_secret') log.info(f"my_secret = {secret}")
说明
- 方法1直接在Runner进程内处理Pillar编译,避免了额外的进程调用,性能更优,适合复杂的Pillar读取场景。
- 方法2复用了Salt的Runner模块,逻辑更符合Runner的调用习惯,适合简单的Pillar查询。
内容的提问来源于stack exchange,提问作者Dwayne Smith
相关产品推荐
相关产品推荐

