In similar case A workaround I used  is to add 1 to your sequence count
see
https://mail.google.com/mail/#search/label%3Aansible+with_sequence/1435e13b34e3a0e1

Phil


2014-04-30 23:51 GMT+02:00 kesten broughton <[email protected]>:

> The error is
> fatal: [localhost] => can't count backwards
>
> This occurs whenever count=0 or start=M end=M
>
> If with_sequence is used for the purpose of bringing a system to a state =
> HAS N of something
> then there should be a way of running the playbook twice and not having
> anything new created.
> That's what i meant by idempotent.
>
>  "with sequence can't traverse a zero length list" accurately describes my
> concern
>
> kesten
>
> On Wednesday, April 30, 2014 3:03:56 PM UTC-5, Michael DeHaan wrote:
>
>> You are throwing two words together that have nothing to do with each
>> other.
>>
>> with_sequence is a loop.
>>
>> Idempotency is a mathematical statement that says "F(X) = F(F(X))" for
>> how many times X is applied.
>>
>> "This will work if M is strictly less than N, but if M=N (the idempotent
>> case) then ansible gives an error."
>>
>> What you have here is Ansible giving an error.  It has nothing to do with
>> idempotency.
>>
>> It may imply "with sequence can't traverse a zero length list", which
>> more accurately describes the problem.
>>
>> So, the best thing to do here is to share what the error is and we can go
>> from there.
>>
>>
>>
>>
>>
>>
>> On Wed, Apr 30, 2014 at 9:34 AM, Kesten Broughton <[email protected]
>> > wrote:
>>
>>>
>>> I recently had a need for with_sequence, but it doesn't seem possible to
>>> do a zero count of actions.
>>>
>>> Suppose i have a local action to create N things, perhaps vms or
>>> floating ips.  Some number M < N may already be present.
>>>
>>> I'd like to do
>>>
>>> hosts: localhost
>>> vars:
>>>    expected_foo_count: 10
>>>
>>>  - name: Get the number of foos
>>>    shell: echo M
>>>    register: foo_count
>>>
>>>  - name: Create the missing number of foos
>>>    shell: make_new_foos
>>>    with_sequence: start=0 end="{{expected_foo_count -foo_count.stdout }}"
>>>
>>> or  with_sequence: count="{{expected_foo_count - foo_count.stdout}}"
>>>
>>> This will work if M is strictly less than N, but if M=N (the idempotent
>>> case) then ansible gives an error.
>>>
>>> fatal: [localhost] => can't count backwards
>>> I tried putting a "when" guard such as
>>>  when: "{{ expected_foo_count - foo_count.stdout > 0 }}"
>>>
>>> But it appears "when" gets evaluated after the with_sequence
>>> conditional.  That in itself poses problems, since in branching code the
>>> register variables may not be defined and you have to litter code with
>>> when: "{{ (register_var or '') | conditional }}".
>>>
>>> The problem with the with_sequence is in the lib/ansible/runner/lookup_
>>> plugins/sequence.py
>>>
>>>     def generate_sequence(self):
>>>         numbers = xrange(self.start, self.end+1, self.stride)
>>>
>>> which means that contrary to conventional python such as
>>> range(a,b) which gives a sequence starting at 'a' and ending at 'b-1',
>>> ie. [a,b)
>>>
>>> with_sequence: start=n end=m
>>>
>>> runs over the sequence [n,m].  If n=m with_sequence still executes once,
>>> so there is no possible way to have a with_sequence that runs zero times.
>>>
>>> changing the generate_sequence code to
>>>
>>>     def generate_sequence(self):
>>>         numbers = xrange(self.start, self.end, self.stride)
>>>
>>> Fixes the problem.
>>>
>>> Is there a design reason behind not allowing for zero count sequences?
>>>  If so, how can a playbook including with_sequence be made idempotent?
>>>
>>> kesten
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Ansible Project" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>>
>>> To view this discussion on the web visit https://groups.google.com/d/
>>> msgid/ansible-project/CAO2fFsVLwC6qoVKReu--
>>> zjyfOwUA1KUJQWy2cG36nmHRietk0g%40mail.gmail.com<https://groups.google.com/d/msgid/ansible-project/CAO2fFsVLwC6qoVKReu--zjyfOwUA1KUJQWy2cG36nmHRietk0g%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
> You received this message because you are subscribed to the Google Groups
> "Ansible Project" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ansible-project/263df645-0b20-419b-ae3f-2cdff75280f5%40googlegroups.com<https://groups.google.com/d/msgid/ansible-project/263df645-0b20-419b-ae3f-2cdff75280f5%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/CAB1FMuRtRuqTuHmW6DCJkiMMFKXPrXVj1UBV22GuzQgkvGyWPQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to