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.
For more options, visit https://groups.google.com/d/optout.