diff --git a/lib/ansible/runner/lookup_plugins/sequence.py b/lib/ansible/runner/lookup_plugins/sequence.py index b162b3069e..68b0bbec90 100644 --- a/lib/ansible/runner/lookup_plugins/sequence.py +++ b/lib/ansible/runner/lookup_plugins/sequence.py @@ -151,15 +151,26 @@ class LookupModule(object): ) elif self.count is not None: # convert count to end - self.end = self.start + self.count * self.stride - 1 + if self.count != 0: + self.end = self.start + self.count * self.stride - 1 + else: + self.start = 0 + self.end = 0 + self.stride = 0 del self.count - if self.end < self.start: - raise AnsibleError("can't count backwards") + if self.stride > 0 and self.end < self.start: + raise AnsibleError("to count backwards make stride negative") + if self.stride < 0 and self.end > self.start: + raise AnsibleError("to count forward don't make stride negative") if self.format.count('%') != 1: raise AnsibleError("bad formatting string: %s" % self.format) def generate_sequence(self): - numbers = xrange(self.start, self.end + 1, self.stride) + if self.stride > 0: + adjust = 1 + else: + adjust = -1 + numbers = xrange(self.start, self.end + adjust, self.stride) for i in numbers: try: @@ -193,12 +204,13 @@ class LookupModule(object): self.sanity_check() - results.extend(self.generate_sequence()) + if self.start != self.end: + results.extend(self.generate_sequence()) except AnsibleError: raise - except Exception: + except Exception, e: raise AnsibleError( - "unknown error generating sequence" + "unknown error generating sequence: %s" % str(e) ) return results diff --git a/test/integration/roles/test_iterators/tasks/main.yml b/test/integration/roles/test_iterators/tasks/main.yml index c95eaff3da..b9592aba2f 100644 --- a/test/integration/roles/test_iterators/tasks/main.yml +++ b/test/integration/roles/test_iterators/tasks/main.yml @@ -60,6 +60,10 @@ set_fact: "{{ 'x' + item }}={{ item }}" with_sequence: start=0 end=3 +- name: test with_sequence backwards + set_fact: "{{ 'y' + item }}={{ item }}" + with_sequence: start=3 end=0 stride=-1 + - name: verify with_sequence assert: that: @@ -67,6 +71,20 @@ - "x1 == '1'" - "x2 == '2'" - "x3 == '3'" + - "y3 == '3'" + - "y2 == '2'" + - "y1 == '1'" + - "y0 == '0'" + +- name: test with_sequence not failing on count == 0 + debug: msg='previously failed with backward counting error' + with_sequence: count=0 + register: count_of_zero + +- assert: + that: + - count_of_zero | skipped + - not count_of_zero | failed # WITH_RANDOM_CHOICE