如何使用Ansible删除cron作业?

时间:2015-10-21 09:11:22

标签: linux debian ansible

我有大约50台糟糕的cron工作的Debian Linux服务器:

0 * * * * ntpdate 10.20.0.1

我想用ntpd配置ntp sync,所以我需要删除这个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

我在" crontab -l"的输出中看到了新的cron作业:

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

但是/etc/cron.d是空的!我不明白Ansible cron模块是如何工作的。

如何使用Ansible的cron模块删除我手动配置的cron作业?

1 个答案:

答案 0 :(得分:12)

用户的crontab条目位于/var/spool/cron/crontab/$USER下,如crontab man page中所述:

  

Crontab是用于安装,删除或列出用于驱动cron(8)守护程序的表的程序。每个用户都可以拥有自己的crontab,虽然这些是/ var / spool /中的文件,但它们不能直接编辑。对于在mls模式下的SELinux,可以为每个范围提供更多的crontabs。有关更多信息,请参阅selinux(8)。

正如手册页和上面引用的那样,你不应该直接编辑/使用这些文件,而应该使用crontabcrontab -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

不幸的是,如果你有在Ansible的cron模块之外设置的crontab条目,那么你将不得不采取一种不太干净的方法来整理你的crontab条目。

为此,我们只需要使用cron -r丢弃我们用户的crontab,我们可以通过shell调用它,看起来像这样:

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

然后我们可以使用更多任务来设置您想要保留的任务或添加正确使用Ansible的cron模块。