指定 ansible_ssh_pass 后,公钥认证将被禁用
太长不看
如果在hosts或group_vars等文件中指定ansible_ssh_pass,则会将SSH配置为禁用公钥身份验证。如果想使用公钥身份验证,请将其注释掉。
验证环境
-
- ansible 1.8.1 (pip インストール)
- Ubuntu 14.04
预计即便使用Ansible 1.9版本也会出现类似的行为(因为在该部分没有对源代码进行更改)。
故障或问题
在编写适用于某些角色的用户密码设置playbook时,我考虑到更改SSH密码会造成影响,所以在hosts文件中添加了ansible_ssh_pass的内容。
$ cat hosts
[webserver]
web1.local
web2.local
web3.local
[webserver:vars]
vars_file=web.yml
ansible_sudo_pass=foobar
ansible_ssh_pass=foobar
虽然服务器本身可以通过公钥认证进行访问,但如果将密码明确注册备份,想要保留这种心情,就会导致公钥认证出现错误。
由于正常的ssh连接使用公钥进行身份认证成功,所以认为问题不在于认证密钥本身。
原因
如果写了ansible_ssh_pass,除了密码以外的认证将被禁用。
这个连结是指向GitHub上的Ansible项目中的ssh.py文件的特定代码行(90到92行)。
ansible生成的ssh命令选项中附加了GSSAPIAuthentication=no和PubkeyAuthentication=no。这就是为什么公钥认证无法通过的原因。
总结
我们应该避免写下不必要的参数!