如何配置每小时运行ansible playbook的Cron定时任务
问题原因&解决方案
1. 首先修复Crond配置语法错误
你贴出的crontab -e配置里第一条任务存在语法错误:/bin/sh -c 后面的命令字符串没有闭合单引号,会直接导致命令解析失败无法执行。
修正后的写法:
# 修正语法,补全闭合单引号,加日志重定向方便排查 */1 * * * * /bin/sh -c '. ~/.profile; /usr/local/bin/ansible-playbook /etc/ansible/automation/crontest.yml' >> /var/log/ansible_crontest.log 2>&1
2. Cron环境下Ansible执行的通用注意事项
Cron运行时不会加载用户的完整环境变量,也不会默认进入Ansible的工作目录,所以必须补全所有路径和必要参数:
- 所有命令、文件路径都写绝对路径,包括ansible-playbook、playbook文件、inventory文件
- 执行前先切换到playbook所在的工作目录,避免playbook内的相对路径(比如引用roles、vars文件)失效
- 新增执行日志重定向,方便定位具体报错
标准每小时执行的Cron任务示例:
# 每小时0分执行指定playbook,日志输出到/var/log/ansible_hourly.log 0 * * * * cd /etc/ansible/automation && /usr/local/bin/ansible-playbook -i /etc/ansible/hosts main.yaml >> /var/log/ansible_hourly.log 2>&1
3. 修正Ansible Cron模块的配置
你之前用Ansible Cron模块写的任务里用了相对路径,部署后也会出现找不到命令/文件的问题,修正后的写法:
- name: 每小时运行Ansible playbook cron: name: "Run hourly ansible playbook" minute: "0" hour: "*" job: "cd /etc/ansible/automation && /usr/local/bin/ansible-playbook -i /etc/ansible/hosts /etc/ansible/automation/main.yaml >> /var/log/ansible_hourly.log 2>&1"
4. 排查验证方法
配置完成后可以先手动执行一遍Cron里的完整命令,确认能正常运行,再等待Cron调度,执行后查看你配置的日志文件即可看到具体执行过程和报错信息。
内容的提问来源于stack exchange,提问作者Vinny
相关产品推荐
相关产品推荐

