You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ansible按5台主机分组批量生成分段定时Cron任务

Ansible 批量按分组生成Cron任务方案

需求说明

  • 现有82台主机,需按每5台为一组分配Cron执行时间
  • 分组时间规则:
    • 第1组5台 → 分钟00,小时00
    • 第2组5台 → 分钟05,小时00
    • 第3组5台 → 分钟10,小时00
    • ...以此类推,分钟每5分钟递增,任务执行时间最晚不超过05:00
  • 需要在nedi.mousquetaires.com上生成两类Cron任务:
    • 执行discover.php的主机发现任务
    • 执行backup.php的主机备份任务
  • 避免重复创建已存在的Cron条目

实现思路

利用Ansible内置变量计算每台主机的分组归属,自动推导对应Cron时间:

  1. 通过play_hosts.index(inventory_hostname)获取当前主机在清单中的索引(从0开始)
  2. 整数除法计算分组编号:索引 // 5,每5台为一组
  3. 分钟值 = 分组编号 × 5,格式化为两位数字(补前导零)
  4. 小时值 = 分钟值 // 60,通过判断确保不超过5

完整Playbook示例

- name: 批量生成分组Cron任务
  hosts: all
  gather_facts: false
  tasks:
    - name: 获取apache用户已存在的Cron任务
      delegate_to: nedi.mousquetaires.com
      command: crontab -u apache -l
      register: result_crontab
      changed_when: false

    - name: 计算当前主机的Cron时间参数
      set_fact:
        group_num: "{{ (play_hosts.index(inventory_hostname) // 5) | int }}"
        cron_minute: "{{ (group_num * 5) | string | regex_replace('^\\d$', '0\\g<0>') }}"
        cron_hour: "{{ ((group_num * 5) // 60) | string | regex_replace('^\\d$', '0\\g<0>') }}"
      when: (group_num * 5) // 60 <= 5

    - name: 添加主机发现任务Cron
      delegate_to: nedi.mousquetaires.com
      cron:
        name: "Découverte de la base de {{ inventory_hostname }}"
        minute: "{{ cron_minute }}"
        hour: "{{ cron_hour }}"
        job: 'php /var/scripts/nedi/discover.php "{{ inventory_hostname }}"'
        user: apache
      when:
        - (group_num * 5) // 60 <= 5
        - result_crontab.stdout is not search("discover.php {{ inventory_hostname }}")

    - name: 添加主机备份任务Cron
      delegate_to: nedi.mousquetaires.com
      cron:
        name: "Sauvegarde de la base de {{ inventory_hostname }}"
        minute: "{{ cron_minute }}"
        hour: "{{ cron_hour }}"
        job: 'php /var/scripts/nedi/backup.php "{{ inventory_hostname }}"'
        user: apache
      when:
        - (group_num * 5) // 60 <= 5
        - result_crontab.stdout is not search("backup.php {{ inventory_hostname }}")

关键说明

  1. 分组顺序控制:分组完全按照主机清单的顺序分配,若需调整分组,直接修改清单中主机的排列顺序即可
  2. 格式兼容:通过正则替换补全前导零,确保分钟/小时符合Cron的两位数字格式要求
  3. 重复校验:提前获取已有Cron任务列表,避免重复创建相同条目
  4. 时间限制:通过计算确保所有任务的执行小时不超过5,符合需求

主机清单示例

只需按期望的分组顺序添加主机即可:

[all_hosts]
garancieres
beziers
mauchamps
pezenas
vimy
levet
albon
amilly
anais
argentre
# ... 剩余主机依次添加

生成的Cron任务效果

执行Playbook后,会生成符合需求的Cron条目,示例如下:

00 0 * * * php /var/scripts/nedi/discover.php "garancieres" # Découverte de la base de garancieres
00 0 * * * php /var/scripts/nedi/backup.php "garancieres" # Sauvegarde de la base de garancieres
05 0 * * * php /var/scripts/nedi/discover.php "levet" # Découverte de la base de levet
05 0 * * * php /var/scripts/nedi/backup.php "levet" # Sauvegarde de la base de levet

内容的提问来源于stack exchange,提问作者Silver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:50:36