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/bb7d8061-4759-4583-a18e-95f831d7c7c9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.