2016-06-28 3 views
0

私はホスト名に基づいて値を入力するために、不可能なテンプレートでif/elseステートメントを使用しようとしています。私は、ホスト名を解析し、値をファクトとして追加するモジュールを作成しました。私はこれらの事実を私のプレーブックで使用することができますが、正しく使用するにはif/elseステートメントを取得するのに問題があります。両方の値が一致するように、ifとelseの両方が一致するようになります。Jinja2 if/else bothと一致する

Jinja2のテンプレート

{% for host in groups['tag_Function_logfe'] %} 
{% if hostvars[host]['tt_number'] == "01" %} 
is_master = true 
{% else %} 
is_master = false 
{% endif %} 
{% endfor %} 

Ansible事実:

ok: [node1] => {"ansible_facts": {"tt_number": "01"}, "changed": false, "msg": "Additional facts added successfully"} 
ok: [node2] => {"ansible_facts": {"tt_number": "02"}, "changed": false, "msg": "Additional facts added successfully"} 

結果:

is_master = true 
is_master = false 

答えて

2

私はドン」あなたが全体的にしようとしていることの完全なイメージを持っていますが、AnsibleとJinjaは、このケースでは文書化されているように振る舞うように見えるので、他のところで誤解があるかもしれません。

Ansibleがすべてのホスト上の構成ファイルにレンダリングするテンプレートがあります。このテンプレートでは、forループが指定されたグループ内のホストを反復処理し、それらのホストごとにis_masterを宣言します。その結果、 "tag_Function_logfe"グループ内のホストの数に等しいテンプレートのすべてのインスタンスに複数の定義が作成されます。

私はホストごとに1つだけis_master定義があると仮定しているので、それは私には意味をなさないと思われます。

はおそらく、あなたの代わりに、テンプレートでこれを持っているやりたいこと:

{% if inventory_hostname in groups['tag_Function_logfe'] %} 
    {% if tt_number == "01" %} 
     is_master = true 
    {% else %} 
     is_master = false 
    {% endif %} 
{% endif %} 

​​ポイントをAnsibleは、現時点ではと仕事ができるでしょうホストに。明らかに、このホストが "tag_Function_logfe"グループに属しているかどうかチェックし、そうでなければis_masterを定義しません。

に基づいて、値is_masterの値を決定します。テンプレートが設定ファイルにレンダリングされる現在のホストに対してのみ、tt_numberの値にアクセスするので、hostvarsを使用する必要はありません。

グループメンバーシップテストをさらに排除することは可能でしょうが、残りの設定を見ずには分かりにくいでしょう。

+0

これは完璧に機能します。私はグループメンバーシップテストを削除することができました。私はhostvarsをチェックするためにホストを引き込むためにそれを使用していましたが、私はこのような事実に直接アクセスすることはできませんでした。 – tweeks200

+0

うれしかった! – Tony

関連する問題