如何用Ansible按5台主机分组批量生成分段定时Cron任务
Ansible 批量按分组生成Cron任务方案
需求说明
- 现有82台主机,需按每5台为一组分配Cron执行时间
- 分组时间规则:
- 第1组5台 → 分钟
00,小时00 - 第2组5台 → 分钟
05,小时00 - 第3组5台 → 分钟
10,小时00 - ...以此类推,分钟每5分钟递增,任务执行时间最晚不超过
05:00
- 第1组5台 → 分钟
- 需要在
nedi.mousquetaires.com上生成两类Cron任务:- 执行
discover.php的主机发现任务 - 执行
backup.php的主机备份任务
- 执行
- 避免重复创建已存在的Cron条目
实现思路
利用Ansible内置变量计算每台主机的分组归属,自动推导对应Cron时间:
- 通过
play_hosts.index(inventory_hostname)获取当前主机在清单中的索引(从0开始) - 整数除法计算分组编号:
索引 // 5,每5台为一组 - 分钟值 =
分组编号 × 5,格式化为两位数字(补前导零) - 小时值 =
分钟值 // 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 }}")
关键说明
- 分组顺序控制:分组完全按照主机清单的顺序分配,若需调整分组,直接修改清单中主机的排列顺序即可
- 格式兼容:通过正则替换补全前导零,确保分钟/小时符合Cron的两位数字格式要求
- 重复校验:提前获取已有Cron任务列表,避免重复创建相同条目
- 时间限制:通过计算确保所有任务的执行小时不超过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
相关产品推荐
相关产品推荐

