ansible不执行定时任务,而是通过cron模块配置crontab条目,由系统cron守护进程实际执行;支持用户级、系统级及/etc/cron.d/文件方式部署,可查看、删除或禁用任务,并提供special_time简化周期定义。

Ansible 本身不执行定时任务,它负责配置和管理定时任务——也就是把 crontab 条目写入目标主机的计划任务系统中。真正执行定时任务的是 Linux 自带的 cron 守护进程。Ansible 的作用是远程、批量、幂等地完成这个配置过程。
用 cron 模块添加定时任务
这是最常用的方式,直接操作用户级 crontab(默认为 root):-
每 5 分钟同步一次时间:
ansible webservers -m cron -a "name=ntp_sync job='/usr/sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1' minute=*/5"
-
每天凌晨 2 点执行备份脚本:
ansible db_servers -m cron -a "name=daily_backup job='/usr/local/bin/backup.sh' minute=0 hour=2"
关键点:
- name 是唯一标识,Ansible 靠它识别、更新或删除任务;
- 不填 minute/hour/day 等字段时,默认为 *(即通配);
- job 命令建议加重定向(如
>/dev/null 2>&1),避免邮件堆积或失败无感知。
指定用户或写入系统级位置
默认写入 root 的 crontab,但可灵活指定:-
写入普通用户 james 的 crontab:
ansible app_nodes -m cron -a "user=james name=log_cleaner job='find /var/log/app -mmin +1440 -delete' day=0"
-
写入
/etc/crontab(需显式指定 user 和 cron_file):ansible all -m cron -a "cron_file=/etc/crontab user=root name=health_check job='/usr/local/bin/check-health.sh' minute=*/10"
-
写入
/etc/cron.d/myjob独立文件(推荐用于多用户/复杂环境):ansible nodes -m cron -a "cron_file=myjob user=root name=cleanup job='/bin/sh /opt/scripts/clean.sh' hour=3"
注意: 使用
cron_file时必须同时提供user参数,否则报错。
查看与删除已配置的任务
验证是否生效,或清理旧任务:-
查看某用户的 crontab(如 root):
ansible target -m shell -a "crontab -l -u root"
-
删除名为 ntp_sync 的任务(仅限 Ansible 创建的):
ansible target -m cron -a "name=ntp_sync state=absent"
-
禁用而非删除(保留配置但注释掉):
ansible target -m cron -a "name=daily_backup disabled=yes"
用 special_time 简化常见周期
避免手算时间字段,用语义化关键字更直观:-
每次系统启动时运行:
ansible servers -m cron -a "name=reboot_init job='/usr/local/bin/init-on-boot.sh' special_time=reboot"
-
每周日凌晨 1 点执行:
ansible servers -m cron -a "name=weekly_report job='/usr/local/bin/gen-report.sh' special_time=weekly hour=1"
可用值包括:reboot, yearly, annually, monthly, weekly, daily, hourly。
注意: 一旦设置 special_time,minute/hour/day 等字段会被忽略。
不复杂但容易忽略











