如何编写Ansible Playbook实现每10秒执行一次Cron任务?
当然可以搞定!不过得先给你提个醒:Cron本身的最小执行间隔是1分钟,所以直接用Cron设置每10秒跑一次是行不通的,得用点小技巧。下面给你两种靠谱的方案,附完整的Ansible Playbook示例:
方案1:单Cron任务+循环脚本
这个方案的思路是:创建一个每分钟执行一次的Cron任务,任务里跑一个shell脚本,脚本会循环6次,每次执行你要的目标命令后sleep 10秒。这样一分钟内就刚好每10秒触发一次。
Playbook示例:
- name: Setup 10-second interval cron job via loop script hosts: your_target_hosts become: yes tasks: - name: Create the loop script copy: dest: /usr/local/bin/every_10s_task.sh content: | #!/bin/bash # Loop 6 times (once every 10s for 1 minute) for i in {1..6}; do # Replace this line with your actual command to run echo "Running task at $(date)" >> /var/log/every_10s_task.log sleep 10 done mode: '0755' - name: Add cron job to run the script every minute cron: name: "Every 10 seconds task" minute: "*" hour: "*" day: "*" month: "*" weekday: "*" job: "/usr/local/bin/every_10s_task.sh" user: root
简单解释:
- 先创建了一个可执行的shell脚本,里面循环6次,每次执行目标命令(这里用echo日志做示例,你换成自己的命令就行),然后sleep 10秒。
- 再用Ansible的
cron模块添加一个每分钟执行一次的任务,调用这个脚本。
方案2:创建6个独立Cron任务
另一种更直接的思路是:创建6个Cron任务,分别在每分钟的0、10、20、30、40、50秒触发。这样每个任务间隔10秒,整体就实现了每10秒执行一次的效果。
Playbook示例:
- name: Setup 10-second interval cron jobs via 6 separate entries hosts: your_target_hosts become: yes tasks: - name: Add 6 cron jobs for 10-second intervals cron: name: "Every 10s task at {{ item }} seconds" minute: "*" hour: "*" day: "*" month: "*" weekday: "*" job: "echo 'Running task at $(date)' >> /var/log/every_10s_task.log" # 替换为你的实际命令 user: root second: "{{ item }}" loop: - 0 - 10 - 20 - 30 - 40 - 50
注意:这个方案依赖Ansible的cron模块支持second参数,需要确保你的Ansible版本足够新(大概2.11及以上),同时目标系统的Cron服务支持秒级调度(比如cronie或者fcron,传统的Vixie Cron不支持秒级)。如果目标系统用的是传统Cron,可能还是方案1更稳妥。
一些实用提醒
- 绝对路径优先:不管用哪种方案,你的目标命令最好用绝对路径(比如
/usr/bin/your_command),避免Cron环境变量不全导致命令找不到。 - 防止并发叠加:如果你的目标命令执行时间可能超过10秒,方案1里的循环会导致多个进程同时运行,这时候可以给脚本加个锁(比如用
flock),避免冲突。 - 日志辅助排查:建议把命令的输出重定向到日志文件,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Akdim Karim
相关产品推荐
相关产品推荐

