使用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模块的封装问题:
- 在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()
- 修改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
相关产品推荐
相关产品推荐

