在 Ansible/Jinja2 中设置 var 的案例语句
Case statement for setting var in Ansible/Jinja2
我将 Ansible 与 Jinja2 模板一起使用,这是我无法在 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 = ""
我可能可以通过结合几种技术来做到这一点,这里的变量赋值:Set variable in jinja, the conditional comparison here: http://jinja.pocoo.org/docs/dev/templates/#if-expression, and the defaulting filter here: https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables,
...但我觉得这太过分了。有更简单的方法吗?
你不需要设置 var,因为我猜你稍后会尝试为某些条件设置 var。
只需在那里设置条件
- name: Later task
shell: "command is here"
when: {{ existing_ansible_var }} == "string1"
并获利
像这样的东西可以工作,但它很难看。正如@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"
等等
如果您只想根据 existing_ansible_var
的值在模板中输出一个值,您可以简单地使用字典并用 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
不一定被定义,你需要用你的字典中不存在的 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("") }}'
我将 Ansible 与 Jinja2 模板一起使用,这是我无法在 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 = ""
我可能可以通过结合几种技术来做到这一点,这里的变量赋值:Set variable in jinja, the conditional comparison here: http://jinja.pocoo.org/docs/dev/templates/#if-expression, and the defaulting filter here: https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables,
...但我觉得这太过分了。有更简单的方法吗?
你不需要设置 var,因为我猜你稍后会尝试为某些条件设置 var。 只需在那里设置条件
- name: Later task
shell: "command is here"
when: {{ existing_ansible_var }} == "string1"
并获利
像这样的东西可以工作,但它很难看。正如@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"
等等
如果您只想根据 existing_ansible_var
的值在模板中输出一个值,您可以简单地使用字典并用 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
不一定被定义,你需要用你的字典中不存在的 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("") }}'