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

使用salt-ssh调用salt-mine报'FunctionWrapper'对象不可调用如何解决

Salt-ssh执行依赖Salt Mine的状态报'FunctionWrapper' object is not callable故障处理

问题现象

依赖Salt Mine访问能力的SaltStack状态在原生salt '*' state.apply执行模式下长期运行稳定,切换为salt-ssh -i '*' state.apply执行后抛出如下错误:

TypeError encountered executing example_token: 'FunctionWrapper' object is not callable

相关配置如下:

  • Pillar中Mine函数配置:
mine_functions:
  example_token:
    - mine_function: cp.get_file_str
    - file:///tmp/example.txt
  • 状态文件中Mine数据调用逻辑:
salt['mine.get'](minion_host_name, 'example_token')[minion_host_name]

已确认的前置约束与排查结果:

  • 切换salt-ssh为既定技术方案,无法回退至原有原生salt-minion执行模式
  • 尝试将mine函数声明从Pillar迁移到Roster配置中,仍触发完全相同的报错

故障根因

该问题是salt-ssh的Mine模块加载时序缺陷导致:原生salt-minion服务启动时会完整加载所有执行模块、完成函数封装初始化,调用Mine函数时不会出现封装对象未解析的问题;但salt-ssh采用的薄/厚minion临时部署模式下,cp.get_file_str这类cp模块下的方法在Mine任务触发执行时,还未完成解封装流程,被识别为不可直接调用的FunctionWrapper对象,最终抛出类型错误。

修复方案

方案1:调整Mine函数参数声明格式

放弃列表传参的简写格式,改用字典格式显式声明Mine函数与对应参数,规避salt-ssh的函数解析异常:

mine_functions:
  example_token:
    mine_function: cp.get_file_str
    path: file:///tmp/example.txt

方案2:自定义模块包装文件读取逻辑

如果方案1调整后仍存在报错,通过自定义执行模块绕开cp模块的封装问题:

  1. 在Salt file_roots对应路径的_modules目录下新建自定义模块文件custom_file.py,实现本地文件读取逻辑:
def get_local_file_content(path):
    # 移除file://协议前缀读取本地文件
    local_path = path.replace('file://', '')
    with open(local_path, 'r', encoding='utf-8') as f:
        return f.read()
  1. 修改Mine函数配置,改为调用自定义模块方法:
mine_functions:
  example_token:
    mine_function: custom_file.get_local_file_content
    path: file:///tmp/example.txt

配置修改完成后,先执行salt-ssh '*' mine.update强制刷新全节点Mine数据,再执行状态apply即可正常获取对应Mine值,不会再触发该类型错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:30:38