Принудительное завершение ansible (возврат ненулевого кода), если есть какие-либо «измененные» задачи - PullRequest
1 голос
/ 21 марта 2020

Я хочу выполнить тест на сходимость для playbook. Тест на сходимость проверяет, не изменились ли во втором прогоне той же книги воспроизведения.

Можно ли сказать Ansible «сделать код выхода ненулевым, если была задача в состоянии« изменено »?». Я могу разобрать стандартный вывод, но он ужасен.

Пример:

set -e
ansible-playbook -i inventory.yaml site.yaml  # normal run
ansible-playbook --help-me-here -i inventory.yaml site.yaml  # should return non-zero if anything changed.

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Согласно документации прямой опции для этого нет,

Вы можете сделать следующее:

Создать логическую переменную, которая отслеживает, если изменено следует считать провалом. Оцените управление внутри playbook.

Например, в вашей playbook вы можете обрабатывать флаг следующим образом:

- hosts: localhost
  gather_facts: no
  tasks:
  - debug:
      msg: "Test message"
#   This task reports 'changed' always because we set changed_when to True
    changed_when: True
    register: result
#   We can control whether or not to fail the task if task reports changed. 
#   The task fails if 
#     it actually fails or 
#     when it changes and when we ask it to consider change as a failure
#   Note: Defaults to understand changed just means changed and not failed
    failed_when:
      - result is failed or (result.changed and changed_means_failure|default(False)|bool)

Выполнить вашу playbook

set -e

ansible-playbook -i inventory.yaml site.yaml  # normal run
ansible-playbook --extra-vars "changed_means_failure=True" -i inventory.yaml site.yaml  # should return non-zero if anything changed.
0 голосов
/ 21 марта 2020

Другой вариант, чем тот, который я положил в комментарии, это использовать molecule. Он автоматически устанавливает линтеры, а также тесты на синтаксис, юнит и идемпотентность. Я обнаружил, что это наиболее полезно при разработке ansible -role-ss sh, хотя с тех пор молекула потеряла поддержку бродяги.

$ python3 -m venv ./role-devel
$ source ./role-devel/bin/activate
$ pip install "molecule[lint,docker]"
[...]
$ molecule init role  yourrole
--> Initializing new role yourrole...
Initialized role in /path/to/yourrole successfully.

Теперь отредактируйте tasks/main.yml :

---
# tasks file for yourrole
- debug:
    var=ansible_date_time.iso8601
- name: Update motd
  template:
    src: "motd.j2"
    dest: "/etc/motd"

и создайте templates/motd.j2:

THIS SYSTEM IS PROUDLY MANAGED BY ANSIBLE SINCE {{ ansible_date_time.iso8601 }}

Теперь, когда вы запустите ваши тесты, молекула выполнит проверку идемпотентности и обнаружит, что Update motd изменилось в обоих первый и второй запуск. Таким образом, тест идемпотентности не пройдет:

$ molecule test

[...]

--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [instance]

    TASK [Include yourrole] ********************************************************

    TASK [yourrole : debug] ********************************************************
    ok: [instance] => {
        "ansible_date_time.iso8601": "2020-03-21T11:31:05Z"
    }

    TASK [yourrole : Update motd] **************************************************
    changed: [instance]

    PLAY RECAP *********************************************************************
    instance                   : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

--> Scenario: 'default'
--> Action: 'idempotence'
ERROR: Idempotence test failed because of the following tasks:
* [instance] => yourrole : Update motd
An error occurred during the test sequence action: 'idempotence'. Cleaning up.

[...]

$ echo $?
1
...