Spec-Zone.ru › Ansible 2.4

Тесты

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

Тесты в Jinja2 — это способ оценки выражений шаблонов и возвращения True или False. Jinja2 поставляется со многими из них. См. встроенные тесты в официальной документации по шаблонам Jinja2. Тесты очень похожи на фильтры и используются в основном так же, но их также можно использовать в фильтрах обработки списков, таких как C(map()) и C(select()) для выбора элементов в списке.

Как и все шаблоны, тесты всегда выполняются на контроллере Ansible, а не на целевом объекте задачи, поскольку они проверяют локальные данные.

В дополнение к этим тестам Jinja2, Ansible предоставляет несколько дополнительных, и пользователи могут легко создавать свои собственные.

Тестирование строк

Для сопоставления строк с подстрокой или регулярным выражением используйте фильтры «match» или «search»:

vars:
  url: "http://example.com/users/foo/resources/bar"

tasks:
    - debug: "msg='matched pattern 1'"
      when: url | match("http://example.com/users/.*/resources/.*")

    - debug: "msg='matched pattern 2'"
      when: url | search("/users/.*/resources/.*")

    - debug: "msg='matched pattern 3'"
      when: url | search("/users/")

‘match’ требует полного совпадения в строке, а ‘search’ требует только совпадения подстроки.

Сравнение версий

Новое в версии 1.6.

Для сравнения номера версии, например, проверки, является ли версия ansible_distribution_version больше или равна ‘12.04’, можно использовать фильтр version_compare.

Фильтр version_compare также можно использовать для оценки ansible_distribution_version:

{{ ansible_distribution_version | version_compare('12.04', '>=') }}

Если ansible_distribution_version больше или равно 12, этот фильтр возвращает True, в противном случае False.

Фильтр version_compare принимает следующие операторы:

<, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne

Этот тест также принимает третий параметр, strict, который определяет, следует ли использовать строгое разбиение версии. По умолчанию используется False, но настройка True использует более строгое разбиение версий:

{{ sample_version_var | version_compare('1.0', operator='lt', strict=True) }}

Тесты теории групп

Новое в версии 2.1.

Чтобы проверить, содержит ли список другой список или включён в него, можно использовать «issubset» и «issuperset»:

vars:
    a: [1,2,3,4,5]
    b: [2,3]
tasks:
    - debug: msg="A includes B"
      when: a|issuperset(b)

    - debug: msg="B is included in A"
      when: b|issubset(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|any

Тестирование путей

Следующие тесты могут предоставить информацию о пути на контроллере:

- debug: msg="path is a directory"
  when: mypath|is_dir

- 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|exists

- debug: msg="path is {{ (mypath|is_abs)|ternary('absolute','relative')}}"

- debug: msg="path is the same file as path2"
  when: mypath|samefile(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|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|changed

  - debug: msg="it succeeded in Ansible >= 2.1"
    when: result|succeeded

  - debug: msg="it succeeded"
    when: result|success

  - debug: msg="it was skipped"
    when: result|skipped

Примечание

Начиная с версии 2.1, можно также использовать success, failure, change и skip, чтобы грамматика соответствовала, для тех, кто хочет быть строгим.

См. также

Сценарии
Введение в сценарии
Условные операторы
Условные операторы в сценариях
Переменные
Все о переменных
Циклы
Циклы в сценариях
Роли
Организация сценариев по ролям
Рекомендации по применению
Рекомендации по применению в сценариях
Список рассылки пользователей
Есть вопрос? Заходите на форум!
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.4/playbooks_tests.html

Spec-Zone.ru

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