diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index 9a75ff40c4f29a..d08b867c2d00fb 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -430,11 +430,13 @@ def _execute(self, variables=None): # Read some values from the task, so that we can modify them if need be if self._task.until: - retries = self._task.retries + 1 + retries = self._task.retries if retries is None: retries = 3 elif retries <= 0: retries = 1 + else: + retries += 1 else: retries = 1 diff --git a/test/integration/non_destructive.yml b/test/integration/non_destructive.yml index 5bb748bff85af7..ec5d194fefb90b 100644 --- a/test/integration/non_destructive.yml +++ b/test/integration/non_destructive.yml @@ -20,6 +20,7 @@ - { role: test_changed_when, tags: test_changed_when } - { role: test_failed_when, tags: test_failed_when } - { role: test_handlers, tags: test_handlers } + - { role: test_until, tags: test_until } - { role: test_copy, tags: test_copy } - { role: test_stat, tags: test_stat } - { role: test_template, tags: test_template } diff --git a/test/integration/roles/test_until/tasks/main.yml b/test/integration/roles/test_until/tasks/main.yml new file mode 100644 index 00000000000000..b0e0c5d233199c --- /dev/null +++ b/test/integration/roles/test_until/tasks/main.yml @@ -0,0 +1,32 @@ +- shell: python -c "import tempfile; print(tempfile.mkstemp()[1])" + register: tempfilepath + +- set_fact: + until_tempfile_path: "{{ tempfilepath.stdout }}" + +- name: loop with default retries + shell: echo "run" >> {{ until_tempfile_path }} && wc -w < {{ until_tempfile_path }} | tr -d ' ' + register: runcount + until: runcount.stdout | int == 3 + delay: 0.01 + +- assert: + that: runcount.stdout | int == 3 + +- file: path="{{ until_tempfile_path }}" state=absent + +- name: loop with specified max retries + shell: echo "run" >> {{ until_tempfile_path }} + until: 1==0 + retries: 5 + delay: 0.01 + ignore_errors: true + +- name: validate output + shell: wc -l < {{ until_tempfile_path }} + register: runcount + +- assert: + that: runcount.stdout | int == 6 # initial + 5 retries + +- file: path="{{ until_tempfile_path }}" state=absent