我有大约 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 作业?
用户的 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 模块。
如果你有非常复杂的 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 -"
如果您只想删除 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 -
说明: