yinxin
作者yinxin·2019-03-22 08:47
项目经理·某金融机构

Ansible批量设置服务器免密码登录

字数 2709阅读 2575评论 1赞 2

Ansible的优点是不需要安装客户端,只需要主控端设置即可,但是缺点是需要配置免密码认证,而对于海量服务器来说批量配置免秘钥认证比较麻烦,而且配置后安全隐患较大。

本文的目的是实现对多台服务器进行免密码登录设置,并且只需要在本机操作,远端主机不用做任何操作。

1、通过用户和密码批量登录机器

ansible默认是通过免密码登录服务器来实现批量管理的,如果我们的服务器都没有配置免密码登录,但是有用户的密码(比如root用户和root密码,这个时候怎么来做ansible来实现批量部署呢)?

方法如下:

我们在hosts文件里面定义ansible_ssh_pass=密码,即可实现用密码来操作ansible,实例如下
[root@gome ansible]# cat hosts
[password]
10.58.8.1 ansible_ssh_pass=123456
10.58.8.2 ansible_ssh_user=weblogic ansible_ssh_pass=123456 ansible_sudo_pass=weblogic
这里面可以通过root用户和密码来登录10.58.8.1,其他像端口和用户等参数是默认的22和root;
对于10.58.8.2则可以通过weblohic用户和密码来登录,但是roles目录下的yml文件,
需要在全局指定sudo: yes
在本地执行
ssh-keyscan10.58.8.110.58.8.2 >> /root/.ssh/known_hosts
将这两台远程主机的公钥记录到本地的known_hosts
ansible只要是用密码初次登录远程主机就必须执行上面那条命令,不然不会成功。

2、对服务器进行批量免密码登录设置

这里有两个很重要的命令:
1)、ssh-keygen :这个命令是用来生成本机的公钥和私钥的
2)、ssh-keyscan : 这条命令是用来把远程服务器的公钥来获取到本地的。
例:ssh-keyscan 10.58.8.2 >> /root/.ssh/known_hosts,一般是用来保存到known_hosts里面免除首次登录需要输入yes,但是如果直接保存到authorized_keys里面,就不会生效。这条命令有时会报错:no hostkey alg,不过貌似对这些服务器没有影响,可以直接忽略。

首先,需要用ssh-keygen来吧远程主机的公钥来获取到本地;
然后,设置export ANSIBLE_HOST_KEY_CHECKING=False
然后,执行ssh-keygen来生产本机的公钥和私钥。

现在需要通过playbook来实现批量对服务器设置免密码登录了,但是因为现在还没有配置秘钥,所有还得用密码登录,也就是在hosts文件里面对变量ansible_ssh_pass直接定义密码,当然如果所有机器的密码都一样的话,就不需要在hosts里面定义了,直接在命令行用-k参数来指定即可。

然后配置yml文件:

ssh-addkey.yml---- hosts: all gather_facts: no tasks: - name:install sshkey authorized_key:user=rootkey="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}" state=present

在这里是通过authorized_key模块来实现的,该模块的目录在
/usr/lib/python2.6/site-packages/ansible/modules/core/system下,通过查看该模块可以发现,它其实是把免密码登录的操作全部做了一遍。

最后运行:ansible-playbook -i hosts ssh-addkey.yml
这样ansible的公钥就会批量记录到远程主机的authorized_key文件中,这个时候把hosts里面的关于密码的变量去掉,就可以实现免密码登录了。

结论:
现在有一批机器的root用户和密码,怎么实现ansible主机和这批机器之间免秘钥认证呢?
1、ssh-keyscan 主机名 >> /root/.ssh/known_hosts
2、配置hosts文件,带密码参数ansible_ssh_pass
3、配置yml文件
4、运行ansible-playbook -i hosts ssh-addkey.yml

注意:配置免密码登录以后,千万不能再在本地执行ssh-keygen并覆盖原先的公钥,这样的话,之前配置的所有免密码登录的机器都将不可再登录。

错误观点:对于普通用户的免秘钥认证,目前没有有效的批量免密码设置方式,可以尝试的措施是先配root免密码认证,在这个认证的基础上再配置普通用户,然后在控制端重新执行ssh-keygen并覆盖原公钥,这样root免密码登录就会失效。

对于手动配置免密码认证,需要执行两步:
1、ssh-keygen 一直回车
2、ssh-copy-id -i /root/.ssh/id_rsa.pub root@目标主机的IP
2、scp /root/.ssh/id_rsa.pub 目标IP:/root/.ssh/authorizedz_keys
但是上面第二步的两种都需要输入远程主机的密码,这个可以通过python脚本来实现。


ssh相关命令:
ssh-agent 如果一个主机和若干个主机建立免密码登录后,在登录一台主机后,不能通过这台主机实现登录其他主机,也就是这些若干主机之间是无法相互登录的,可以通过转发来实现
1.命令行开启ssh-agent或者ssh-agent bash --login -i
2.命令行ssh-add ,ssh-add命令是把专用密钥添加到ssh-agent的高速缓存中,如果不敲这条命令,则无法实现转发
3.配置/etc/ssh/ssh_config ForwardAgent yes

然后执行ssh -A 主机1;ssh -A 主机2,就可以无限跳转到需要登录的机器

ssh-copy-id 将本地的公钥传输到远程主机的authorized_keys文件中

ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host

ssh-keyscan 收集大量主机公钥的工具
ssh-keyscan10.58.8.110.58.8.2 >> /root/.ssh/known_hosts 把1和2两台主机加入本地known_hosts文件,实现登录不需要输入yes

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论1 条评论

michael1983michael1983联盟成员技术总监某证券
2019-03-22 17:01
主要还是用了ssh的公秘钥原理
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广