1 问题描述

在编写hosts文件后,在hosts文件中设置了用户名和密码。单独的ssh登录测试没有问题,但在执行ansible的时候报密码错误。

hosts文件如下

cat hosts
[all:children]
docker
etcd
master
[all:vars]
ansible_ssh_user=abc
ansible_ssh_pass=xxx
[docker]
1.1.1.1
[etcd]
2.2.2.2
[master]
3.3.3.3

ansible报错信息如下

x.x.x.x | UNREACHABLE! => {
    "changed": false, 
    "msg": "Invalid/incorrect password: /etc/ssh/ssh_config line 59: Unsupported option \"gssapiauthentication\"\r\nPermission denied, please try again.", 
    "unreachable": true
}

2 问题发现

开始以为是变量的配置方式不对,所以陷入了自我怀疑。在搜索后有配置说可以在group_vars/all.yaml文件中配置。这才意识到问题所在。 首先包含hosts文件的目录下还有其他文件和目录,如下:

[root@vm-paasyy24-057 kubernetes_cluster_setup]# ls
ansible  group_vars  hosts  rbac-generate.sh  roles  setup.yml  yaml
[root@vm-paasyy24-057 kubernetes_cluster_setup]# cat group_vars/all.yml 


#ansible登陆被控端所使用的用户密码
ansible_ssh_user: "abc"
ansible_ssh_pass: "xxx"
ansible_sudo_pass: "xxx"
ansible_become_method: sudo
ansible_become: true

到这里问题就明白了,hosts文件中设置的用户名和密码被这个all.yml的配置覆盖了。 如果将hosts文件做如下更改

cat hosts
[all:children]
docker
etcd
master
[all:vars]
ansible_ssh_user=abc
ansible_ssh_pass=xxx
[docker]
1.1.1.1 ansible_ssh_user=abc ansible_ssh_pass=xxx
[etcd]
2.2.2.2
[master]
3.3.3.3

则docker组正常,其他组失败,说明其他组的用户名和密码还是使用的all.yml文件中的配置。这也说明了把变量写在IP后面的方式,优先级是最高的。