Ansible 如何不借助AWX定时调度,等待至指定时间运行playbook
实现方案
完全可以通过Ansible内置模块实现该需求,无需依赖AWX调度或第三方工具,核心使用Ansible自带的pause模块即可实现等待到指定时间再执行后续任务。
核心实现逻辑
- 预先定义任务执行的目标时间,支持固定写死在playbook中,也支持执行时通过外部参数传入
- 通过
pause模块的条件判断能力,循环校验当前时间是否达到目标时间,未达条件则持续等待 - 可自定义时间检查间隔,避免频繁校验占用资源
完整playbook示例
--- - name: 夜间更新任务 hosts: 你的被控节点组 gather_facts: true vars: # 目标执行时间,格式为 年-月-日 时:分:秒,也可执行playbook时通过-e参数覆盖 target_exec_time: "2024-06-15 02:00:00" # 时间检查间隔,单位秒,此处设置为每分钟检查一次 check_interval: 60 # 最大重试次数,此处设置为1440次即最多等待24小时,覆盖全时段等待需求 max_retries: 1440 tasks: - name: 等待至预设执行时间 ansible.builtin.pause: seconds: "{{ check_interval }}" until: ansible_date_time.epoch | int >= (target_exec_time | to_datetime('%Y-%m-%d %H:%M:%S')).strftime('%s') | int retries: "{{ max_retries }}" # 该任务在控制端执行,不影响被控节点 delegate_to: localhost # 下方为你实际要执行的更新任务,等时间到了才会开始运行 - name: 传输大文件到被控节点 ansible.builtin.copy: src: /path/to/your/large/file dest: /target/path/on/remote/ mode: '0644' - name: 执行应用更新逻辑 ansible.builtin.shell: /path/to/update/script.sh register: update_result - name: 输出更新结果 ansible.builtin.debug: var: update_result.stdout
使用说明
- 灵活指定执行时间:无需修改playbook,执行时直接传入目标时间即可,示例命令:
ansible-playbook night_update.yml -e "target_exec_time='2024-06-16 01:30:00'" - 无需指定日期的场景:如果要固定在执行playbook当天的凌晨2点执行,可直接修改目标时间变量为:
target_exec_time: "{{ '%Y-%m-%d 02:00:00' | strftime }}" - 注意事项:请确保Ansible控制端的系统时间准确,避免时间判断出现偏差;等待过程中如需终止任务,按
Ctrl+C后再按C即可中断playbook运行。
内容的提问来源于stack exchange,提问作者patrick.schweinsberg
相关产品推荐
相关产品推荐

