我使用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,这里的条件比较:http://jinja.pocoo.org/docs/dev/templates/#if-expression和此处的默认过滤器来实现这一点:https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables,
...但我觉得这太过分了。有更简单的方法吗?
答案 0 :(得分:22)
如果您只想根据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
未必定义,您需要使用您的词典中不存在的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("") }}'
答案 1 :(得分:4)
这样的东西会起作用,但它很难看。正如@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"
等
答案 2 :(得分:0)
你不需要设置var,因为我猜你以后尝试为某些条件设置var。 只要像那样做条件
- name: Later task
shell: "command is here"
when: {{ existing_ansible_var }} == "string1"
获得利润