Тесты
- Синтаксис тестов
- Тестирование строк
- Сравнение версий
- Тесты теории групп
- Тестирование путей
- Результаты задач
Тесты в Jinja — это способ оценки выражений шаблонов и возвращения значений True или False. Jinja поставляется со многими такими тестами. См. встроенные тесты в официальной документации по шаблонам Jinja.
Основное различие между тестами и фильтрами заключается в том, что тесты Jinja используются для сравнений, а фильтры — для обработки данных, и у них разные применения в Jinja. Тесты также могут использоваться в фильтрах для обработки списков, таких как map() и select() для выбора элементов в списке.
Как и все шаблоны, тесты всегда выполняются на контроллере Ansible, а не на целевом объекте задачи, поскольку они тестируют локальные данные.
Помимо этих тестов Jinja2, Ansible предоставляет несколько дополнительных, и пользователи могут легко создавать свои собственные.
Синтаксис тестов
Синтаксис тестов отличается от синтаксиса фильтров (variable | filter). Раньше Ansible регистрировал тесты как тесты Jinja и фильтры Jinja, позволяя ссылаться на них с помощью синтаксиса фильтров.
Начиная с Ansible 2.5, использование теста Jinja как фильтра будет выводить предупреждение.
Синтаксис использования теста Jinja выглядит следующим образом:
variable is test_name
Например:
result is failed
Тестирование строк
Для сопоставления строк с подстрокой или регулярным выражением используйте фильтр «match» или «search»:
vars:
url: "http://example.com/users/foo/resources/bar"
tasks:
- debug:
msg: "matched pattern 1"
when: url is match("http://example.com/users/.*/resources/.*")
- debug:
msg: "matched pattern 2"
when: url is search("/users/.*/resources/.*")
- debug:
msg: "matched pattern 3"
when: url is search("/users/")
‘match’ требует полного совпадения в строке, а ‘search’ — только совпадения подстроки.
Сравнение версий
Новое в версии 1.6.
Примечание
В версии 2.5 version_compare было переименовано в version
Для сравнения номера версии, например, для проверки, является ли версия ansible_distribution_version больше или равна ‘12.04’, можно использовать тест version.
Тест version также может использоваться для оценки ansible_distribution_version:
{{ ansible_distribution_version is version('12.04', '>=') }}
Если ansible_distribution_version больше или равна 12.04, этот тест возвращает True, в противном случае — False.
Тест version принимает следующие операторы:
<, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne
Этот тест также принимает третий параметр, strict, который определяет, следует ли использовать строгий анализ версий. По умолчанию это False, но этот параметр, как True, использует более строгий анализ версий:
{{ sample_version_var is version('1.0', operator='lt', strict=True) }}
Тесты теории групп
Новое в версии 2.1.
Примечание
В версии 2.5 issubset и issuperset были переименованы в subset и superset
Чтобы проверить, содержит ли список другой список или содержится ли в нём другой список, можно использовать «subset» и «superset»:
vars:
a: [1,2,3,4,5]
b: [2,3]
tasks:
- debug:
msg: "A includes B"
when: a is superset(b)
- debug:
msg: "B is included in A"
when: b is subset(a)
Новое в версии 2.4.
Можно использовать any и all для проверки, являются ли все или какие-либо элементы в списке истинными:
vars:
mylist:
- 1
- "{{ 3 == 3 }}"
- True
myotherlist:
- False
- True
tasks:
- debug:
msg: "all are true!"
when: mylist is all
- debug:
msg: "at least one is true"
when: myotherlist is any
Тестирование путей
Примечание
В версии 2.5 следующие тесты были переименованы, чтобы убрать префикс is_
Следующие тесты могут предоставить информацию о пути на контроллере:
- debug:
msg: "path is a directory"
when: mypath is directory
- debug:
msg: "path is a file"
when: mypath is file
- debug:
msg: "path is a symlink"
when: mypath is link
- debug:
msg: "path already exists"
when: mypath is exists
- debug:
msg: "path is {{ (mypath is abs)|ternary('absolute','relative')}}"
- debug:
msg: "path is the same file as path2"
when: mypath is same_file(path2)
- debug:
msg: "path is a mount"
when: mypath is mount
Результаты задач
Следующие задачи иллюстрируют тесты, предназначенные для проверки статуса задач:
tasks:
- shell: /usr/bin/foo
register: result
ignore_errors: True
- debug:
msg: "it failed"
when: result is failed
# in most cases you'll want a handler, but if you want to do something right now, this is nice
- debug:
msg: "it changed"
when: result is changed
- debug:
msg: "it succeeded in Ansible >= 2.1"
when: result is succeeded
- debug:
msg: "it succeeded"
when: result is success
- debug:
msg: "it was skipped"
when: result is skipped
Примечание
Начиная с версии 2.1, также можно использовать success, failure, change и skip, чтобы грамматика соответствовала, для тех, кто нуждается в строгой грамматике.
См. также
- Работа с Playbook
- Введение в Playbook
- Условные операторы
- Условные операторы в Playbook
- Переменные
- Все о переменных
- Циклы
- Использование циклов в Playbook
- Роли
- Организация Playbook с помощью ролей
- Рекомендации
- Рекомендации по использованию Playbook
- Список рассылки пользователей
- У вас есть вопрос? Задайте его на форуме!
- irc.freenode.net
- #ansible IRC чат-канал
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.5/user_guide/playbooks_tests.html