ansible run global variable
I want to create a cluster of servers, using ansible.
In one main-playbook, I include some sub-playbooks.
- include: playbook_commandserver.yml
- include: playbook_agent.yml
In the playbook_commandserver.yml, I create the command-server (on aws).
Then, I trigger a role, that uses the set_fact
module to remember the commandserver's dns name:
- name: Get hostname of command server
shell: /usr/bin/host $(/usr/bin/curl -s http://ipecho.net/plain) | /usr/bin/awk '{print $5}' | /usr/bin/awk -F 'aws.com' '{print $1"aws.com"}'
register: cs
- name: Set hostname of command server as fact
set_fact: commandserver="{{ cs.stdout }}"
The commandserver
fact is available in the same play, but not in the same playbook .. let alone in the playbook_agent.yml
, that gets included, afterwards. And it's exactly there, where I would need to access that commandserver-fact.
So how does one set/store variables, that are valid for the complete ansible-run?
I've found this: https://stackoverflow.com/questions/26732241/ansible-save-registered-variable-to-file However to me this looks like an ugly hack.
Is ther no better solution to this problem? Is there no way to set a variable, that is valid for the whole ansible-run?
Solution 1:
Yes, this is possible. When you set a fact with the set_fact
module, this fact is accessible via "hostvars". So if you define your variable commandserver like so:
- name: Set hostname of command server as fact
set_fact: commandserver="{{ cs.stdout }}"
then you can access this variable in other included playbooks of the same play in that way (the debug module is just an example):
- debug: msg="{{ hostvars['put the hostname in here']['commandserver'] }}"