Fix ansible.builtin.include_vars - depth (#80995)

* Changes as suggested by sivel

* Add changelog fragment and tests

Co-authored-by: Matt Martz <matt@sivel.net>
Co-authored-by: s-hertel <19572925+s-hertel@users.noreply.github.com>
pull/80173/head
tachyontec 5 months ago committed by GitHub
parent 3f74bc08ce
commit 48bed1e15a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,2 @@
bugfixes:
- include_vars - fix calculating ``depth`` relative to the root and ensure all files are included (https://github.com/ansible/ansible/issues/80987).

@ -5,6 +5,7 @@ from __future__ import annotations
from os import path, walk from os import path, walk
import re import re
import pathlib
import ansible.constants as C import ansible.constants as C
from ansible.errors import AnsibleError from ansible.errors import AnsibleError
@ -181,16 +182,15 @@ class ActionModule(ActionBase):
alphabetical order. Do not iterate pass the set depth. alphabetical order. Do not iterate pass the set depth.
The default depth is unlimited. The default depth is unlimited.
""" """
current_depth = 0
sorted_walk = list(walk(self.source_dir, onerror=self._log_walk, followlinks=True)) sorted_walk = list(walk(self.source_dir, onerror=self._log_walk, followlinks=True))
sorted_walk.sort(key=lambda x: x[0]) sorted_walk.sort(key=lambda x: x[0])
for current_root, current_dir, current_files in sorted_walk: for current_root, current_dir, current_files in sorted_walk:
current_depth += 1 # Depth 1 is the root, relative_to omits the root
if current_depth <= self.depth or self.depth == 0: current_depth = len(pathlib.Path(current_root).relative_to(self.source_dir).parts) + 1
current_files.sort() if self.depth != 0 and current_depth > self.depth:
yield (current_root, current_files) continue
else: current_files.sort()
break yield (current_root, current_files)
def _ignore_file(self, filename): def _ignore_file(self, filename):
""" Return True if a file matches the list of ignore_files. """ Return True if a file matches the list of ignore_files.

@ -255,3 +255,15 @@
vars: vars:
hash1: "{{ role_path }}/test_symlink/symlink/hashes/hash1.yml" hash1: "{{ role_path }}/test_symlink/symlink/hashes/hash1.yml"
hash2: "{{ role_path }}/test_symlink/symlink/hashes/hash2.yml" hash2: "{{ role_path }}/test_symlink/symlink/hashes/hash2.yml"
- name: Test include_vars includes everything to the correct depth
ansible.builtin.include_vars:
dir: "{{ role_path }}/files/test_depth"
depth: 3
name: test_depth_var
register: test_depth
- assert:
that:
- "test_depth.ansible_included_var_files|length == 8"
- "test_depth_var.keys()|length == 8"

Loading…
Cancel
Save