在Ansible / Jinja2中设置var的case语句

时间:2015-06-04 06:59:22

标签: jinja2 ansible ansible-playbook

我使用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

...但我觉得这太过分了。有更简单的方法吗?

3 个答案:

答案 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"

获得利润