# Ansible playbook hostvars undefined variables

**URL:** <https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114>\
**Category:** Ansible Project\
**Created:** [December 10, 2013, 4:24pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114 "2013-12-10T16:24:52Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![Vasiliy\_Boulytchev](https://avatars.discourse-cdn.com/v4/letter/v/f19dbf/32.png) [@Vasiliy\_Boulytchev](https://forum.ansible.com/u/Vasiliy_Boulytchev)\
**Post date:** [December 10, 2013, 4:24pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/1 "2013-12-10T16:24:52Z")

</div>

Folks, The following code is producing errors.

code:

```auto
{% for v in hostvars.iteritems() %}
    {{ v['ansible_all_ipv4_addresses'][0] }} {{ v['ansible_hostname'] }}
{% endfor %}

```

error:

```auto
{'msg': "One or more undefined variables: 'tuple object' has no attribute 'ansible_all_ipv4_addresses'", 'failed': True}

```

What should this look like if i wanted an /etc/hosts file like:

```auto
192.168.111.222 hostnameA
192.168.111.211 hostnameB
...

```

Thanks!

---

<div class="post-metadata">

**Author:** ![tannerjc](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/tannerjc/32/985_2.png) [@tannerjc](https://forum.ansible.com/u/tannerjc)\
**Post date:** [December 10, 2013, 5:11pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/2 "2013-12-10T17:11:15Z")

</div>

iteritems() returns a tuple so you need to assign two variables: {% for k,v in hostvars.iteritems() %} {{ k }} {{ v[‘ansible\_all\_ipv4\_addresses’][0] }} {{ v[‘ansible\_hostname’] }} {% endfor %} “k” will be the inventory hostname and “v” will be all of the vars for k. Example output: jtanner@u1304:~$ cat /tmp/vadata.txt localhost 192.168.1.105 u1304

---

<div class="post-metadata">

**Author:** ![Vasiliy\_Boulytchev](https://avatars.discourse-cdn.com/v4/letter/v/f19dbf/32.png) [@Vasiliy\_Boulytchev](https://forum.ansible.com/u/Vasiliy_Boulytchev)\
**Post date:** [December 10, 2013, 5:44pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/3 "2013-12-10T17:44:52Z")

</div>

James,  
The following is breaking as well:

{% for k,v in hostvars.iteritems() %}  
{{ v[‘ansible\_all\_ipv4\_addresses’][0] }} {{ v[‘ansible\_hostname’] }}  
{% endfor %}

---

<div class="post-metadata">

**Author:** ![tannerjc](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/tannerjc/32/985_2.png) [@tannerjc](https://forum.ansible.com/u/tannerjc)\
**Post date:** [December 10, 2013, 5:47pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/4 "2013-12-10T17:47:51Z")

</div>

Let’s see your playbook. I have a feeling that you aren’t gathering facts.

---

<div class="post-metadata">

**Author:** ![Brian\_Coca1](https://avatars.discourse-cdn.com/v4/letter/b/278dde/32.png) [@Brian\_Coca1](https://forum.ansible.com/u/Brian_Coca1)\
**Post date:** [December 10, 2013, 5:57pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/5 "2013-12-10T17:57:38Z")

</div>

Are you gathering facts?

Do those facts show ansible\_all\_ipv4\_addresses? This is not present on all distros, for example fails to populate on my gentoo machines.

ansible -m setup |less, will give you a full view of supported facts on the target.

---

<div class="post-metadata">

**Author:** ![Vasiliy\_Boulytchev](https://avatars.discourse-cdn.com/v4/letter/v/f19dbf/32.png) [@Vasiliy\_Boulytchev](https://forum.ansible.com/u/Vasiliy_Boulytchev)\
**Post date:** [December 10, 2013, 6:02pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/6 "2013-12-10T18:02:36Z")

</div>

Facts are being gathered:

```auto
GATHERING FACTS *************************************************************** 
ok: [foo.us-west-2.compute.internal]
ok: [bar.us-west-2.compute.internal]
ok: [baz.us-west-2.compute.internal]

```

---

<div class="post-metadata">

**Author:** ![tannerjc](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/tannerjc/32/985_2.png) [@tannerjc](https://forum.ansible.com/u/tannerjc)\
**Post date:** [December 10, 2013, 6:05pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/7 "2013-12-10T18:05:23Z")

</div>

Let’s see if you have any hostvars … {% for k,v in hostvars.iteritems() %} {{ k }} {{ v }}

---

<div class="post-metadata">

**Author:** ![Vasiliy\_Boulytchev](https://avatars.discourse-cdn.com/v4/letter/v/f19dbf/32.png) [@Vasiliy\_Boulytchev](https://forum.ansible.com/u/Vasiliy_Boulytchev)\
**Post date:** [December 10, 2013, 6:31pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/8 "2013-12-10T18:31:14Z")

</div>

Both  
u’ansible\_hostname’: u’ip-10-72-97-33’  
u’ansible\_all\_ipv4\_addresses’: [u’10.72.97.33’]

are present…

---

<div class="post-metadata">

**Author:** ![tannerjc](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/tannerjc/32/985_2.png) [@tannerjc](https://forum.ansible.com/u/tannerjc)\
**Post date:** [December 10, 2013, 6:45pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/9 "2013-12-10T18:45:08Z")

</div>

But do they have the keys you are looking for?

---

<div class="post-metadata">

**Author:** ![Vasiliy\_Boulytchev](https://avatars.discourse-cdn.com/v4/letter/v/f19dbf/32.png) [@Vasiliy\_Boulytchev](https://forum.ansible.com/u/Vasiliy_Boulytchev)\
**Post date:** [December 10, 2013, 7:23pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/10 "2013-12-10T19:23:03Z")

</div>

Absolutely. The keys are present.

I’ve been able to narrow it down to the following:

work:

{% for k,v in hostvars.iteritems() %}  
{{ v[‘ansible\_all\_ipv4\_addresses’] }} {{ v[‘ansible\_hostname’] }}  
{% endfor %}

doesnt:

{% for k,v in hostvars.iteritems() %}  
{{ v[‘ansible\_all\_ipv4\_addresses’][0] }} {{ v[‘ansible\_hostname’] }}  
{% endfor %}

---

<div class="post-metadata">

**Author:** ![tannerjc](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/tannerjc/32/985_2.png) [@tannerjc](https://forum.ansible.com/u/tannerjc)\
**Post date:** [December 10, 2013, 7:31pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/11 "2013-12-10T19:31:52Z")

</div>

What values do you get in your template for those keys?

---

<div class="post-metadata">

**Author:** ![Vasiliy\_Boulytchev](https://avatars.discourse-cdn.com/v4/letter/v/f19dbf/32.png) [@Vasiliy\_Boulytchev](https://forum.ansible.com/u/Vasiliy_Boulytchev)\
**Post date:** [December 11, 2013, 10:01pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/12 "2013-12-11T22:01:18Z")

</div>

Solution:

{% for minion in groups[‘rabbit’] %}  
{{ hostvars[minion][‘ansible\_all\_ipv4\_addresses’][0] }} {{ hostvars[minion][‘ansible\_hostname’] }}  
{% endfor %}

Why didnt this work? :

{% for v in hostvars.iteritems() %}  
{{ v[‘ansible\_all\_ipv4\_addresses’][0] }} {{ v[‘ansible\_hostname’] }}  
{% endfor %}

Thanks Guys!

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan2](https://avatars.discourse-cdn.com/v4/letter/m/da6949/32.png) [@Michael\_DeHaan2](https://forum.ansible.com/u/Michael_DeHaan2)\
**Post date:** [December 11, 2013, 10:22pm UTC](https://forum.ansible.com/t/ansible-playbook-hostvars-undefined-variables/14114/13 "2013-12-11T22:22:54Z")

</div>

hostvars.iteritems returns aset of (key,value) so in your case I suspect you are getting a tuple.

{% for (host,facts) in hostvars.iteritems() %}

would be what you would want if doing the above.
