ansible

Ansible playbook for unzipping GZ and ZIP files


I have an integration where I download one or more ZIP files. Within those ZIP files, there are dozens of GZ files that also need to be uncompressed. Below is an example of the file structure:

metrics.zip
-> 239238923323.gz
-> 839389239232.gz
-> 928392892839.gz
metrics-001.zip
-> 29389238923.gz
-> 39828393822.gz
-> 09320930323.gz
(etc)

I was struggling to write the playbook needed to loop through the ZIP file(s), then all of the GZ files and uncompress them all.


Solution

  • Created an answer from the author's original post:

    - hosts: localhost
      gather_facts: no
    
      tasks:
        #   Download the report into a temporary directory on the Ansible Playbook host
        - name: Create temporary directory 
          ansible.builtin.tempfile:
            state: directory
            suffix: unique_suffix
          register: temp_dir
    
        - name: Download File
          ansible.builtin.get_url:
            url: "https://path.to/file/download.zip"
            dest: "{{ temp_dir.path }}/download_file_name.zip"
    
        #   Unzip the ZIP files
        - name: Extract all ZIP files
          ansible.builtin.unarchive:
            src: "{{ item }}"
            dest: "{{ temp_dir.path }}"
          with_fileglob:
            - "{{ temp_dir.path }}/*.zip"
    
        # Unzip the GZ files
        - name: Extract all of the GZ files
          ansible.builtin.command: find "{{ temp_dir.path }}" -name '*.gz' -exec gzip -d {} \;
    
        - name: Merge CSVs into a single file
          ansible.builtin.assemble:
            src: "{{ temp_dir.path }}"
            dest: "{{ temp_dir.path }}/extract.x"
            regexp: '\.csv$'
    
    #   Use a Windows host to copy the file over to a file share (copying from Linux to a Windows file share requires mounting the FS. Using a Windows host is easier)
    - hosts: "{{ windows_host_name_in_inventory }}"
      tasks:
        - name: Copy Extract file to File Share
          win_copy:
            src: "{{ hostvars['localhost']['temp_dir'].path }}/extract.x"
            dest: "{{ Extract_To }}\\unique_name.csv"
    
    #   Remove the Temporary folder
    - hosts: localhost
      tasks:
    
        - name: Remove Temporary Directory
          ansible.builtin.file:
            path: "{{ hostvars['localhost']['temp_dir'].path }}"
            state: absent
          when: hostvars['localhost']['temp_dir'].path is defined