# Nested loop in template

**URL:** <https://forum.ansible.com/t/nested-loop-in-template/21103>\
**Category:** Ansible Project\
**Created:** [April 8, 2016, 9:34am UTC](https://forum.ansible.com/t/nested-loop-in-template/21103 "2016-04-08T09:34:15Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![David\_Goodall](https://avatars.discourse-cdn.com/v4/letter/d/67e7ee/32.png) [@David\_Goodall](https://forum.ansible.com/u/David_Goodall)\
**Post date:** [April 8, 2016, 9:34am UTC](https://forum.ansible.com/t/nested-loop-in-template/21103/1 "2016-04-08T09:34:15Z")

</div>

Hi,

I’m trying to create an Apache vhost config file using a legacy yaml file _that I can’t change_.

I’m nearly there, but the nested loop in the template doesn’t work as expected.

Here’s the yaml:

sites:

[site1.com](http://site1.com/):

vhosts:

- [vhost1.com](http://vhost1.com/)

- [v](http://www.alpha.org/)[host2.com](http://host2.com/)

- [v](http://brand2014.test.alpha.org/)[host3.com](http://host3.com/)

other1: blah

other2: blah

etc

etc

[s](http://shop.alpha.org/)[ite50.com](http://ite50.com/):

vhosts:

- [v](http://shop.alpha.org/)[host51.com](http://host51.com/)

- [vhost52.com](http://vhost52.com/)

- [v](http://online.alpha.org/)[host53.com](http://host53.com/)

other1: blah

other2: blah

Here’s my play:

- name: Populate vhost config

template: src=httpd.j2 dest=/etc/httpd/conf.d/vhosts.conf

with\_dict: “{{ sites }}”

Here’s my template:

\<VirtualHost \*\>

{% for site in sites %}

ServerName {{ site }}

{% for vhost in item.value.vhosts %}

ServerAlias {{ vhost }}

{% endfor %}

DocumentRoot /var/www/html/{{ site }}

\<Directory /var/www/html/{{ site }}

AllowOverride All

Order allow,deny

Allow from All

{% endfor %}

Expected result:

\<VirtualHost \*\>

ServerName [site1.com](http://site1.com/)

ServerAlias [vhost1.com](http://vhost51.com/)

ServerAlias [vhost2.com](http://vhost52.com/)

ServerAlias [vhost3.com](http://vhost53.com/)

DocumentRoot /var/www/html/[site1.com](http://site1.com/)

\<Directory /var/www/html/[site1.com](http://site1.com/)

AllowOverride All

Order allow,deny

Allow from All

etc

etc

ServerName [site50.com](http://site50.com/)

ServerAlias [vhost51.com](http://vhost51.com/)

ServerAlias [vhost52.com](http://vhost52.com/)

ServerAlias [vhost53.com](http://vhost53.com/)

DocumentRoot /var/www/html/[site50.com](http://site50.com/)

\<Directory /var/www/html/[site50.com](http://site50.com/)

AllowOverride All

Order allow,deny

Allow from All

etc.

etc.

Actual result:

\<VirtualHost \*\>

ServerName [site1.com](http://site1.com/)

ServerAlias [vhost51.com](http://vhost51.com/)

ServerAlias [vhost52.com](http://vhost52.com/)

ServerAlias [vhost53.com](http://vhost53.com/)

DocumentRoot /var/www/html/[site1.com](http://site1.com/)

\<Directory /var/www/html/[site1.com](http://site1.com/)

AllowOverride All

Order allow,deny

Allow from All

etc

etc

ServerName [site50.com](http://site50.com/)

ServerAlias [vhost51.com](http://vhost51.com/)

ServerAlias [vhost52.com](http://vhost52.com/)

ServerAlias [vhost53.com](http://vhost53.com/)

DocumentRoot /var/www/html/[site50.com](http://site50.com/)

\<Directory /var/www/html/[site50.com](http://site50.com/)

AllowOverride All

Order allow,deny

Allow from All

etc.

etc.

---

<div class="post-metadata">

**Author:** ![David\_Goodall](https://avatars.discourse-cdn.com/v4/letter/d/67e7ee/32.png) [@David\_Goodall](https://forum.ansible.com/u/David_Goodall)\
**Post date:** [April 8, 2016, 2:00pm UTC](https://forum.ansible.com/t/nested-loop-in-template/21103/2 "2016-04-08T14:00:09Z")

</div>

Solved it - had to use “key,value” - here is the revised template:

\<VirtualHost \*\>  
{% for site,value in sites.iteritems() %}  
ServerName {{ site }}  
{% for vhost in value.vhosts %}  
ServerAlias {{ vhost }}  
{% endfor %}  
DocumentRoot /var/www/html/{{ site }}  
\<Directory /var/www/html/{{ site }}  
AllowOverride All  
Order allow,deny  
Allow from All  
  
{% endfor %}

iteritems() is there to get around the “too many values to unpack” problem.
