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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:20:16