如何修复Ansible中find查找文件后unarchive解压的任务报错问题
Ansible 先查找文件再解压任务修复方案
错误原因
- 循环插件使用错误:
with_fileglob仅用于在Ansible控制节点本地匹配文件路径,你已经通过find模块获取到了目标主机的文件列表,直接遍历列表即可,不需要再调用文件匹配插件,传入列表给期望字符串参数的with_fileglob就是触发'list' object has no attribute 'rfind'报错的直接原因 - 返回值取值错误:
find模块返回的copied_file.files是字典列表,每个元素包含文件的元数据,不是直接的文件名,不能直接作为文件名拼接 - 缺少必要参数:
unarchive模块默认将src参数指向的路径判定为控制节点本地路径,要解压目标主机上已存在的压缩包,必须添加remote_src: yes参数
修正后代码
- name: find the file find: paths: /home/ec2-user/aa/ pattern: "file-*.tar.gz" register: copied_file - name: extract the file unarchive: src: "{{ item.path }}" dest: /home/ec2-user/bb/ remote_src: yes loop: "{{ copied_file.files }}" # 可选配置:没有匹配到文件时自动跳过任务,避免报错 when: copied_file.files | length > 0
补充说明
find返回的每个文件对象中,item.path已经是文件的完整绝对路径,不需要手动拼接路径前缀;如果需要手动拼接的场景,可以取item.basename获取文件名,再和前缀拼接使用。
内容的提问来源于stack exchange,提问作者vtr
相关产品推荐
相关产品推荐

