Ansible jinja2 фильтры '|'(труба) что это значит?

Я написал задачу, как показано ниже, но не могу понять, что такое "|" делает?

tasks:
 - shell: /usr/bin/foo
   register: result
   ignore_errors: True

 - debug: msg="it failed"
   when: result|failed

 - debug: msg="it changed"
   when: result|changed

Также я нашел несколько примеров в Интернете, но не могу понять, что '|' делает?

debug: msg={{ ipaddr |replace(",", ".") }}

Еще один пример:

- hosts: localhost
  vars:
    D:
      1 : "one"
      2 : "two"
  tasks:
    - debug: var=D
    - debug: msg="D[1] is {{ D[1]|default ('undefined') }}"

Было бы здорово, если бы кто-то мог объяснить подробно или указать мне какой-нибудь URL?

Любая помощь будет оценена.

Благодарю.

2 ответа

Решение

С символом канала вы передаете значение в фильтр. Существует множество фильтров Jinja 2, но Ansible предлагает несколько дополнительных фильтров.

Термин " фильтр" иногда может сбивать с толку, потому что все фильтры работают совершенно по-разному. Некоторые, например, уменьшают результирующий набор хеша / массива, некоторые изменяют содержимое строки, но затем существуют фильтры, которые просто возвращают true или false.

Лучшим объяснением может быть то, что это модификаторы, и они могут делать что угодно с вашими переданными данными. Вы даже можете написать свои собственные фильтры.

Фильтры могут быть объединены в цепочку, передавая результат от первого фильтра следующему и так далее. Он работает точно так же, как команды конвейера в оболочке Unix.

"value" | filter1 | filter2 | filterN

failed возврат фильтра true если пройденный результат не удался. Это просто проверяет failed собственность от result,

changed Фильтр тот же, но проверяет, есть ли изменения в переданном результате. Это проверяет changed собственность от result,

ipaddr | replace(",", ".") заменяет все вхождения , с ., Так что значение 127,0,0,1 будет преобразован в 127.0.0.1,

default Фильтр установит значение по умолчанию, если ввод был нулевым, например, неопределенная переменная. undefined_var | default("var was undefined") -> Это либо напечатает содержимое undefined_var или строка "var была неопределенной". В приведенном выше примере вы выводите значение 2-го элемента D (D[1]) и если он не существует, вместо него указывается "undefined".

Обновление для всех, кто натыкается на этот вопрос, пытаясь понять, почему такие строки, как перестали работать,

tl;dr: Попробуйте заменить на так,

      when: result|failed

становится,

      when: result is failed

Начиная с Ansible 2.9 и выше («Использование предоставленных Ansible тестов jinja в качестве фильтров будет »), используя в условных выражениях, таких как when: result|failedвызовет ошибку. Это (было) заставить Ansible использовать фильтр jinja2 , но теперь они заменены тестами jinja2 , которые имеют немного другой синтаксис, а старые имена фильтров jinja2 сохранены как имена тестов jinja2 .

В некоторых случаях просто замена |с isвыглядит немного странно, поэтому, хотя (например) when: result is successявляется действительным, successа также successfulпсевдонимы так when: result is successfulвыглядит лучше.

Подробнее об этом в удалено в Ansible 2.9.Ansible 2.5 Porting Guide .

Другие вопросы по тегам