So I wrote a template task that populates this jinja template:

{{ hostvars['198.58.107.247'] }}

And this is the output I got:

{'ansible_ssh_user': 'root', 'inventory_hostname_short': '198', 
'group_names': ['webservers'], 'inventory_hostname': '198.58.107.247'}

So hostvars['198.58.107.247'] doesn't seem to be filled with all the facts 
for that host.  Then I realized that the root playbook I'm running (
provision.yml) looks like this:

---
- include: redisservers.yml
- include: webservers.yml

And the redisservers.yml playbook it includes looks like this:

---
- hosts: redisservers
  roles:
    - redis

And the *full* output I'm seeing from running the playbook looks like this 
(my emphasis):

PLAY [redisservers] 
*********************************************************** 

*GATHERING FACTS 
*************************************************************** *
*ok: [72.14.178.81]*

TASK: [redis | Allow port 6379 (Redis) access to Web servers] 
***************** 
fatal: [72.14.178.81] => One or more undefined variables: 'dict object' has 
no attribute 'ansible_eth0'

FATAL: all hosts have already failed -- aborting

So from the output it looks like it has only gathered facts for 72.14.178.81 
by the time the redisservers playbook runs.  Therefore I fixed my issue by 
changing the order of provision.yml, which runs the webservers playbook 
first and populates the facts for 198.58.107.247 before the redisservers 
playbook runs:

---
- include: webservers.yml
- include: redisservers.yml

Then I figured out that if I add a hosts: all line to provision.yml, it 
will gather facts for all hosts before running the included playbooks:

---
- hosts: all
- include: webservers.yml
- include: redisservers.yml

PLAY [all] 
******************************************************************** 

*GATHERING FACTS 
*************************************************************** *
*ok: [72.14.178.81]*
*ok: [198.58.107.247]*

PLAY [webservers] 
*************************************************************
... 

So that way I don't have worry about the order of playbook inclusion.  But 
this still seems kind of hacky... wouldn't it be better if there were a way 
to access hostvars in a manner that will just populate it for a host if it 
hasn't been populated yet?  Sort of a lazy evaluation?

On Thursday, August 28, 2014 12:19:24 PM UTC-5, Abe Voelker wrote:
>
> I have an inventory file like this:
>
> [redisservers]
> 72.14.178.81
>
> [webservers]
> 198.58.107.247
>
> I'm trying to run this playbook against the redisservers group to allow 
> access to port 6379 for the webservers:
>
> ---
> - name: Allow port 6379 (Redis) access to Web servers
>   ufw: rule=allow interface=eth0 direction=in port=6379 proto=tcp src="{{ 
> hostvars[item]['ansible_eth0']['ipv4']['address'] }}"
>   with_items: groups['webservers']
>
> But I'm getting this error:
>
> TASK: [redis | Allow port 6379 (Redis) access to Web servers] 
> ***************** 
> fatal: [72.14.178.81] => One or more undefined variables: 'dict object' 
> has no attribute 'ansible_eth0'
>
> FATAL: all hosts have already failed -- aborting
>
> I'm not sure what's going on as all servers definitely have an eth0 
> interface.  When I run ansible all -m setup -i inventory, the output 
> seems to confirm that there is an ansible_eth0 fact available for all 
> servers: https://gist.github.com/abevoelker/7a3c18f10793a744e6da
>
> I've tried simplifying the playbook to refer to the exact server in 
> question to remove the looping:
>
> ---
> - name: Allow port 6379 (Redis) access to Web servers
>   ufw: rule=allow interface=eth0 direction=in port=6379 proto=tcp src="{{ 
> hostvars[groups['webservers'][0]]['ansible_eth0']['ipv4']['address'] }}"
>
> and also
>
> ---
> - name: Allow port 6379 (Redis) access to Web servers
>   ufw: rule=allow interface=eth0 direction=in port=6379 proto=tcp src="{{ 
> hostvars['198.58.107.247']['ansible_eth0']['ipv4']['address'] }}"
>
> But I'm still getting the same error.
>
> Any hints as to what I'm doing wrong or how I can continue to debug this? 
>  I'm using Ansible 1.7.1.
>

-- 
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/792ddf1e-fdbf-430e-bb60-7647a554bbcb%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to