I came to the same conclusion: We have separate playbooks now. Learned a lot along the way.
Thanks for the comments! On May 31, 2014 12:24 PM, "Michael DeHaan" <[email protected]> wrote: > Last line should be "might not work for your use case" > > > > > > On Sat, May 31, 2014 at 12:24 PM, Michael DeHaan <[email protected]> > wrote: > >> "- hosts: "{{ outgoing|default(['no-match']) }}[0]" >> >> In Ansible, the general rule is if something looks ungainly like this, >> don't do it :) >> >> I would probably consider having one playbook that includes another list >> of plays, and running either the top level one or the second one depending >> on whether you need to do the second step. >> >> Might not work for you to me. >> >> >> On Fri, May 30, 2014 at 1:15 PM, Steve Ims <[email protected]> >> wrote: >> >>> After closer inspection: The posted playbook works for bootstrap (first >>> run), but not beyond. >>> >>> Seems that "outgoing" is not defined in the Jinja template on the second >>> play, so the default value ('no-match') is always used. >>> >>> Seems that "groups" is also not available in the Jinja template (e.g. >>> groups.outgoing). >>> >>> Is there a way to access groups within the template ("{{ ... }}") ? >>> >>> Thanks. >>> >>> >>> >>> On Thursday, May 29, 2014 1:44:44 PM UTC-4, Steve Ims wrote: >>>> >>>> Sorry for the spam, but I just stumbled upon a possible solution >>>> <https://groups.google.com/forum/#!topic/ansible-project/eqNR_RdC0jg> that >>>> uses Jinja's "default" filter. >>>> >>>> I modified hosts in the second play to default to a list with one item >>>> that doesn't match any of our hosts. >>>> >>>> The 'no-match' still feels like a hack, but has allowed us to use one >>>> playbook for bootstrap (first run) and beyond. >>>> >>>> Still appreciate any pointers if there's a better way :-) >>>> >>>> Thanks. >>>> >>>> >>>> --- >>>> - hosts: "group_{{ outgoing_version }}:&group2" >>>> gather_facts: no >>>> >>>> tasks: >>>> - group_by: key=outgoing >>>> >>>> >>>> - hosts: "{{ outgoing|default(['no-match']) }}[0]" >>>> gather_facts: no >>>> >>>> tasks: >>>> - command: do some work >>>> >>>> >>>> >>>> On Thursday, May 29, 2014 12:57:42 PM UTC-4, Steve Ims wrote: >>>>> >>>>> Clarification: Our playbook also includes plays for the incoming >>>>> servers interleaved with plays for the outgoing servers. Hoping to avoid >>>>> one playbook for only incoming servers -- and another for incoming + >>>>> outgoing servers (would have duplication). >>>>> >>>>> >>>>> >>>>> On Thursday, May 29, 2014 12:49:31 PM UTC-4, Steve Ims wrote: >>>>>> >>>>>> Michael's suggestion is working fine in our existing system. >>>>>> >>>>>> I've now hit a bootstrapping problem when applying this to a new >>>>>> system, which results in "list index out of range" error. >>>>>> >>>>>> We're automating replacement of servers behind a reverse proxy from >>>>>> one set to another. With each transition, we must execute a command on >>>>>> one >>>>>> of the outgoing servers. Our current playbook works fine when there is >>>>>> an >>>>>> outgoing server -- but in a new system, there is no outgoing server on >>>>>> the >>>>>> first run. >>>>>> >>>>>> Following is the relevant portion of our playbook. When applied on a >>>>>> first run to our new system, "outgoing_version" is empty. The pattern >>>>>> "group_:&group2" contains no hosts, so the first task is not run. Not >>>>>> surprisingly, we then hit an error on the second hosts pattern because >>>>>> "outgoing" is not defined. >>>>>> >>>>>> Is there a proper way to do this with Ansible? Perhaps some way to >>>>>> mark the second play conditional on "outgoing" being defined? >>>>>> >>>>>> Thanks! >>>>>> >>>>>> >>>>>> --- >>>>>> - hosts: "group_{{ outgoing_version }}:&group2" >>>>>> gather_facts: no >>>>>> >>>>>> tasks: >>>>>> - group_by: key=outgoing >>>>>> >>>>>> >>>>>> - hosts: outgoing[0] >>>>>> gather_facts: no >>>>>> >>>>>> tasks: >>>>>> - command: do some work >>>>>> >>>>>> >>>>>> Console output while running the playbook: >>>>>> >>>>>> PLAY [group_{{outgoing_version}}:&group2] *** >>>>>> skipping: no hosts matched >>>>>> >>>>>> PLAY [outgoing[0]] ****************************** >>>>>> ********************** >>>>>> Traceback (most recent call last): >>>>>> ... >>>>>> IndexError: list index out of range >>>>>> >>>>>> >>>>>> >>>>>> On Tuesday, May 27, 2014 6:00:45 PM UTC-4, Steve Ims wrote: >>>>>>> >>>>>>> Much better. >>>>>>> >>>>>>> Thanks for the example. Good lesson: Playbooks may contain >>>>>>> multiple "hosts". >>>>>>> >>>>>>> Thanks for the help! >>>>>>> >>>>>>> >>>>>>> On Sunday, May 25, 2014 4:58:45 PM UTC-4, Michael DeHaan wrote: >>>>>>>> >>>>>>>> The Ansible way would prefer it simpler. >>>>>>>> >>>>>>>> Here's how you select the first node out of a group: >>>>>>>> >>>>>>>> - hosts: groupname[0] >>>>>>>> tasks: >>>>>>>> - ... >>>>>>>> >>>>>>>> Here's how you select a node that is in two groups: >>>>>>>> >>>>>>>> - hosts: group1:&group2 >>>>>>>> >>>>>>>> Here's how you would select a node that is in two groups and make a >>>>>>>> group of the union: >>>>>>>> >>>>>>>> - hosts: group1:&group2 >>>>>>>> tasks: >>>>>>>> - group_by: key=groupOneAndTwo >>>>>>>> >>>>>>>> Here's how you would then pick the first host out of that group >>>>>>>> >>>>>>>> - hosts: groupOneAndTwo[0] >>>>>>>> tasks: >>>>>>>> - shell: echo I am the first node in both! >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Sat, May 24, 2014 at 10:29 PM, Steve Ims <[email protected]> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Found a brute-force solution: >>>>>>>>> >>>>>>>>> $ ipaddr=$(ansible "tag_version_1:&tag_role_foo" --list-hosts | >>>>>>>>> head -n 2 | tail -n 1) >>>>>>>>> $ ansible ${ipaddr} -m ping >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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/ >>>>>>>>> 1d872c11-4b70-487b-810a-bf7bc0d0dedd%40googlegroups.com. >>>>>>>>> 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/59f9c66f-c417-444e-a568-ffa8b4c171e8%40googlegroups.com >>> <https://groups.google.com/d/msgid/ansible-project/59f9c66f-c417-444e-a568-ffa8b4c171e8%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 a topic in the > Google Groups "Ansible Project" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/ansible-project/cuegEj7M0KA/unsubscribe. > To unsubscribe from this group and all its topics, 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/CA%2BnsWgwfEy97EWJ%3DrqcbdwzjnTHN1%2B8wZeyt%2BQKfReq129qjDw%40mail.gmail.com > <https://groups.google.com/d/msgid/ansible-project/CA%2BnsWgwfEy97EWJ%3DrqcbdwzjnTHN1%2B8wZeyt%2BQKfReq129qjDw%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/CAF-z5MtJiT86tKpxhO4%3DqggyRa37YGUOWRo%2BrPhFvAMLG2ncSQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
