4

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
                }
            }
        ]
    }
4

2 に答える 2

0

ssl_cert_check持っているを見ると、ブールキーがリストの下の辞書にexists格納されていることがわかります。実際には、テンプレート内のリストの項目を反復処理する必要があります。statresults

投稿したものが一貫した例である場合は、次を使用してリストの最初の項目を参照できます。

{% if ssl_cert_check.results[0].stat.exists %}

ただし、ssl_cert_checkあなたの場合に作成される方法は、おそらく次のことを意味します。

  • コードにある種のループがあります
  • sitenameスカラー値ではなく、リストそのものです

ループが複数回実行された場合、または に複数のアイテムがあったsitename場合、結果が一貫しない可能性があります。

回避策を講じるよりも、根本原因を修正する必要がありますresults[0]

于 2017-01-09T22:38:48.687 に答える