CronLinux系统中一个非常实用的定时任务工具,而Ansiblecron模块则为我们提供了一种简便且高效的方式来管理目标主机上的定时任务。在这篇文章中,我们将深入探讨cron模块的使用方法,并通过一些实际例子来展示如何利用它来轻松管理定时任务。

cron模块的主要功能

Ansiblecron模块可以用来:

  1. 创建新的定时任务。
  2. 修改现有任务。
  3. 删除任务。

通过cron模块,可以轻松实现对目标主机crontab的自动化管理,而无需手动登录服务器进行配置。

cron模块的常用参数

参数描述类型必填
name定时任务的描述,便于区分任务字符串
minute定义任务的分钟字段,支持通配符和范围字符串
hour定义任务的小时字段,支持通配符和范围字符串
day定义任务的日期字段,支持通配符和范围字符串
month定义任务的月份字段,支持通配符和范围字符串
weekday定义任务的星期字段,支持通配符和范围字符串
job要执行的命令字符串
state定义任务状态,可选值为presentabsent字符串
user指定执行任务的用户字符串
disabled是否禁用任务,yesno布尔值
insertafter插入任务的位置,在指定文本之后字符串
insertbefore插入任务的位置,在指定文本之前字符串

cron模块的基本使用

创建一个定时任务

这个示例将帮助你在目标主机上设置一个定时任务,该任务会在每天凌晨2点自动运行 /usr/bin/backup.sh 脚本。你可以选择使用 ansible-playbook 或者 ad-hoc 的方式来完成这个设置。

ansible node1 -m cron -a \
"name='每日备份任务' minute='0' hour='2' job='/usr/bin/backup.sh' state=present"
  • node1:表示对node1组的主机执行,可以替换为特定的主机组名(如webservers)。

  • -m:指定使用的模块为cron

  • -a:后面跟的是模块所需的参数,以空格分隔。

  • 参数内的值用引号括起来(如name='每日备份任务'),以避免解析问题。

成功执行上述命令后,会输入如下结果:

以下语法是采用ansible-playbook的语法创建定时任务的方式:

- name: 添加定时任务
  ansible.builtin.cron:
    name: “每日备份任务”
    minute: "0"
    hour: "2"
    job: "/usr/bin/backup.sh"
    state: present

删除一个定时任务

通过设置stateabsent,可以删除指定的定时任务。执行如下命令:

ansible node1 -m cron -a  "name='每日备份任务'  state=absent"

成功执行上述命令后,会把名字为每日备份任务的定时任务删除,如下所示:

禁用一个定时任务

设置disabledyes可以暂时禁用任务。执行如下命令:

ansible node1 -m cron -a "name='每日备份任务' job='/usr/bin/backup.sh' disabled=yes"

执行成功如下图所示:

以下语法是采用ansible-playbook的语法创建定时任务的方式:

- name: 禁用每日备份任务
  ansible.builtin.cron:
    name: "每日备份任务"
    job: "/usr/bin/backup.sh"
    disabled: yes

使用复杂的时间表达式

可以使用minutehour等参数定义更复杂的定时任务时间。执行如下命令:

ansible node1 -m cron -a \
"name='每日备份任务'  minute='0' hour='*/1' weekday='1-5' job='/usr/bin/work_task.sh'"

执行成功后如下:

以下语法是采用ansible-playbook的语法创建定时任务的方式:

- name: 每周一到周五每小时执行
  ansible.builtin.cron:
    name: "工作日任务"
    minute: "0"
    hour: "*/1"
    weekday: "1-5"
    job: "/usr/bin/work_task.sh"

为特定用户创建任务

如果需要为非root用户创建任务,可以使用user参数。执行如下命令:

ansible node1 -m cron -a \
"name='用户任务'  minute='30' hour='10' user='john' job='/home/john/run_me.sh'"

执行成功如下图所示:

- name: 为用户john创建任务
  ansible.builtin.cron:
    name: "用户任务"
    minute: "30"
    hour: "10"
    job: "/home/john/run_me.sh"
    user: "john"

cron模块的注意事项

  1. 任务的唯一性name参数是任务的唯一标识,确保每个任务具有唯一的name以避免覆盖。

  2. 权限问题:使用user参数时,确保目标用户有权限执行指定任务。

  3. 命令路径job参数中的命令最好写绝对路径,避免因环境变量问题导致任务失败。

  4. 验证任务:在任务执行后,可登录目标主机并使用crontab -l查看任务是否正确配置。

综合示例

以下是一个完整的任务列表,包含创建、修改和删除任务的操作:

- name: 管理定时任务
  hosts: all
  tasks:
    - name: 创建每日备份任务
      ansible.builtin.cron:
        name: "每日备份任务"
        minute: "0"
        hour: "2"
        job: "/usr/bin/backup.sh"
        state: present

    - name: 修改每日备份任务时间为凌晨3点
      ansible.builtin.cron:
        name: "每日备份任务"
        minute: "0"
        hour: "3"
        job: "/usr/bin/backup.sh"

    - name: 删除旧的日志清理任务
      ansible.builtin.cron:
        name: "日志清理任务"
        state: absent

总结

通过Ansiblecron模块,可以轻松实现对定时任务的自动化管理。无论是添加、修改还是删除任务,都可以通过简单的YAML文件完成。熟练使用cron模块,可以有效提升工作效率,减少手动操作带来的错误。

推荐阅读