批量在多台Linux机器上安装OpenJDK

上一次我们实践了手动安装OpenJDK的过程,并且完成了用脚本一键安装的试验。但是本质上,我还是每台机器上单独进行操作。那这就产生了一个问题,如果我需要一次性在多台机器上部署安装,需要怎么操作呢。

问题分析

假设我的目的是在一台机器上运行一个指令,或者说运行一个脚本,就可以在指定的多台机器上批量安装OpenJDK,那我大概需要做到如下几件事情。

  1. 分别将安装文件和安装脚本发送到各机器的指定路径
  2. 指定各机器运行指定脚本

准备安装文件和脚本

首先我们来解决第一个问题,将安装文件和脚本文件复制到各机器上。

在机器之间拷贝文件,很自然的我们想到了scp命令,比如

jsx 复制代码
scp /opt/filename root@192.168.32.22:/opt/

但是这样需要在各个主机之间建立信任关系,我们使用如下脚本建立信任关系

bash 复制代码
#!/bin/bash
#在指定目标范围ip的主机间建立信任关系

# 判断公钥是否已存在,不存在就生成
echo "开始运行>>>"
if [ ! -f ~/.ssh/id_rsa ] ; then
    echo "生成公钥>>>"
    ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
else
    echo "公钥已存在,继续运行"
fi

cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
pw="abc@1234"

# 目标主机 IP 范围
network="192.168.32"
start_ip=22
end_ip=23

# 用expect模拟输入,使用ssh-copy-id命令将公钥复制到各目标主机
for ip in $(seq ${start_ip} ${end_ip})
do
    target_ip=${network}.${ip}
    echo "正在和目标主机${target_ip}建立信任关系>>>"
    sleep 2
    my_command="ssh-copy-id -i /root/.ssh/id_rsa.pub root@${target_ip}"
    expect -c "
        spawn ${my_command};
        set timeout 60
        expect {
                 \"password:\"             {send \"${pw}\r\";  exp_continue}
                 \"connecting (yes/no)?\"  {send \"yes\r\";    exp_continue}
               }
        "
    echo "目标主机${target_ip}间的信任关系已建立>>>"
done

建立信任关系后,用scp命令向目标主机复制文件就不需要输入密码了。

那么下一步我们就写一个shell脚本,它的作用就是把安装文件和脚本发送到目标主机。

bash 复制代码
#!/bin/bash
#在指定目标范围ip的主机间复制文件

# 目标主机 IP 范围
network="192.168.32"
start_ip=22
end_ip=23

# 获取当前日期和时间
current_date=$(date +%Y%m%d)
current_time=$(date +%H%M%S)

# 日志文件名
log_file="${current_date}_${current_time}.log"

# 发送文件并记录结果到日志文件
function send_file() {
    local target_ip=$1
    local file_path=$2

    scp "$file_path" root@"$target_ip":/opt/ &>> "$log_file"
    # 检查发送结果并记录到日志文件
    if [ $? -eq 0 ]; then
        echo "${file_path}文件发送成功到${target_ip}"
        echo "${file_path}文件发送成功到${target_ip}" >> "$log_file"
    else
        echo "${file_path}文件发送失败到${target_ip}"
        echo "${file_path}文件发送失败到${target_ip}" >> "$log_file"
    fi
}

for ip in $(seq ${start_ip} ${end_ip})
do
    target_ip=${network}.${ip}
    echo "正在复制文件到 ${target_ip}..."
    send_file "$target_ip" "/opt/install_jdk.sh"
    send_file "$target_ip" "/opt/openjdk-22.0.2_linux-x64_bin.tar.gz"
done
echo "文件复制完成。请查看日志文件 ${log_file} 获取详细结果。"

指定各机器运行指定脚本

bash 复制代码
#!/bin/bash

# 目标主机 IP 范围
network="192.168.32"
start_ip=22
end_ip=23

# 运行脚本并记录结果到日志文件
function run_script() {
    local target_ip=$1
    local script_path=$2

    ssh root@"$target_ip" "$script_path" &>> "$log_file"
    # 检查运行结果并记录到日志文件
    if [ $? -eq 0 ]; then
        echo "${script_path}脚本在${target_ip}上成功运行"
        echo "${script_path}脚本在${target_ip}上成功运行" >> "$log_file"
    else
        echo "${script_path}脚本在${target_ip}上运行失败"
        echo "${script_path}脚本在${target_ip}上运行失败" >> "$log_file"
    fi
}

