Ansible: условные операторы не должны включать разделители шаблонов jinja2, такие как {{ }} или {% %}

#ansible

#ansible

Вопрос:

Может ли кто-нибудь помочь мне понять и разрешить это

  - name: Copying file to sever2
    fetch:
      src: /tmp/
      dest: /u0/test/
    when:
      "{{ inventory_hostname == 'testdb' }}"
  

Ответ №1:

В вашем случае вам следует использовать условие when без разделителей Jinja.

Пример:

 when: inventory_hostname == 'testdb'
  

Подробное объяснение:

Разделители шаблонов Jinja используются, когда требуется интерполяция переменных в контексте текста и шаблонов. Это указывает Ansible использовать значение переменной вместо имени переменной.

  • Рассматривайте все как текст, если не указано иное (с разделителями)

Пример:

   vars:
    fav_tool: Ansible

  tasks:
  - debug:
      msg: "I like fav_tool"
  

Это приведет к:

 "msg": "I like fav_tool"
  

Это не то, что я хотел, я хотел отобразить «Мне нравится Ansible». Итак, тогда я должен «сказать» ansible использовать значение fav_tool .

   - debug:
      msg: "I like {{ fav_tool }}"
  

Аналогично мы используем разделители шаблонов Jinja в шаблонах. Где мы хотим отделить переменную и выражения от текста.

Пример шаблона, такого как показано ниже:

 if fav_tool == 'Ansible'
I like Ansible
endif
  

… приведет к точно такому же тексту без оценки:

 if fav_tool == 'Ansible'
I like Ansible
endif
  

Однако, когда мы используем разделители Jinja:

 {% if fav_tool == 'Ansible' %}
I like Ansible
{% endif %}
  

Это приведет к:

 I like Ansible
  

Когда мы используем такие условия, как when: , нам не нужны разделители, поскольку условные обозначения автоматически интерполируют переменную в значение.

  • Рассматривайте все как переменные и выражения, если не указано иное (с '' )

Пример:

Здесь ситуация обратная, и все, что не заключено в одинарные кавычки, вычисляется автоматически. Здесь только 'Ansible' рассматривается как текст (не оценивается).

   vars:
    fav_tool: Ansible

  tasks:
  - debug:
      msg: "Ansible rocks!"
    when: fav_tool == 'Ansible'
  

Комментарии:

1. немного разочаровывает, но как вы справляетесь с символами «:» в строке. Разделители шаблона Jinja2 позволяют строке иметь «:» с {{ ":" }}

2. Не уверен в вашем точном варианте использования, это может оправдать новый вопрос, и другие эксперты также могут вмешаться.

3. Вместо того, чтобы смотреть на это с точки зрения варианта использования, посмотрите на это с точки зрения языка. В условном when: выражении вам просто не разрешается иметь {{ }} или %% в инструкции. Это проблема, потому что : это специальный символ, который сбивает с толку анализатор и не может быть использован в части some_statement в when: some_statement . Возможно, это действительно вызывает вопрос, похоже, это плохой языковой дизайн imo.

4. спасибо, seshadri_c! Вместо того, чтобы писать «‘{{ item.value.group }}’ в group_names» в цикле, я мог бы просто написать «item.value.group в group_names» в условии when.

Ответ №2:

У меня это сработало с

     when:
     (inventory_hostname in groups['testdb'])
  

Комментарии:

1. Спасибо! Это сэкономило > 30 секунд во время сбора фактов на узле, который был недоступен.