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.

Reply via email to