Ansible主机文件配置错误用户名为何剧本仍正常执行?
以下是几种可能的原因,以及对应的验证方法:
1. SSH连接复用缓存跳过了身份验证
Ansible默认开启SSH连接复用机制(ControlMaster),如果之前用正确的用户成功连接过目标主机,后续执行playbook时会直接复用已建立的长连接,不会重新验证你指定的wrong_name用户。
验证方法:执行playbook时禁用连接复用,强制重新建立连接:
ansible-playbook playbook.yml --ssh-common-args="-o ControlMaster=no"
2. SSH密钥认证优先,忽略了指定的用户和密码
如果你的控制节点已经通过SSH密钥对(比如~/.ssh/id_rsa)认证到目标主机的某个合法用户,Ansible会优先使用密钥认证,直接跳过你在主机文件里指定的ansible_user和ansible_ssh_pass。
验证方法:临时禁用密钥认证,强制使用密码登录:
ansible example -m ping -u wrong_name -k -o PreferredAuthentications=password
如果此时报错,说明确实是密钥认证在起作用。
3. 全局配置文件覆盖了主机变量
检查你的Ansible配置文件(/etc/ansible/ansible.cfg或~/.ansible.cfg),如果里面设置了remote_user参数,这个全局配置会直接覆盖主机文件里的ansible_user设置。比如配置里写了remote_user=correct_user,那你指定的wrong_name会被完全忽略。
验证方法:查看配置文件中的remote_user项,或者执行playbook时显式指定用户:
ansible-playbook playbook.yml -u wrong_name
4. 目标主机SSH配置允许无限制登录
这种情况比较少见,但如果目标主机的sshd_config配置了允许空密码登录、匿名登录,或者wrong_name这个用户实际存在且无需密码,也会导致登录成功。
验证方法:登录目标主机,检查/etc/ssh/sshd_config中的PermitEmptyPasswords、AllowUsers等配置,同时确认wrong_name用户是否存在。
快速排查技巧
执行playbook时加上-vvv参数查看详细日志,日志里会明确显示实际使用的SSH用户、认证方式和连接过程,能直接定位问题:
ansible-playbook playbook.yml -vvv
内容的提问来源于stack exchange,提问作者andrey3110

