使用Ansible创建归档失败:遭遇文件未找到错误
Ansible归档复制任务报错:文件未找到解决方案
问题场景
尝试用Ansible创建证书目录的压缩归档,并将归档文件复制到远程主机指定路径,但执行copy任务时触发文件未找到错误。已确认源证书目录/home/ansible-admin/app/certs存在,但zip归档文件始终未生成(或无法被copy模块识别)。
原Playbook代码
--- - hosts: example become: yes tasks: - name: Create cert archive archive: path: - /home/ansible-admin/app/certs dest: /home/ansible-admin/app/app_certs.zip format: zip - name: Copy certs to target servers copy: src: /home/ansible-admin/app/app_certs.zip dest: /home/ubuntu/app_certs.zip owner: ubuntu group: ubuntu mode: "0400"
报错信息
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: If you are using a module and expect the file to exist on the remote, see the remote_src option fatal: [app.example.com]: FAILED! => {"changed": false, "msg": "Could not find or access '/home/ansible-admin/app_certs.zip' on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option"}
错误原因
- 模块执行路径混淆:
archive模块是在远程主机上执行的,生成的zip文件存储在远程主机的/home/ansible-admin/app/app_certs.zip路径下。但copy模块默认从Ansible控制节点读取源文件,因此找不到远程主机上生成的归档文件。 - 潜在权限问题:使用
become: yes执行archive模块时,生成的归档文件所有者为root,若后续copy任务权限不足,可能导致读取失败或归档文件实际未生成。
修复方案
1. 修正copy模块,指定远程源文件
在copy任务中添加remote_src: yes参数,告知模块源文件存在于远程主机而非控制节点。
2. 可选:调整归档文件权限(避免后续权限问题)
在archive任务中指定归档文件的所有者为ansible-admin,避免root权限导致的读取或复制异常。
修改后的完整Playbook
--- - hosts: example become: yes tasks: - name: Create cert archive archive: path: - /home/ansible-admin/app/certs dest: /home/ansible-admin/app/app_certs.zip format: zip owner: ansible-admin group: ansible-admin # 确保归档文件归目标用户所有,避免权限问题 - name: Copy certs to target servers copy: src: /home/ansible-admin/app/app_certs.zip dest: /home/ubuntu/app_certs.zip owner: ubuntu group: ubuntu mode: "0400" remote_src: yes # 关键参数:指定源文件在远程主机
验证步骤
- 单独执行归档任务,确认文件生成:
登录远程主机,检查ansible-playbook your_playbook.yml --tags "Create cert archive"/home/ansible-admin/app/app_certs.zip是否存在且权限正常。 - 执行完整Playbook,验证copy任务成功。
archive模块核心说明(翻译自官方文档)
- 该模块用于在远程主机上创建压缩归档,支持zip、tar、gz、bz2等多种格式。
path参数接受单个路径或路径列表,用于指定需要归档的文件/目录。dest参数必须是归档文件的完整输出路径,且路径所在目录需提前存在。- 若未指定
owner/group,归档文件的所有者会继承模块执行用户的权限(使用become: yes时为root)。
内容的提问来源于stack exchange,提问作者Thatsnotamuffin
相关产品推荐
相关产品推荐

