自定义Ansible SFTP模块在Rocky Linux运行失败,Mac/Ubuntu正常
故障原因及解决线索
故障核心原因
- 自定义SFTP模块逻辑倒置:处理
direction: download时,错误调用了Paramiko的put()方法(用于上传本地文件到SFTP服务器),而非get()方法(从SFTP服务器拉取文件到本地)。- 从Rocky Linux的报错栈可见,
paramiko/sftp_client.py的put()方法执行os.stat(localpath)检查本地文件,但/devops/junk.txt实际是SFTP服务器上的路径,本地Rocky Linux主机无此文件,因此触发FileNotFoundError。
- 从Rocky Linux的报错栈可见,
- 跨平台表现异常的根源:Mac上未报错属于“误打误撞”——模块逻辑混乱导致参数传递顺序颠倒,可能把本地
/tmp/junk.txt作为put的本地路径、服务器/devops/junk.txt作为远程路径,加上Paramiko版本或系统差异未触发显式报错,反而完成了文件下载,但逻辑本质完全错误。
解决线索
- 修正方法调用分支:找到模块中
transfer_file函数(报错栈第30行),确保direction: download分支调用sftp.get(),而非sftp.put(),正确参数传递应为:- 下载场景:
sftp.get(remotepath=src, localpath=dest) - 上传场景:
sftp.put(localpath=src, remotepath=dest)
- 下载场景:
- 校验参数映射关系:确认
src和dest的对应逻辑:- 下载时:
src是SFTP服务器路径,dest是本地路径 - 上传时:
src是本地路径,dest是SFTP服务器路径
- 下载时:
- 统一依赖版本:在Rocky Linux和Mac上安装相同版本的Paramiko,排除版本差异导致的行为不一致。
- 添加前置校验:在模块中增加校验逻辑:
- 上传前:检查本地
src路径是否存在 - 下载前:通过SFTP的
stat()方法检查服务器端src路径是否存在,提前抛出明确错误。
- 上传前:检查本地
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

