diff --git a/lib/ansible/modules/files/unarchive.py b/lib/ansible/modules/files/unarchive.py index 8e37397c66c..5a7490a787d 100644 --- a/lib/ansible/modules/files/unarchive.py +++ b/lib/ansible/modules/files/unarchive.py @@ -261,11 +261,13 @@ class ZipArchive(object): else: try: for member in archive.namelist(): + exclude_flag = False if self.excludes: for exclude in self.excludes: - if not fnmatch.fnmatch(member, exclude): - self._files_in_archive.append(to_native(member)) - else: + if fnmatch.fnmatch(member, exclude): + exclude_flag = True + break + if not exclude_flag: self._files_in_archive.append(to_native(member)) except: archive.close() @@ -661,11 +663,14 @@ class TgzArchive(object): if filename.startswith('/'): filename = filename[1:] + exclude_flag = False if self.excludes: for exclude in self.excludes: - if not fnmatch.fnmatch(filename, exclude): - self._files_in_archive.append(to_native(filename)) - else: + if fnmatch.fnmatch(filename, exclude): + exclude_flag = True + break + + if not exclude_flag: self._files_in_archive.append(to_native(filename)) return self._files_in_archive diff --git a/test/integration/targets/unarchive/tasks/main.yml b/test/integration/targets/unarchive/tasks/main.yml index ffe25fcf4ad..8d816faedc3 100644 --- a/test/integration/targets/unarchive/tasks/main.yml +++ b/test/integration/targets/unarchive/tasks/main.yml @@ -225,11 +225,13 @@ - zip - tar -- name: Unpack archive file excluding glob files. +- name: Unpack archive file excluding regular and glob files. unarchive: src: "{{ output_dir }}/unarchive-00.{{item}}" dest: "{{ output_dir }}/exclude-{{item}}" - exclude: "exclude/exclude-*.txt" + exclude: + - "exclude/exclude-*.txt" + - "other/exclude-1.ext" with_items: - zip - tar @@ -245,6 +247,7 @@ assert: that: - "'exclude/exclude-1.txt' not in item.stdout" + - "'other/exclude-1.ext' not in item.stdout" with_items: - "{{ unarchive00.results }}"