Ansible Tower部署时copy模块atomic_move报错OSError: [Errno 0] Error求助
Ansible Tower Copy模块atomic_move OSError [Errno 0] Error 解决建议
问题重现
执行Ansible Tower部署时,copy模块在原子移动临时文件到目标路径时失败,核心报错:
in atomic_move os.rename(b_src, b_dest) OSError: [Errno 0] Error
对应任务代码片段:
- name: Copying war file to deployment hosts copy: src: "/data/war/{{war_file}}" dest: "/deployments/war/release/{{war_file}}" owner: user group: user mode: '0775' when: - 'ansible_hostname == dep_host_list' loop: "{{deployment_hosts}}" loop_control: loop_var: dep_host_list
错误日志确认是临时文件无法重命名到目标路径:Could not replace file: /home/user/.ansible/tmp/.../source to /deployments/war/release/war-1.0.war: [Errno 0] Error
解决建议
1. 禁用原子写入,直接修改目标文件
Ansible copy模块默认通过原子移动(先写临时文件再rename)保证文件一致性,但部分文件系统或权限场景下rename操作会失败。添加unsafe_writes: yes参数跳过原子移动逻辑,直接写入目标文件:
- name: Copying war file to deployment hosts copy: src: "/data/war/{{war_file}}" dest: "/deployments/war/release/{{war_file}}" owner: user group: user mode: '0775' unsafe_writes: yes when: - ansible_hostname == dep_host_list loop: "{{deployment_hosts}}" loop_control: loop_var: dep_host_list
2. 排查文件系统与权限问题
- 确认
/deployments/war/release/目录对test_user拥有读写权限,同时父目录需有执行权限(允许用户进入目录)。 - 检查临时文件所在目录(
/home/user/.ansible/tmp/)与目标目录是否属于同一文件系统分区:os.rename不支持跨分区操作,若跨分区,即使Ansible理论会自动降级处理,仍可能出现异常。可手动将临时文件路径指定到目标分区内,或直接使用unsafe_writes。
3. 检查目标文件是否被占用
若目标文件war-1.0.war正在被进程占用(如应用服务器正在加载该文件),会导致重命名操作失败。需先停止相关服务,完成文件复制后再重启服务;或添加backup: yes参数先备份原文件,但备份无法解决文件占用问题,核心还是需要释放文件锁。
4. 替换模块或升级Ansible版本
- 改用
synchronize模块(基于rsync)替代copy,该模块在跨分区、大文件复制场景下更稳定:
- name: Sync war file to deployment hosts synchronize: src: "/data/war/{{war_file}}" dest: "/deployments/war/release/{{war_file}}" owner: yes group: yes mode: push when: - ansible_hostname == dep_host_list loop: "{{deployment_hosts}}" loop_control: loop_var: dep_host_list
- 升级Ansible Tower到最新稳定版本:部分旧版本存在
atomic_move逻辑的bug,新版本已修复此类Errno 0的异常。
内容的提问来源于stack exchange,提问作者Akhil S
相关产品推荐
相关产品推荐

