web-dev-qa-db-ja.com

Ansible / Jinja2でvarを設定するためのCaseステートメント

私は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

...しかし、それはやり過ぎだと感じます。これを行う簡単な方法はありますか?

14
s g

_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("") }}'
_
23
udondan

このようなものは動作しますが、いです。そして、@ 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"

等.

4
Bruce P

varを設定する必要はありません。後で何らかの条件にvarを設定しようとしていると推測しているためです。調子を整えて

- name: Later task
  Shell: "command is here"
  when: {{ existing_ansible_var }} == "string1"

そして利益を得る

0
podarok