The problem you’re running into is that you’re trying to reference facts/variables of one host from those of another host. You need to keep in mind that in Ansible, the variable app_git_sha1
assigned to the host localhost
is distinct from the variable app_git_sha1
assigned to the host main
or any other host. If you want to access one hosts facts/variables from another host then you need to explicitly reference it via the hostvars
variable. There’s a bit more of a discussion on this in this question.
Suppose you have a playbook like this:
- hosts: localhost
tasks:
- command: /bin/echo "this is a test"
register: foo
- hosts: localhost
tasks:
- debug: var=foo
This will work because you’re referencing the host localhost
and localhosts
‘s instance of the variable foo
in both plays. The output of this playbook is something like this:
PLAY [localhost] **************************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [command /bin/echo "this is a test"] ************************************
changed: [localhost]
PLAY [localhost] **************************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [debug var=foo] *********************************************************
ok: [localhost] => {
"var": {
"foo": {
"changed": true,
"cmd": [
"/bin/echo",
"this is a test"
],
"delta": "0:00:00.004585",
"end": "2015-11-24 20:49:27.462609",
"invocation": {
"module_args": "/bin/echo \"this is a test\"",
"module_complex_args": {},
"module_name": "command"
},
"rc": 0,
"start": "2015-11-24 20:49:27.458024",
"stderr": "",
"stdout": "this is a test",
"stdout_lines": [
"this is a test"
],
"warnings": []
}
}
}
If you modify this playbook slightly to run the first play on one host and the second play on a different host, you’ll get the error that you encountered. The solution is to use Ansible’s built-in hostvars
variable to have the second host explicitly reference the first hosts variable. So modify the first example like this:
- hosts: localhost
tasks:
- command: /bin/echo "this is a test"
register: foo
- hosts: anotherhost
tasks:
- debug: var=foo
when: foo is defined
- debug: var=hostvars['localhost']['foo']
when: hostvars['localhost']['foo'] is defined
The output of this playbook shows that the first task is skipped because foo
is not defined by the host anotherhost
. But the second task succeeds because it’s explicitly referencing localhosts
‘s instance of the variable foo
:
TASK: [debug var=foo] *********************************************************
skipping: [anotherhost]
TASK: [debug var=hostvars['localhost']['foo']] **************************
ok: ['anotherhost'] => {
"var": {
"hostvars['localhost']['foo']": {
"changed": true,
"cmd": [
"/bin/echo",
"this is a test"
],
"delta": "0:00:00.005950",
"end": "2015-11-24 20:54:04.319147",
"invocation": {
"module_args": "/bin/echo \"this is a test\"",
"module_complex_args": {},
"module_name": "command"
},
"rc": 0,
"start": "2015-11-24 20:54:04.313197",
"stderr": "",
"stdout": "this is a test",
"stdout_lines": [
"this is a test"
],
"warnings": []
}
}
}
So, in a nutshell, you want to modify the variable references in your main
playbook to reference the localhost
variables in this manner:
{{ hostvars['localhost']['app_git_sha1'] }}