如何使用 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