In the Ansible task, how to register a variable so I can use it as check statement in Template. The tasks are:
- name: Check if certificate file exists
stat: path=/etc/nginx/ssl/{{ sitename }}.pem
register: ssl_cert_check
- name: Create vhost from template
template: "src={{ vhost_conf }} dest=/etc/nginx/conf/vhost.conf"
In the template of vhost for listen 80 is always available and I want to add the block for listen 443 only when the certificate is available:
server {
listen 80;
........
}
{% if ssl_cert_check == True %} # This doesn't issue error but doesn't work either
server {
listen 443;
..............
}
{% endif %}
When I run the above case the second server block is not executed, it means only the server listen 80 is printed in the vhost config.
However if I remove the True for if statement and add stat.exists in the template then I get error:
# This issues error
{% if ssl_cert_check.stat.exists %}
server {
listen 443;
..............
}
{% endif %}
The error is:
"msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'stat' even though I used stat module before registering the variable.
Is there any other way to pass the variable defined in Ansible task and use it in Jinja2 template?
The value displayed by a - debug: var=ssl_cert_check task before the Create vhost from template is:
"ssl_cert_check": {
"changed": false,
"msg": "All items completed",
"results": [
{
"_ansible_item_result": true,
"_ansible_no_log": false,
"changed": false,
"invocation": {
"module_args": {
"checksum_algorithm": "sha1",
"follow": false,
"get_checksum": true,
"get_md5": true,
"mime": false,
"path": "/etc/nginx/ssl/abc.pem"
},
"module_name": "stat"
},
"item": {
........
},
"stat": {
"exists": false
}
}
]
}
If you look at the
ssl_cert_checkyou have, you will notice the Boolean keyexistsis stored in thestatdictionary underresultslist, so in fact you should iterate over the items on the list inside the template.If what you posted is a consistent example, you can refer to the first item on the list using:
However the way
ssl_cert_checkis created in your case most likely means:sitenameis not a scalar value, but a list itselfIf the loop ran more times, or you had more than one item on
sitename, your results might not be consistent.You should rather fix the root cause than go with
results[0]workaround.