Ansible synchronize模块环境差异致请求密码挂起的排查
排查方向及操作建议
检查localhost的sudo免密配置
日志显示频繁执行localhost的sudo命令,说明本地执行Ansible的用户在操作本地路径或调用rsync时需要sudo权限,但未配置免密。- 在执行Ansible的机器上运行
sudo -l,查看当前用户是否有无需密码执行rsync的权限 - 检查
/etc/sudoers或/etc/sudoers.d/下的配置,确保有类似your_exec_user ALL=(ALL) NOPASSWD: /usr/bin/rsync或全局免密的规则(测试环境可临时用全局免密排查)
- 在执行Ansible的机器上运行
核实synchronize的模式与路径权限
- 如果是拉取模式(
mode: pull):除本地外,还要确认目标主机的远程用户是否有免密sudo执行rsync的权限——虽然ping能通,但sudo权限是单独配置的,可通过ssh user@target_host "sudo -l"验证 - 本地备份路径权限:如果备份到
/root、/var/lib这类需要root权限的目录,本地普通用户无权限会触发sudo请求导致挂起,可换普通用户可写的目录测试
- 如果是拉取模式(
检查Ansible的sudo相关配置
- 查看
ansible.cfg或主机变量,是否全局开启了ansible_become: yes但未配置免密:这种情况即使模块本身不需要,也会触发sudo请求 - 检查是否有
ansible_sudo_flags设置了需要tty的参数,或目标主机sudoers里开启了requiretty:可在sudoers里添加Defaults:your_user !requiretty关闭,或在Ansible里设置ansible_sudo_flags: -n(非交互模式,直接报错不等待输入,便于快速定位)
- 查看
添加rsync调试日志
在playbook的synchronize模块中添加rsync_opts: ["--verbose", "--log-file=/tmp/ansible_rsync.log"],执行后查看本地和目标主机的/tmp/ansible_rsync.log,能看到rsync具体操作的路径及遇到的权限问题手动模拟rsync命令验证
从Ansible的-vvv日志里提取实际执行的rsync命令(类似rsync -avz --rsync-path='sudo rsync' user@host:/source /dest),手动在终端执行,看是否会弹出密码请求——快速区分是Ansible配置问题还是rsync本身的权限问题对比两个环境的主机清单变量
对比正常环境和失败环境的hosts.yml,查看失败环境是否针对某台主机多设置了ansible_become、ansible_sudo这类变量,导致synchronize执行时触发不必要的sudo
内容的提问来源于stack exchange,提问作者adbdkb
相关产品推荐
相关产品推荐

