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 .