Идемпотентность Ансибля с командными и файловыми модулями

Я довольно новичок в 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
Другие вопросы по тегам