Ansible タスクで、テンプレートのチェック ステートメントとして使用できるように変数を登録する方法。タスクは次のとおりです。
- 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"
vhost のテンプレートでlisten 80
は、常に利用可能であり、証明書が利用可能な場合にのみブロックを追加したいlisten 443
:
server {
listen 80;
........
}
{% if ssl_cert_check == True %} # This doesn't issue error but doesn't work either
server {
listen 443;
..............
}
{% endif %}
上記のケースを実行すると、2 番目のサーバー ブロックが実行されません。これは、vhost 構成にサーバー listen 80 のみが出力されることを意味します。
ただし、True for ステートメントを削除してテンプレートにif
追加すると、エラーが発生します。stat.exists
# This issues error
{% if ssl_cert_check.stat.exists %}
server {
listen 443;
..............
}
{% endif %}
エラーは
"msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'stat'
、変数を登録する前に stat モジュールを使用したにもかかわらずです。
Ansible タスクで定義された変数を渡し、Jinja2 テンプレートで使用する他の方法はありますか?
- debug: var=ssl_cert_check
の前にタスクによって表示される値Create vhost from template
は次のとおりです。
"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
}
}
]
}