1、需求描述
公司内有一个N个节点的集群,需要统一安装一些软件(jdk)
需要开发一个脚本,实现对集群中的N台节点批量自动下载、安装jdk
2、思路
思考一下:我们现在有一个JDK安装包在一台服务器上。那我们要实现这个目标:
1、把包传到每台服务器,或者通过本地yum源的方式去服务器取
2、给每台一台机器发送一个安装脚本,并且让脚本自己执行
3、要写一个启动脚本,用来执行以上两部操作
3、Expect的使用
蛋疼点:假如在没有配置SSH免密登录的前提下,我们要要是scp命令从一台机器拷贝文件夹到另外的机器,会有人机交互过程,那我们怎么让机器自己实现人机交互?
灵丹妙药:expect
命令 | 描述 |
---|---|
set | 可以设置超时,也可以设置变量 |
timeout | 超时等待时间,默认 10s |
spawn | 执行一个命令 |
expect “” | 匹配输出的内容 |
exp_continue | 继续执行下面匹配 |
思路:模拟该人机交互过程,在需要交互的情况下,通过我们的检测给输入提前准备好的值即可
示例:观看配置SSH免密登录的过程
实现脚本:
[root@hadoop02 bin]# vi testExpect.sh
#!/bin/bash
## 定义一个函数
sshcopyid(){
expect -c "
spawn ssh-copy-id $1
expect {
\"(yes/no)?\" {send \"yes\r\";exp_continue}
\"password:\" {send \"$2\r\";exp_continue}
}
"
}
## 调用函数执行
sshcopyid $1 $2
注意:如果机器没有expect,则请先安装expect
yum install -y expect
4、脚本实现
见代码
1、启动脚本initInstallJDK.sh
#!/bin/bash
SERVERS="192.168.123.201"
PASSWORD=hadoop
BASE_SERVER=192.168.123.202
# 自动实现ssh免密配置
auto_ssh_copy_id() {
expect -c "set timeout -1;
spawn ssh-copy-id $1;
expect {
*(yes/no)* {send -- yes\r;exp_continue;}
*password:* {send -- $2\r;exp_continue;}
eof {exit 0;}
}";
}
# 拷贝密钥到所有节点
ssh_copy_id_to_all() {
for SERVER in $SERVERS
do
auto_ssh_copy_id $SERVER $PASSWORD
done
}
# 调用函数
ssh_copy_id_to_all
for SERVER in $SERVERS
do
scp installJDK.sh root@$SERVER:/root
ssh root@$SERVER chmod 755 installJDK.sh
ssh root@$SERVER /root/installJDK.sh
done
#!/bin/bash
# 下载解压配置环境变量
BASE_SERVER=192.168.123.202
yum install -y wget
wget $BASE_SERVER/soft/jdk-8u73-linux-x64.tar.gz
tar -zxvf jdk-8u73-linux-x64.tar.gz -C /usr/local
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/jdk1.8.0_73
export PATH=\$PATH:\$JAVA_HOME/bin
EOF