Идемпотентность Ансибля с командными и файловыми модулями
Я довольно новичок в ANSIBLE и к настоящему времени не могу понять, как сделать идемпотентную задачу. Например file
, Это просто не имеет creates
или же removes
, В command
модуль у него есть creates
, но всякий раз, когда я запускаю провайдера и файл (символьная ссылка) существует, команда ansible все равно помечает команду как "хорошо", а не "пропущено".
Вот command
пример модуля
- name: Firefox | link
command: ln -s /opt/firefox/firefox /usr/local/bin/firefox creates=/usr/local/bin/firefox
Всегда исполняется.
Как мне убедиться, что команда не будет выполнена>=2 раза, если состояние узла уже выполнено при первом запуске?
Спасибо!
1 ответ
Это должно работать.
На самом деле я проверил, и это в основном работает (см. Позже), вот полный playbook, который я использовал для его тестирования (не используя Firefox, но концепция та же самая):
---
- hosts: localhost
tasks:
- name: Test | link & idempotency
command: ln -s /tmp/ans/from /tmp/ans/to creates=/tmp/ans/to
Подробности:
- Когда ссылка отсутствует, она создается правильно
- Когда ссылка присутствует, ничего не меняется. Даже если ссылка указывает на неправильный файл, хотя.
Вы получаете предупреждение, хотя:
[WARNING]: Consider using file module with state=link rather than running ln
Если вы хотите убедиться, что ссылка верна, и изменять ее только тогда, когда это необходимо (то есть идемпотентно) "правильным" способом, так как для предупреждения ansible является использование файлового модуля, вот пример:
---
- hosts: localhost
tasks:
- name: Test | link & idempotency
file: src=/tmp/ans/from dest=/tmp/ans/to state=link