Ошибка шаблона при создании строки шаблона: ожидаемый токен ‘конец инструкции печати’, получен ‘{‘

#ansible #jinja2

#ansible #jinja2

Вопрос:

Ниже приведена задача, которая выдает мне ошибку, потому что шаблоны jinja2 не поддерживают это.

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

Ошибка, вызванная:

«сообщение об ошибке шаблона при создании строки шаблона: ожидаемый токен ‘конец инструкции печати’, получен ‘{‘. Строка: {{ ansible_{{ item }}[‘ipv4’] [‘адрес’] }}»

Есть какие-либо указания на то, как решить эту проблему?

Ответ №1:

Вы не можете использовать расширение 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 }}"
  

Ответ №2:

Используйте 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) }}"
  

выдает

 ok: [localhost] => (item=eth0) => 
  msg: 10.1.0.27
ok: [localhost] => (item=wlan0) => 
  msg: Undefined