AnsibleError:模板化字符串时出现模板错误:预期标记“打印语句结束”,得到“{”

Shr*_*uti 8 jinja2 ansible

以下是一个任务,它向我抛出一个错误,因为 jinja2 模板不支持此操作。

- name: Print the ip address
  debug:
    msg: "{{ ansible_{{ item }}['ipv4']['address'] }}"
  with_items: "{{ ansible_interfaces|reject('search', 'lo')|list|sort }}"
Run Code Online (Sandbox Code Playgroud)

抛出的错误是:

"msg": "模板化字符串时出现模板错误:预期标记'打印语句结束',得到'{'。字符串:{{ ansible_{{ item }}['ipv4']['address'] }}"

有关如何解决这个问题的任何指示吗?

Zei*_*tor 6

当您已经位于 jinja2 扩展表达式中时,您无法使用 jinja2 扩展。换句话说,胡须不能堆叠

在您的情况下,您可以使用vars查找来获取动态命名的变量:

- name: Print the ip address
  vars:
    interface_var_name: "ansible_{{ item }}"
  debug:
    msg: "{{ lookup('vars', interface_var_name)['ipv4']['address'] }}"
  with_items: "{{ ansible_interfaces | reject('search', 'lo') | list | sort }}"
Run Code Online (Sandbox Code Playgroud)


Vla*_*tka 3

使用lookup插件vars。例如

    - name: Print the ip address
      debug:
        msg: "{{ my_ifc.ipv4.address|default('Undefined') }}"
      loop: "{{ ansible_interfaces|reject('search', 'lo')|list|sort }}"
      vars:
        my_ifc: "{{ lookup('vars', 'ansible_' ~ item) }}"
Run Code Online (Sandbox Code Playgroud)

给出

ok: [localhost] => (item=eth0) => 
  msg: 10.1.0.27
ok: [localhost] => (item=wlan0) => 
  msg: Undefined
Run Code Online (Sandbox Code Playgroud)