s g*_*s g 14 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 = ""
我可以通过组合几种技术来实现这一点,这里的变量赋值:在jinja中设置变量,条件比较在这里:http://jinja.pocoo.org/docs/dev/templates/#if-expression,以及默认值在此过滤:https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables,
......但我觉得这太过分了.有更简单的方法吗?
udo*_*dan 23
如果你只是想根据你的价值在你的模板中输出一个值,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()dict中不存在的内容来捕获它:
{"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"
等等。