Pass variable to hosts: in playbook

`

Assuming your first task returns an ip address, if you want to reference it, you’d need to use {{ ip.stdout }}. Alternately, you could use the http://docs.ansible.com/uri_module.html instead of using curl, and you could just use {{ ip }}.

You’ll also have to add it to the inventory before you could use it on the following play, see the http://docs.ansible.com/add_host_module.html module.

If you want extra credit, write a module for your API that provisions instances and a dynamic inventory script :).

  • James

---
- hosts: all

pre_tasks:

# Task creates a vm through an api. Register output with vm name
- name: Create vm from emplate
command: 'curl [https://vm.example.nl/api/create](https://vm.example.nl/api/create)'
delegate_to: localhost
register: vm

# Filter out exact vm name
- name: Define vm variable
set_fact: vmname="{{ (vm.stdout.split(' ')[2]) | regex_replace('},$','') }}"
delegate_to: localhost

- name: Wait for running vm
shell: 'curl https://vm.example.nl/api/{{ vmname }}'
delegate_to: localhost
register: result
until: result.stdout.find("running") != -1
retries: 15
delay: 20

# This tasks makes sure the newly created vm is in the inventory file
- name: Regenerate vm inventory
shell: /scripts/generate_vm_invantory.sh
delegate_to: localhost

# Continue play on newly created vm, the problem is here. vmname is not getting passed to hosts:
- hosts: '{{ vmname }}'

# Roles to configure newly created vm
roles:
- common
- apt-updates
- webserver
``

Ok, the above is more like my actual playbook. I’m using a shell script to regenerate the inventory file which I use to run the above playbook. The variable vmname is set and contains the vmname but it won’t get passed to: hosts: '{{ vmname }}'

See my original response. You’ll need to use the add_host module to add {{ vmname }} to the inventory if you want to use it on the next play. Also, you playbook will be much cleaner if you use the URI module rather than shelling out to curl.

  • James

Agreed with James, dynamically adding hosts to groups is the way to go. I believe that the hosts: lines are evaluated before the playbook is run, so the only variables you can use there are ones set with -e vmname=something