私はJinja2テンプレートでAnsibleを使用していますが、これはAnsibleのドキュメントやJinja2のサンプルを探し回って解決策を見つけることができないシナリオです。 Ansibleで実現したいロジックは次のとおりです。
if {{ existing_ansible_var }} == "string1"
new_ansible_var = "a"
else if {{ existing_ansible_var }} == "string2"
new_ansible_var = "b"
<...>
else
new_ansible_var = ""
ここからの変数割り当て: jinjaで変数を設定 、ここでの条件比較: http://jinja.pocoo.org/docs/dev/templates /#if-expression 、およびデフォルトのフィルター: https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables 、
...しかし、それはやり過ぎだと感じます。これを行う簡単な方法はありますか?
_existing_ansible_var
_の値に応じてテンプレートに値を出力するだけの場合は、dictを使用して_existing_ansible_var
_を渡すだけで済みます。
_{{ {"string1": "a", "string2": "b"}[existing_ansible_var] | default("") }}
_
同じ方法で新しい変数を定義できます。
_{% set new_ansible_var = {"string1": "a", "string2": "b"}[existing_ansible_var] | default("") -%}
_
_existing_ansible_var
_が必ずしも定義されていない場合、dictに存在しないdefault()
でこれをキャッチする必要があります。
_{"string1": "a", "string2": "b"}[existing_ansible_var | default("this key does not exist in the dict")] | default("")
_
プレイブックで定義し、後でテンプレートで_new_ansible_var
_を使用することもできます。
_vars:
myDict:
string1: a
string2: b
new_ansible_var: '{{myDict[existing_ansible_var | default("this key does not exist in the dict")] | default("") }}'
_
このようなものは動作しますが、いです。そして、@ podarokが彼の答えで述べたように、あなたがやろうとしていることそのものに応じて、それはおそらく不要です:
- name: set default
set_fact: new_ansible_var= ""
- name: set to 'a'
set_fact: new_ansible_var= "a"
when: "{{ existing_ansible_var }} == string1"
- name: set to 'b'
set_fact: new_ansible_var= "b"
when: "{{ existing_ansible_var }} == string2"
等.
varを設定する必要はありません。後で何らかの条件にvarを設定しようとしていると推測しているためです。調子を整えて
- name: Later task
Shell: "command is here"
when: {{ existing_ansible_var }} == "string1"
そして利益を得る