指定 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。这就是为什么公钥认证无法通过的原因。

总结

我们应该避免写下不必要的参数!