Jenkins用户执行带become的Ansible playbook挂起问题求助
你的问题根源是配置冲突导致Ansible执行become任务时实际在Jenkins本地节点请求sudo,而非你预期的远程目标节点,具体原因和解决方法如下:
问题根因
Ansible变量优先级规则中,play级别的vars定义优先级高于inventory组级别的变量。你在playbook全局vars里强制设置了ansible_connection: local,覆盖了hosts中给dockermanager组配置的ansible_connection: ssh,导致所有任务都在Jenkins所在的本地节点执行,而非远程的10.156.0.2节点。
你secrets.yml里存储的是远程节点ansible-cicd用户的sudo密码,和Jenkins本地jenkins用户的sudo密码不匹配,Ansible请求本地sudo时密码验证失败,就会一直挂起等待密码输入,和你观察到的现象完全吻合。
解决步骤
- 删除playbook.yml里全局vars中的
ansible_connection: local配置,保留hosts里的ssh连接配置,确保任务正常在远程目标节点执行。 - 确认远程目标节点上ansible-cicd用户的sudo配置正确:如果需要密码提权,确认secrets.yml里的变量名是标准的
ansible_become_pass,没有拼写错误;如果不需要密码提权,在远程节点的sudoers文件里给ansible-cicd用户配置NOPASSWD: ALL(可限定可执行命令范围,安全性更高)。 - 如果确实有部分任务需要在Jenkins本地执行,不要全局设置local连接,而是给对应任务单独添加
delegate_to: localhost参数即可。 - 调试验证:手动切换到jenkins用户,执行
ansible-playbook ./ansible/playbook.yml -i ./ansible/hosts -vvv,查看连接日志确认是用SSH连接远程节点执行become任务,排查是否还有其他变量冲突。
关于become权限的疑问
Ansible的become功能本身不需要本地sudo权限,只有当你在Ansible控制节点本地执行需要提权的任务时,才需要本地对应用户的sudo权限。你的场景是要在远程节点提权,正常情况下不需要Jenkins本地jenkins用户有sudo权限。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

