# Why no variable substitution in top level includes?

**URL:** <https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624>\
**Category:** Ansible Project\
**Created:** [February 21, 2014, 7:47pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624 "2014-02-21T19:47:54Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![anatoly\_techtonik](https://avatars.discourse-cdn.com/v4/letter/a/c67d28/32.png) [@anatoly\_techtonik](https://forum.ansible.com/u/anatoly_techtonik)\
**Post date:** [February 21, 2014, 7:47pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/1 "2014-02-21T19:47:54Z")

</div>

From [http://docs.ansible.com/playbooks\_roles.html#task-include-files-and-encouraging-reuse](http://docs.ansible.com/playbooks_roles.html#task-include-files-and-encouraging-reuse)

> Note that you cannot do variable substitution when including one playbook inside another.

I actually wanted to do this in my - setup-new-server.yml playbook:

- include: client-dns-setup.yml host=new-server

But it looks this is impossible. Why?

P.S. It is possible to [turn on pasting of code snippets](https://code.google.com/p/rainforce/wiki/GoogleCodeChecklist#Make_your_project_accessible) in Google Groups settings.  
P.P.S. Ansible was very awesome so far. =)

---

<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:** [February 21, 2014, 7:52pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/2 "2014-02-21T19:52:13Z")

</div>

Variable substitution works, just not with inventory variables, which confuses people a lot.

---

<div class="post-metadata">

**Author:** ![anatoly\_techtonik](https://avatars.discourse-cdn.com/v4/letter/a/c67d28/32.png) [@anatoly\_techtonik](https://forum.ansible.com/u/anatoly_techtonik)\
**Post date:** [February 21, 2014, 7:58pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/3 "2014-02-21T19:58:02Z")

</div>

Just to clarify - do you mean inventory variables in included files are immune? Because I am passing a hardcoded string as playbook parameter.

---

<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:** [February 21, 2014, 7:59pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/4 "2014-02-21T19:59:38Z")

</div>

include gets evaluated before hosts are included and you cannot use a inventory variable (host dependant) in the include.

Think of it as a ‘preprocessing macro’ more than a task.

---

<div class="post-metadata">

**Author:** ![anatoly\_techtonik](https://avatars.discourse-cdn.com/v4/letter/a/c67d28/32.png) [@anatoly\_techtonik](https://forum.ansible.com/u/anatoly_techtonik)\
**Post date:** [February 21, 2014, 8:22pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/5 "2014-02-21T20:22:41Z")

</div>

> include gets evaluated before hosts are included and you cannot use a inventory variable (host dependant) in the include.
> 
> Think of it as a ‘preprocessing macro’ more than a task.

I still don’t get it. I have the file showdist.yml:

> * * *
> 
> - hosts: “{{ host | default(‘localhost’) }}”  
> tasks:
> - name: show OS version info  
> debug: msg=“{{ansible\_distribution}} {{ansible\_distribution\_version}}”

Now I include it from main playbook.yml:

> * * *
> 
> - hosts: localhost
> - include: showdist.yml

It fails with:

PLAY [otherhost] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
skipping: no hosts matched

But when I do this:

> * * *
> 
> - hosts: localhost
> - include: showdist.yml host=‘localhost’

It works. And I am surprised, because for more complicated file it didn’t work.

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan1](https://avatars.discourse-cdn.com/v4/letter/m/5e9695/32.png) [@Michael\_DeHaan1](https://forum.ansible.com/u/Michael_DeHaan1)\
**Post date:** [February 21, 2014, 8:47pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/6 "2014-02-21T20:47:36Z")

</div>

> - include: showdist.yml host=‘localhost’

You have no variables here, so this is not an inventory variable substitution issue.

But you would be setting a variable called “host” that has no special meaning for Ansible.

Minor pet-peeve/process note – when you say something doesn’t work, share what it did, and what it expected to do. I don’t know what “doesn’t work” means 80% of the time.

---

<div class="post-metadata">

**Author:** ![anatoly\_techtonik](https://avatars.discourse-cdn.com/v4/letter/a/c67d28/32.png) [@anatoly\_techtonik](https://forum.ansible.com/u/anatoly_techtonik)\
**Post date:** [February 23, 2014, 6:33am UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/7 "2014-02-23T06:33:38Z")

</div>

Let me try again:

**playbook.yml** - this file doesn’t change  
`

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan1](https://avatars.discourse-cdn.com/v4/letter/m/5e9695/32.png) [@Michael\_DeHaan1](https://forum.ansible.com/u/Michael_DeHaan1)\
**Post date:** [February 23, 2014, 1:54pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/8 "2014-02-23T13:54:02Z")

</div>

The basics here are that task includes can pass parameters, playbook includes never had that implemented.

---

<div class="post-metadata">

**Author:** ![anatoly\_techtonik](https://avatars.discourse-cdn.com/v4/letter/a/c67d28/32.png) [@anatoly\_techtonik](https://forum.ansible.com/u/anatoly_techtonik)\
**Post date:** [February 24, 2014, 5:06am UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/9 "2014-02-24T05:06:32Z")

</div>

But both examples are playbook includes. Is it a bug?

---

<div class="post-metadata">

**Author:** ![anatoly\_techtonik](https://avatars.discourse-cdn.com/v4/letter/a/c67d28/32.png) [@anatoly\_techtonik](https://forum.ansible.com/u/anatoly_techtonik)\
**Post date:** [February 24, 2014, 5:10am UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/10 "2014-02-24T05:10:06Z")

</div>

Does this one means that 1.5.0 will have this implemented?  
[https://github.com/ansible/ansible/issues/5801](https://github.com/ansible/ansible/issues/5801)

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan1](https://avatars.discourse-cdn.com/v4/letter/m/5e9695/32.png) [@Michael\_DeHaan1](https://forum.ansible.com/u/Michael_DeHaan1)\
**Post date:** [February 24, 2014, 1:12pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/11 "2014-02-24T13:12:13Z")

</div>

“But both examples are playbook includes. Is it a bug?”

Not really, there’s not an attach point for variables at that level.

-e sets global variables, task level include variables are a thing, etc.

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan1](https://avatars.discourse-cdn.com/v4/letter/m/5e9695/32.png) [@Michael\_DeHaan1](https://forum.ansible.com/u/Michael_DeHaan1)\
**Post date:** [February 24, 2014, 1:14pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/12 "2014-02-24T13:14:13Z")

</div>

Ok, I stand corrected, this is interjecting into the vars field.

I can’t say I understand the details of James’s patch as the dict constructor should be equivalent.

---

<div class="post-metadata">

**Author:** ![anatoly\_techtonik](https://avatars.discourse-cdn.com/v4/letter/a/c67d28/32.png) [@anatoly\_techtonik](https://forum.ansible.com/u/anatoly_techtonik)\
**Post date:** [February 26, 2014, 4:49pm UTC](https://forum.ansible.com/t/why-no-variable-substitution-in-top-level-includes/14624/13 "2014-02-26T16:49:52Z")

</div>

I still don't understand. There are different levels of variables, but  
how do they stacked and overriden?

Is it like this? (I can't check right now)

[globals] (-e) - variable overrides everything below if set  
[playbook] (vars section) - variable is accessible by includes  
[task include] (no vars section) - uses variables from caller  
[top include] (no vars section) - uses variables from caller  
[top include] (vars section) - replaces all vars from levels above
