如何使用 Ansible 删除 cron 作业?

问题描述 投票:0回答:3

我有大约 50 台 Debian Linux 服务器,但 cron 作业却很糟糕:

0 * * * * ntpdate 10.20.0.1

我想配置 ntp 与 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

我在“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 作业?

linux debian ansible
3个回答
27
投票

用户的 crontab 条目保存在

/var/spool/cron/crontab/$USER
下,如 crontab 手册页中所述:

Crontab 是用于安装、删除或列出用于驱动 cron(8) 守护进程的表的程序。每个用户都可以有自己的 crontab,尽管这些文件位于 /var/spool/ 中,但并不打算直接编辑它们。对于处于 mls 模式的 SELinux,每个范围可以有更多的 crontab。有关更多信息,请参阅 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

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

为此,我们只需使用

crontab -r
丢弃用户的 crontab,然后我们可以通过 shell 调用它,执行如下所示的操作:

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

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


0
投票

如果你有非常复杂的 crontab 条目,那么你也可以通过 ansible 的 shell 模块删除它,如下例所示。

---
- name: Deleting contab entry
  hosts: ecx
  become: true
  tasks:
   - name: "decroning entry"
     shell:
           "crontab -l -u root |grep -v mybot  |crontab -u root -"
     register: cronout
   - debug: msg="{{cronout.stdout_lines}}" 

说明:- 您只需将第 8 行上的

"mybot"
字符串替换为 crontab 条目的唯一标识。就是这样。对于“
how to delete multiple crontab entries by ansible
”,您可以在
grep
中使用多个字符串,如下所示

"crontab -l -u root |grep -v 'strin1\|string2\|string3\|string4'  |crontab -u root -"

0
投票

如果您只想删除 Ansible-cronjobs 并保留其余部分,这将从 crontab 中删除“#Ansible”注释和以下行。

- name: "Removes Ansible cron entries"
  shell: |
    crontab -l -u USERNAME | \
    awk 'BEGIN {skip=0} /^#Ansible:/ {skip=1; next} skip {skip=0; next} {print}' | \
    crontab -u USERNAME  -

说明:

  1. 列出 USERNAME 的所有 cron 作业
  2. awk 从 1) 读取输入并搜索以 '#Ansible' 开头的行
  • 如果找到:跳过行+下一行
  • 其他:打印行
  1. USERNAME 的 crontab 接收 2) 的输出并覆盖所有内容
© www.soinside.com 2019 - 2024. All rights reserved.