#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 секунд во время сбора фактов на узле, который был недоступен.