Другой вариант, чем тот, который я положил в комментарии, это использовать 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