在前面的ssh部署中写过如何实现自动部署,请参考:https://blog.51cto.com/lehappy/2785809
但有朋友向我反馈,单位的每台服务器信息都不一样,shell脚本不能用有其它办法不?
为解决他的问题就针对每台服务器IP、端口、用户名、密码都不相同,用shell脚本写个
自动部署ssh终极版,其实核心命令是awk。
1 服务器信息分析
做运维的朋友都会记录自己维护所有服务器的信息,一般信息内容包含:
服务器名称、服务器IP、端口、用户名、密码、用于什么业务、使用单位、联系方式、硬件基本信息等,
里面需要的信息为服务器IP、端口、用户名、密码,把它整理到txt文件(最好使用Notepad++),不要使用
windows自带的记事本(需要使用dos2unix进行转换),不然脚本执行会有问题。
txt整理格式为:
ip port user password
192.168.40.23 22 root 123
192.168.40.59 2241 admin admin@123
192.168.40.70 25417 ynyld yn_7788
192.168.40.101 56600 kmzq jjyy#110
说明格式信息中 ip port user password 最少有一个空格间隔
把整理好的文件放置到服务端(就是需要把公钥分发的服务器,不要错了)
在例子中我就直接把整理好的数据复制到服务器文件里面,文件名称为ssh_info.txt
[root@web01 /scripts]#cat ssh_info.txt
192.168.40.23 22 root 123
192.168.40.59 2241 admin admin@123
192.168.40.70 25417 ynyld yn_7788
192.168.40.101 56600 kmzq jjyy#110
2 编写shell脚本
vim /scripts/ssh_key_auto.sh
#!/bin/bash
while read line;do
# 分发客户端IP
ip=$(echo $line|awk '{print $1}')
# 分发客户端端口
port=$(echo $line|awk '{print $2}')
# 分发客户端用户名
user=$(echo $line|awk '{print $3}')
# 分发客户端用户密码
password=$(echo $line|awk '{print $4}')
/usr/bin/sshpass -p${password} ssh-copy-id -i /root/.ssh/id_dsa.pub ${user}@$ip -p$port "-o StrictHostKeyChecking=no" &>/dev/null
if [ $? -eq 0 ];then
echo "$network$ip -> ok"
else
echo "$network$ip -> fail"
fi
# /scripts/ssh_info.txt 整理好的数据存放路径
done
# 测试
[root@web01 /scripts]#sh ssh_key_auto.sh
192.168.40.23 -> ok
192.168.40.59 -> fail
192.168.40.70 -> fail
192.168.40.101 -> fail
3 总结
A.执行脚本时必须安装sshpass程序,不然无法成功。安装命令 yum -y install sshpass
B.上面的测试只有 192.168.40.23 -> ok 成功,其他都没有成功原因为:
服务器ip、端口、用户名、密码其中一个不对,脚本执行就不会成功,整理数据信息前,每台服务器测试下保证数据正确。
执行脚本时保证相关设备正常,如网线、交换机、执行的服务器是开机状态不、停电了没有等。
系统防火墙设置、SELinux设置等。 系统优化,请参考:https://blog.51cto.com/lehappy/2781516
C.整理好的数据文件一定要保管好 保管好 保管好重要的事情说三遍,不要脚本执行完成后就不管了,被其他人拿到后果自己应该知道是什么。