jamix
jamix

Reputation: 5628

Passing a variable to an included Ansible playbook

I'd like to pass a variable to an included Ansible playbook as follows:

---
- hosts: localhost
  connection: local
  vars:
    my_group: foo

- include: site.yml hosts={{ my_group }}

Then, in site.yml...

---
- hosts: "{{ hosts }}"
...

Unfortunately, I get an error saying that my_group is undefined in site.yml. Ansible docs do say that:

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

Is this my case? Is there a way around it?

Upvotes: 1

Views: 2003

Answers (1)

techraf
techraf

Reputation: 68489

You can use this syntax, but my_group has to be defined at the global level. Now it's local to the first play - it's even clear from the indentation.

You can confirm this by running your playbook with --extra-vars my_group=foo.


But generally what you seem to want to achieve is done using in-memory inventory files and add_host module. Take this as an example:

- hosts: localhost
  gather_facts: no
  vars:
    target_host: foo
    some_other_variable: bar
  tasks:
    - add_host:
        name: "{{ target_host }}"
        groups: dynamically_created_hosts
        some_other_variable: "{{ some_other_variable }}"

- include: site.yml

with site.yml:

---
- hosts: dynamically_created_hosts
  tasks:
  - debug:
      var: some_other_variable

I added some_other_variable to answer the question from your comment "how do I make a variable globally available from inside a play". It's not global, but it's passed to another play as a "hostvar".


From what I see (and I can't explain why) in Ansible >=2.1.1.0, there must be an inventory file specified for the dynamic in-memory inventory to work. In older versions it worked with Ansible executed ad hoc, without an inventory file, but now you must run ansible-playbook with -i inventory_file or have an inventory file defined through ansible.cfg.

Upvotes: 2

Related Questions