Как удалить работу cron с помощью Ansible?

У меня около 50 серверов Linux Debian с плохим заданием cron:

0 * * * * ntpdate 10.20.0.1

Я хочу настроить ntp sync с ntpd, и поэтому мне нужно удалить это задание cron. Для настройки я использую Ansible. Я попытался удалить запись cron с этим воспроизведением:

tasks:
   - cron: name="ntpdate" minute="0" job="ntpdate 10.20.0.1" state=absent user="root"

Ничего не случилось.

Затем я запускаю это воспроизведение:

tasks:
   - cron: name="ntpdate" minute="0" job="ntpdate pool.ntp.org" state=present

Я вижу новое задание cron в выводе "crontab -l":

...
# m h  dom mon dow   command
  0 *  *   *   *     ntpdate 10.20.0.1
#Ansible: ntpdate
0 * * * * ntpdate pool.ntp.org

но /etc/cron.d пусто! Я не понимаю, как работает модуль Ansible cron.

Как я могу удалить заданное вручную задание cron с помощью модуля Ansible cron?

Ответ 1

Элементы crontab пользователя хранятся под /var/spool/cron/crontab/$USER, как указано в странице crontab:

Crontab - это программа, используемая для установки, удаления или списка таблиц, используемых для управления демоном cron (8). Каждый пользователь может иметь свой собственный crontab, и хотя это файлы в /var/spool/, они не предназначены для прямого редактирования. Для SELinux в режиме mls может быть еще больше crontabs - для каждого диапазона. Подробнее см. Selinux (8).

Как упоминалось на странице руководства и приведенной выше цитате, вы не должны редактировать или использовать эти файлы напрямую и вместо этого должны использовать доступные команды crontab, такие как crontab -l, чтобы перечислять записи пользователя crontab, crontab -r для удаления пользователя crontab или crontab -e для редактирования записей crontab пользователя.

Чтобы удалить запись crontab вручную, вы можете использовать crontab -r, чтобы удалить все записи crontab пользователя или crontab -e, чтобы напрямую отредактировать crontab.

С помощью Ansible это можно сделать, используя cron модуль state: absent следующим образом:

hosts : all
tasks :
  - name : remove ntpdate cron entry
    cron :
      name  : ntpdate
      state : absent

Однако это зависит от комментария, который Ansible ставит над элементом crontab, который можно увидеть из этой простой задачи:

hosts : all
tasks :
  - name : add crontab test entry
    cron :
      name  : crontab test
      job   : echo 'Testing!' > /var/log/crontest.log
      state : present

Что затем устанавливает элемент crontab, который выглядит следующим образом:

#Ansible: crontab test
* * * * * echo Testing > /var/log/crontest.log

К сожалению, если у вас есть записи crontab, которые были установлены вне модуля Ansible cron, вам придется принять более чистый подход к упорядочению записей crontab.

Для этого нам просто нужно выбросить нашего пользователя crontab с помощью cron -r, и мы можем вызвать его через оболочку с игрой, которая выглядит примерно так:

hosts : all
tasks :
  - name  : remove user crontab
    shell : crontab -r

Затем мы можем использовать дополнительные задачи для установки задач, которые вы хотите сохранить или добавить, которые правильно используют модуль Ansible cron.