Ansible命令在Shell执行成功 加入crontab运行报无可用认证方法错误
Ansible在crontab中运行报No authentication methods available的原因及解决方案
该错误本质是crontab运行Ansible时,无法获取到有效的SSH认证凭据,核心差异来自crontab的执行环境和交互式Shell环境不一致,具体原因和对应解决方案如下:
- 执行用户SSH配置不一致
你交互式执行Ansible的用户,和crontab中指定的root用户不是同一个:普通用户~/.ssh/目录下存储的SSH私钥,root用户默认无法读取,root默认会读取自己的/root/.ssh/目录下的私钥,两边私钥配置不一致就会认证失败。
解决方案:要么把crontab的执行用户改成你平时跑Ansible的普通用户,要么把可用的SSH私钥放到/root/.ssh/目录下,同时确保私钥权限是600、所属用户组为root。 - ssh-agent缓存凭据无法访问
如果你平时登录后手动解锁了带密码的SSH私钥,凭据是存到当前会话的ssh-agent进程里的,crontab执行时是独立会话,没有SSH_AUTH_SOCK等环境变量,无法获取到ssh-agent里缓存的解锁凭据,就会认证失败。
解决方案:要么使用无密码的SSH私钥用于Ansible批量认证,要么在crontab执行的命令中加--private-key参数显式指定私钥路径,调整后的crontab示例:* * * * * root ansible all -i /tmp/host -f 10 -m ping --private-key /你的/私钥/绝对路径 2>&1 >> /var/log/ansible_cron.log - Ansible配置参数缺失
交互式环境下你的Ansible可能读取了当前用户家目录下的.ansible.cfg配置,里面指定了默认私钥路径、远程用户名等认证参数,crontab运行的root用户没有对应的配置文件,导致认证参数缺失。
解决方案:要么在crontab命令中显式指定ANSIBLE_CONFIG环境变量指向可用的配置文件,要么把对应的配置项写到/etc/ansible/ansible.cfg全局配置中,也可以直接在inventory文件/tmp/host中给主机组统一配置ansible_ssh_user、ansible_ssh_private_key_file等认证参数。 - SELinux权限限制
若服务器开启了SELinux,crontab运行的进程可能没有权限读取SSH私钥文件,可临时执行setenforce 0关闭SELinux测试验证,如果确认为该问题,给私钥文件添加对应的SELinux上下文即可解决。
排查建议:先把crontab中的重定向改为输出到日志文件,查看更详细的报错信息定位具体问题,原写法
2&1 1>/dev/null的重定向顺序错误,无法正常捕获错误输出。
内容的提问来源于stack exchange,提问作者Cans404
相关产品推荐
相关产品推荐

