From 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 in Google Groups settings.
P.P.S. Ansible was very awesome so far. =)
             
            
              
              
              
            
            
           
          
            
            
              Variable substitution works, just not with inventory variables, which confuses people a lot.
             
            
              
              
              
            
            
           
          
            
            
              Just to clarify - do you mean inventory variables in included files are immune? Because I am passing a hardcoded string as playbook parameter.
             
            
              
              
              
            
            
           
          
            
            
              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.
             
            
              
              
              
            
            
           
          
            
            
              
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.
             
            
              
              
              
            
            
           
          
            
            
              
- 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.
             
            
              
              
              
            
            
           
          
            
            
              Let me try again:
playbook.yml - this file doesn’t change
`
             
            
              
              
              
            
            
           
          
            
            
              The basics here are that task includes can pass parameters, playbook includes never had that implemented.
             
            
              
              
              
            
            
           
          
            
            
              But both examples are playbook includes. Is it a bug?
             
            
              
              
              
            
            
           
          
            
            
              Does this one means that 1.5.0 will have this implemented?
https://github.com/ansible/ansible/issues/5801
             
            
              
              
              
            
            
           
          
            
            
              “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.
             
            
              
              
              
            
            
           
          
            
            
              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.
             
            
              
              
              
            
            
           
          
            
            
              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