请求编写Ansible Playbook批量解压ZIP内嵌套的GZ文件
遍历解压ZIP内GZ文件的Ansible Playbook
直接上可复用的Playbook,分主Playbook和任务拆分文件,逻辑清晰好维护:
主Playbook(zip_extract_gz.yml)
- name: 批量处理ZIP中的GZ文件 hosts: your_target_hosts # 替换成你的目标主机组 gather_facts: yes vars: zip_pattern: "metrics*.zip" # 匹配你的ZIP文件名规则 target_dir: "/data/metrics" # GZ文件最终解压到这个目录 temp_root: "/tmp/zip_temp" # 临时解压ZIP的根目录 tasks: - name: 找出所有符合规则的ZIP文件 ansible.builtin.find: paths: "{{ target_dir }}" patterns: "{{ zip_pattern }}" file_type: file register: zip_list - name: 逐个处理每个ZIP文件 ansible.builtin.include_tasks: process_zip.yml loop: "{{ zip_list.files }}" loop_control: loop_var: current_zip
子任务文件(process_zip.yml)
# 为当前ZIP创建专属临时目录,避免文件冲突 - name: 创建临时解压目录 ansible.builtin.file: path: "{{ temp_root }}/{{ current_zip.path | basename | regex_replace('\\.zip$', '') }}" state: directory mode: '0755' register: temp_dir # 把ZIP解压到临时目录 - name: 解压ZIP到临时目录 ansible.builtin.unarchive: src: "{{ current_zip.path }}" dest: "{{ temp_dir.path }}" remote_src: yes # 找出临时目录里的所有GZ文件 - name: 查找临时目录中的GZ文件 ansible.builtin.find: paths: "{{ temp_dir.path }}" patterns: "*.gz" file_type: file register: gz_list # 逐个解压GZ到目标目录,用gunzip -c保留原GZ文件(要删原GZ就去掉-c) - name: 解压GZ文件到目标目录 ansible.builtin.shell: gunzip -c "{{ item.path }}" > "{{ target_dir }}/{{ item.path | basename | regex_replace('\\.gz$', '') }}" loop: "{{ gz_list.files }}" args: executable: /bin/bash # 清理临时目录 - name: 删除临时解压目录 ansible.builtin.file: path: "{{ temp_dir.path }}" state: absent # 可选:处理完删除原ZIP文件,需要的话取消注释并设置变量 # - name: 删除原ZIP文件 # ansible.builtin.file: # path: "{{ current_zip.path }}" # state: absent # when: delete_source_zip | default(false)
关键说明
- 替换
your_target_hosts、target_dir等变量为你的实际环境值 - 用专属临时目录避免多ZIP解压时文件重名冲突
gunzip -c会保留原GZ文件,如果不需要保留,直接用gunzip "{{ item.path }}"并调整解压路径即可- 如果ZIP里的GZ文件嵌套在子目录中,给
find模块添加recurse: yes参数就能递归查找
内容的提问来源于stack exchange,提问作者user1913559
相关产品推荐
相关产品推荐

