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]<javascript:> > > 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] <javascript:>. >> To post to this group, send email to [email protected]<javascript:> >> . >> 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. For more options, visit https://groups.google.com/d/optout.
