Just in case someone else had similar problem, the solution was to add
"serial: 1" to the playbook otherwise the execution is parallel thus only
the last host preprocessed ends up in the group.
Simple example /etc/ansible/hosts-group inventory:
[group-tomcat]
10.22.0.43 server_name=app11 ec2_private_dns_name=ip-10-22-0-43
10.22.10.35 server_name=app21 ec2_private_dns_name=ip-10-22-10-35
Simple test33.yml playbook:
---
- hosts: '{{ tomcats }}'
connection: local
serial: 1
gather_facts: no
tasks:
- add_host: hostname={{ ec2_private_dns_name }} groupname=backends
server_name={{ server_name }}
The idea is to create a new in-memory group out of a group passed on in the
input.
Without "serial: 1":
$ ansible-playbook -i /etc/ansible/hosts-group test33.yml --extra-vars '{
"tomcats" : "group-tomcat" }' --verbose
PLAY [group-tomcat] *******************************************************
TASK: [add_host hostname={{ ec2_private_dns_name }} groupname=backends
server_name={{ server_name }}] ***
ok: [10.22.0.43] => {"new_groups": ["backends"], "new_host":
"ip-10-22-0-43"}
PLAY RECAP
********************************************************************
add_host hostname={{ ec2_private_dns_name }} groupname=backends
server_name={{ server_name }} --- 0.01s
10.22.0.43 : ok=1 changed=0 unreachable=0 failed=0
10.22.10.35 : ok=1 changed=0 unreachable=0 failed=0
With "serial: 1":
$ ansible-playbook -i /etc/ansible/hosts-group test33.yml --extra-vars '{
"tomcats" : "group-tomcat" }' --verbose
PLAY [group-tomcat] *******************************************************
TASK: [add_host hostname={{ ec2_private_dns_name }} groupname=backends
server_name={{ server_name }}] ***
ok: [10.22.0.43] => {"new_groups": ["backends"], "new_host":
"ip-10-22-0-43"}
TASK: [add_host hostname={{ ec2_private_dns_name }} groupname=backends
server_name={{ server_name }}] ***
ok: [10.22.10.35] => {"new_groups": ["backends"], "new_host":
"ip-10-22-10-35"}
PLAY RECAP
********************************************************************
add_host hostname={{ ec2_private_dns_name }} groupname=backends
server_name={{ server_name }} --- 0.00s
10.22.0.43 : ok=1 changed=0 unreachable=0
failed=0
10.22.10.35 : ok=1 changed=0 unreachable=0 failed=0
The difference in the execution is obvious.
On Monday, May 12, 2014 1:08:48 PM UTC+10, Igor Cicimov wrote:
>
> Thanks Michael your suggestions noted. I did some more testing and looks
> like only one single instance, assuming the last instance, from the
> inventory is being added to the group, and this is without any conditions.
> Very simple playbook example:
>
> ---
> - hosts: ec2
> gather_facts: False
> connection: local
> vars:
> ec2ip: "{{ hostvars[inventory_hostname]['ec2_publicIp'] }}"
> ec2dns: "{{ hostvars[inventory_hostname]['ec2_public_dns_name'] }}"
> tasks:
> - add_host: "hostname={{ ec2ip }} groupname=ec2hosts server_name={{
> ec2dns }}"
>
> and I get only one single host in the ec2hosts group:
>
> PLAY [ec2]
> ********************************************************************
>
> TASK: [add_host hostname={{hostvars[inventory_hostname]['ec2_publicIp']}}
> groupname=ec2hosts
> server_name={{hostvars[inventory_hostname]['ec2_public_dns_name']}}] ***
> ok: [instance_public_ip_obscured] => {"new_groups": ["ec2hosts"],
> "new_host": "instance_public_ip_obscured"}
>
> Looks like this is not working the way I assume. From what I can see I
> have 52 instances in the current ec2 inventory cache:
>
> $ cat ~/.ansible/tmp/ansible-ec2.cache | grep region | sort | uniq -c
> 47 "ec2_region": "ap-southeast-2",
> 5 "ec2_region": "eu-west-1",
>
> Thanks,
> Igor
>
> On Saturday, May 10, 2014 9:56:37 AM UTC+10, Michael DeHaan wrote:
>>
>> A few things to cleanup first:
>>
>> " - add_host: hostname={{ hostvars[inventory_hostname]['ec2_publicIp']
>> }} groupname=ec2hosts server_name={{
>> hostvars[inventory_hostname]['ec2_public_dns_name']
>> }}"
>>
>> When you get ginormous variables like this, slow down, and define useful
>> shortcuts in your "vars" section, like this:
>>
>> vars:
>> ec2ip: "{{ hostvars[inventory_hostname]['ec2_publicIp'] }}"
>>
>> This allows cleaner playbooks like:
>>
>> " - add_host: hostname={{ ec2ip }} groupname=ec2hosts server_name={{
>> ec2dns }}"
>>
>> etc
>>
>> That's unrelated though.
>>
>> Also this is overkill:
>>
>> when: hostvars[inventory_hostname]['ec2_region'] ==
>> 'ap-southeast-2'
>>
>> Could have just been:
>>
>> when: "ec2_region == 'ap-southeast-2'"
>>
>> Ansible likes it simple.
>>
>>
>>
>>
>>
>>
>>
>> On Thu, May 8, 2014 at 2:32 AM, Igor Cicimov <
>> [email protected]> wrote:
>>
>>> Hi all,
>>>
>>> I have the following playbook trying to create a subgroup out of my ec2
>>> dynamic inventory with instances matching given tags:
>>>
>>> ---
>>> - hosts: ec2
>>> gather_facts: False
>>> connection: local
>>> tasks:
>>> - add_host: hostname={{
>>> hostvars[inventory_hostname]['ec2_publicIp'] }} groupname=ec2hosts
>>> server_name={{ hostvars[inventory_hostname]['ec2_public_dns_name'] }}
>>> when: hostvars[inventory_hostname]['ec2_region'] ==
>>> 'ap-southeast-2'
>>> and hostvars[inventory_hostname]['ec2_tag_Role'] ~
>>> 'application'
>>> and hostvars[inventory_hostname]['ec2_tag_Type'] == 'tomcat'
>>>
>>> - hosts: ec2hosts
>>> gather_facts: True
>>> remote_user: user1
>>> sudo: True
>>> tasks:
>>> # fetch instance data from the metadata servers in ec2
>>> - ec2_facts:
>>>
>>> # show all known facts for this host
>>> - debug: var=hostvars[inventory_hostname]
>>>
>>> # just show the instance-id
>>> - debug: msg="{{
>>> hostvars[inventory_hostname]['ansible_ec2_instance-id'] }}"
>>>
>>>
>>> This is the result of its run:
>>>
>>> PLAY [ec2]
>>> ********************************************************************
>>>
>>> TASK: [add_host
>>> hostname={{hostvars[inventory_hostname]['ec2_publicIp']}}
>>> groupname=ec2hosts
>>> server_name={{hostvars[inventory_hostname]['ec2_public_dns_name']}}] ***
>>> skipping: [54.72.64.112]
>>>
>>> PLAY [ec2hosts]
>>> ***************************************************************
>>> skipping: no hosts matched
>>>
>>>
>>> The instances are being picked up correctly, I confirmed that with debug
>>> output, but looks like the group is not being populated correctly. I'm
>>> probably missing something here since looks like the supposed loop is not
>>> happening.
>>>
>>> Can anyone spot what am I doing wrong here?
>>>
>>> Thanks,
>>> Igor
>>>
>>> --
>>> 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/dd9eb356-287a-49ed-81cc-465623a4aa77%40googlegroups.com
>>>
>>> <https://groups.google.com/d/msgid/ansible-project/dd9eb356-287a-49ed-81cc-465623a4aa77%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 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/d83c647b-ef0b-44fd-a545-fc38122d794a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.