Spec-Zone.ru › Ansible 2.7

Тесты

  • Синтаксис тестов
  • Тестирование строк
  • Сравнение версий
  • Тесты теории множеств
  • Тестирование путей
  • Результаты задач

Тесты в 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_facts['distribution_version'] или равна ей версия ‘12.04’, можно использовать тест version.

Тест version также может быть использован для оценки ansible_facts['distribution_version']:

{{ ansible_facts['distribution_version'] is version('12.04', '>=') }}

Если ansible_facts['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
Список рассылки пользователей
Есть вопрос? Заходите в группу Google!
irc.freenode.net
Чат IRC канала #ansible

© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.7/user_guide/playbooks_tests.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API