# 获取当前日期和时间
current_date=$(date +%Y%m%d)
current_time=$(date +%H%M%S)

# 日志文件名
log_file="${current_date}_${current_time}.log"

for ip in $(seq ${start_ip} ${end_ip})
do
    target_ip=${network}.${ip}
    echo "正在运行脚本在 ${target_ip}..."
    run_script "$target_ip" "/opt/install_jdk.sh"
done
echo "脚本运行完成。请查看日志文件 ${log_file} 获取详细结果。"

最终执行

我们假设信任关系已建立,那么运行以下脚本即可。

bash 复制代码
#!/bin/bash

# 最终脚本,批量安装
# 下载文件
wget -P "/opt/" https://download.java.net/java/GA/jdk22.0.2/c9ecb94cd31b495da20a27d4581645e8/9/GPL/openjdk-22.0.2_linux-x64_bin.tar.gz
# 发送到各主机
source a.sh
# 执行安装
source b.sh

大功告成!

bash 复制代码
[root@node21 ~]# source insatall.sh 
--2024-08-27 17:17:37--  https://download.java.net/java/GA/jdk22.0.2/c9ecb94cd31b495da20a27d4581645e8/9/GPL/openjdk-22.0.2_linux-x64_bin.tar.gz
Resolving download.java.net (download.java.net)... 23.45.136.96
Connecting to download.java.net (download.java.net)|23.45.136.96|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 201996264 (193M) [application/x-gzip]
Saving to: '/opt/openjdk-22.0.2_linux-x64_bin.tar.gz'

100%[============================================================================================================================>] 201,996,264 4.17MB/s   in 49s    

2024-08-27 17:18:27 (3.91 MB/s) - '/opt/openjdk-22.0.2_linux-x64_bin.tar.gz' saved [201996264/201996264]

正在复制文件到 192.168.32.22...
/opt/install_jdk.sh文件发送成功到192.168.32.22
/opt/openjdk-22.0.2_linux-x64_bin.tar.gz文件发送成功到192.168.32.22
正在复制文件到 192.168.32.23...
/opt/install_jdk.sh文件发送成功到192.168.32.23
/opt/openjdk-22.0.2_linux-x64_bin.tar.gz文件发送成功到192.168.32.23
文件复制完成。请查看日志文件 20240827_171827.log 获取详细结果。
正在运行脚本在 192.168.32.22...
/opt/install_jdk.sh脚本在192.168.32.22上成功运行
正在运行脚本在 192.168.32.23...
/opt/install_jdk.sh脚本在192.168.32.23上成功运行
脚本运行完成。请查看日志文件 20240827_171930.log 获取详细结果。
相关推荐
Cx330❀几秒前
【Linux网络】从零构建高性能UDP服务器:从Echo到英译汉业务级实现
大数据·linux·服务器·开发语言·网络·c++·udp
Amnesia0_09 分钟前
传输层协议UDP和TCP
linux·网络·tcp/ip·udp
minji...9 分钟前
Linux 高级IO(三)多路转接之poll,poll的原理,poll版本的TCP服务器的实现
linux·服务器·网络·select·多路转接·epoll·poll
小此方12 分钟前
Re:Linux系统篇(二十四)进程篇·九:进程从创建到退出的底层机制与写时拷贝全解
linux·运维·驱动开发
物联网软硬件开发-轨物科技15 分钟前
【轨物方案】告别人工运维痛点!光伏清洁检测一体化机器人,开启电站智能运维新时代
运维·机器人
春日见15 分钟前
5分钟入门强化学习之蒙特卡洛(MC)算法与实现
运维·服务器·人工智能·深度学习·算法·机器学习
蜜蜜不吃糖17 分钟前
解决Veeam备份数据到Backup copy服务器报错session log违反了检查约束
运维·服务器
艾莉丝努力练剑22 分钟前
【Linux网络】Linux 网络编程:传输层TCP(二)
linux·运维·服务器·网络·tcp/ip·计算机网络
都在酒里23 分钟前
Linux字符设备驱动开发(九):内核定时器——实现LED周期性闪烁与轮询驱动原理
linux·运维·驱动开发·交互
都在酒里1 小时前
Linux字符设备驱动开发(十):综合实例——I2C传感器 + LED智能控制与进阶指南
linux·运维·服务器·驱动开发·交互