--- - block: - name: download_file | Starting download of file debug: msg: "{{ download.url }}" run_once: "{{ download_run_once }}" - name: download_file | Set pathname of cached file set_fact: file_path_cached: "{{ download_cache_dir }}/{{ download.dest | basename }}" tags: - facts - name: download_file | Create dest directory on node file: path: "{{ download.dest | dirname }}" owner: "{{ download.owner | default(omit) }}" mode: 0755 state: directory recurse: yes - name: download_file | Create local cache directory file: path: "{{ file_path_cached | dirname }}" state: directory recurse: yes delegate_to: localhost delegate_facts: false run_once: true become: false tags: - localhost - name: download_file | Check if file is available in cache stat: path: "{{ file_path_cached }}" register: cache_file run_once: true changed_when: false delegate_to: localhost delegate_facts: no become: false when: - download_force_cache tags: - facts - name: download_file | Set file_is_cached fact based on previous task set_fact: file_is_cached: "{{ cache_file.stat.exists | default(false) }}" when: - download_force_cache tags: - facts - name: download_file | Copy file from cache to nodes, if it is available synchronize: src: "{{ file_path_cached }}" dest: "{{ download.dest }}" use_ssh_args: "{{ has_bastion | default(false) }}" mode: push run_once: "{{ download_run_once }}" register: get_task until: get_task is succeeded delay: "{{ retry_stagger | random + 3 }}" retries: 4 when: - download_force_cache - file_is_cached - ansible_os_family not in ["CoreOS", "Coreos", "Container Linux by CoreOS", "Flatcar", "Flatcar Container Linux by Kinvolk"] - name: download_file | Set mode and owner file: path: "{{ download.dest }}" mode: "{{ download.mode | default(omit) }}" owner: "{{ download.owner | default(omit) }}" run_once: "{{ download_run_once }}" when: - download_force_cache - file_is_cached - ansible_os_family not in ["CoreOS", "Coreos", "Container Linux by CoreOS", "Flatcar", "Flatcar Container Linux by Kinvolk"] # This must always be called, to check if the checksum matches. On no-match the file is re-downloaded. - name: download_file | Download item get_url: url: "{{ download.url }}" dest: "{{ file_path_cached if download_localhost else download.dest }}" owner: "{{ omit if download_localhost else (download.owner | default(omit)) }}" mode: "{{ omit if download_localhost else (download.mode | default(omit)) }}" checksum: "{{ 'sha256:' + download.sha256 if download.sha256 or omit }}" validate_certs: "{{ download_validate_certs }}" url_username: "{{ download.username | default(omit) }}" url_password: "{{ download.password | default(omit) }}" force_basic_auth: "{{ download.force_basic_auth | default(omit) }}" delegate_to: "{{ download_delegate if download_run_once else inventory_hostname }}" run_once: "{{ download_run_once }}" register: get_url_result become: "{{ not download_localhost }}" until: "'OK' in get_url_result.msg or 'file already exists' in get_url_result.msg" retries: 4 delay: "{{ retry_stagger | default(5) }}" - name: "download_file | Extract file archives" include_tasks: "extract_file.yml" when: - not download_localhost - name: download_file | Copy file back to ansible host file cache synchronize: src: "{{ download.dest }}" dest: "{{ file_path_cached }}" use_ssh_args: "{{ has_bastion | default(false) }}" mode: pull when: - download_force_cache - not file_is_cached or get_url_result.changed - download_delegate == inventory_hostname - not (download_run_once and download_delegate == 'localhost') - ansible_os_family not in ["CoreOS", "Coreos", "Container Linux by CoreOS", "Flatcar", "Flatcar Container Linux by Kinvolk"] tags: - download