如何使用 Ansible 自动化安排 Linux 中的 Cron Job 任务。
ansible.builtin.cron 管理 cron.d 和 crontab 条目。
今天我们来谈谈 Ansible 的 cron 模块。它的全名是 ansible.builtin.cron,属于 Ansible 自带的“builtin”模块集合,并且与 Ansible 一起发布。
这个模块非常稳定,已经存在多年,并且支持多种操作系统。
它用于管理 cron.d 和 crontab 条目。对于 Windows 目标,建议使用 ansible.windows.win_scheduled_task 模块。
参数
- name(字符串):crontab 的名称
- state(字符串):present/absent
- job(字符串):要执行的命令
- user(字符串):默认为当前用户
- minute, hour, day, month, weekday(字符串):时间字段,支持“”、“1–31”、“/2”等格式
- special_time:预定义的时间间隔,如 annually/daily/hourly/monthly/reboot/weekly/yearly
- cron_file:注意:不要用于
/etc/crontab文件
唯一必需的参数是 name,它用于指定 crontab 条目的描述。
state 参数决定该计划任务是否存在于目标主机上。
job 参数设置要执行的命令,如果设置了 env,则为环境变量的值。
user 参数指定特定用户的 crontab,未设置时默认为当前用户。
最重要的是运行时间字段:minute、hour、day、month 和 weekday。你可以使用“*”指定所有分钟、小时、星期几、日期和月份,也可以通过单个数字、范围或间隔来指定更具体的时间。
此外,special_time 参数还提供了一些预定义的时间间隔,例如:annually、daily、hourly、monthly、reboot、weekly、yearly。
示例:使用 Ansible 在 Linux 中安排计划任务
代码文件: cron.yml
---
- name: cron module demo
hosts: all
tasks:
- name: "example cronjob"
ansible.builtin.cron:
name: "test"
state: present
minute: "*/2"
hour: "*"
day: "*"
month: "*"
weekday: "*"
job: 'logger "ansible-pilot"'
执行命令:
$ ansible-playbook -i virtualmachines/demo/inventory schedule\ cron\ job\ task/cron.yml
执行结果:
PLAY [cron module demo] ******************************************
TASK [Gathering Facts] ******************************************
ok: [demo.example.com]
TASK [example cronjob] ******************************************
changed: [demo.example.com]
PLAY RECAP ******************************************************
demo.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
执行前的状态:
$ ssh devops@demo.example.com
Last login: Wed Dec 8 15:28:44 2021 from 192.168.0.101
[devops@demo ~]$ crontab -l
no crontab for devops
执行后的状态:
$ ssh devops@demo.example.com
Last login: Wed Dec 8 15:30:58 2021 from 192.168.0.101
[devops@demo ~]$ crontab -l
#Ansible: test
*/2 * * * * logger "ansible-pilot"
计划任务的执行日志:
[devops@demo ~]$ sudo tail -f /var/log/cron
Dec 8 15:32:01 rhel8 CROND[5760]: (devops) CMD (logger "ansible-pilot")
Dec 8 15:34:01 rhel8 CROND[5766]: (devops) CMD (logger "ansible-pilot")
Dec 8 15:36:01 rhel8 CROND[5770]: (devops) CMD (logger "ansible-pilot")
Dec 8 15:38:01 rhel8 CROND[5775]: (devops) CMD (logger "ansible-pilot")
Dec 8 15:40:01 rhel8 CROND[5781]: (devops) CMD (logger "ansible-pilot")
Dec 8 15:42:01 rhel8 CROND[5787]: (devops) CMD (logger "ansible-pilot")
Dec 8 15:44:01 rhel8 CROND[5791]: (devops) CMD (logger "ansible-pilot")
Dec 8 15:46:01 rhel8 CROND[5796]: (devops) CMD (logger "ansible-pilot")
Dec 8 15:48:01 rhel8 CROND[5796]: (devops) CMD (logger "ansible-pilot")
Dec 8 15:50:01 rhel8 CROND[5796]: (devops) CMD (logger "ansible-pilot")
系统日志中的任务输出:
[devops@demo ~]$ sudo tail -f /var/log/messages
Dec 8 15:42:01 rhel8 devops[5787]: ansible-pilot
Dec 8 15:44:01 rhel8 devops[5791]: ansible-pilot
Dec 8 15:46:01 rhel8 devops[5796]: ansible-pilot
Dec 8 15:48:01 rhel8 devops[5796]: ansible-pilot
Dec 8 15:50:01 rhel8 devops[5796]: ansible-pilot
Dec 8 15:52:01 rhel8 devops[5796]: ansible-pilot
Dec 8 15:54:01 rhel8 devops[5796]: ansible-pilot
Dec 8 15:56:01 rhel8 devops[5796]: ansible-pilot