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

ops/2024/9/20 1:15:19/ 标签: linux, 运维

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

问题分析

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

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

准备安装文件和脚本

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

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

scp /opt/filename root@192.168.32.22:/opt/

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

#!/bin/bash
#在指定目标范围ip的主机间建立信任关系# 判断公钥是否已存在,不存在就生成
echo "开始运行>>>"
if [ ! -f ~/.ssh/id_rsa ] ; thenecho "生成公钥>>>"ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
elseecho "公钥已存在,继续运行"
ficat ~/.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})
dotarget_ip=${network}.${ip}echo "正在和目标主机${target_ip}建立信任关系>>>"sleep 2my_command="ssh-copy-id -i /root/.ssh/id_rsa.pub root@${target_ip}"expect -c "spawn ${my_command};set timeout 60expect {\"password:\"             {send \"${pw}\r\";  exp_continue}\"connecting (yes/no)?\"  {send \"yes\r\";    exp_continue}}"echo "目标主机${target_ip}间的信任关系已建立>>>"
done

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

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

#!/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=$1local file_path=$2scp "$file_path" root@"$target_ip":/opt/ &>> "$log_file"# 检查发送结果并记录到日志文件if [ $? -eq 0 ]; thenecho "${file_path}文件发送成功到${target_ip}"echo "${file_path}文件发送成功到${target_ip}" >> "$log_file"elseecho "${file_path}文件发送失败到${target_ip}"echo "${file_path}文件发送失败到${target_ip}" >> "$log_file"fi
}for ip in $(seq ${start_ip} ${end_ip})
dotarget_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} 获取详细结果。"

指定各机器运行指定脚本

#!/bin/bash# 目标主机 IP 范围
network="192.168.32"
start_ip=22
end_ip=23# 运行脚本并记录结果到日志文件
function run_script() {local target_ip=$1local script_path=$2ssh root@"$target_ip" "$script_path" &>> "$log_file"# 检查运行结果并记录到日志文件if [ $? -eq 0 ]; thenecho "${script_path}脚本在${target_ip}上成功运行"echo "${script_path}脚本在${target_ip}上成功运行" >> "$log_file"elseecho "${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})
dotarget_ip=${network}.${ip}echo "正在运行脚本在 ${target_ip}..."run_script "$target_ip" "/opt/install_jdk.sh"
done
echo "脚本运行完成。请查看日志文件 ${log_file} 获取详细结果。"

最终执行

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

#!/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

大功告成!

[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 获取详细结果。

http://www.ppmy.cn/ops/102505.html

相关文章

扁线电机介绍

相比于圆线,扁线因为扁平矩形的特殊性能够让线圈缠绕更加紧密,槽满率由原先的40%提升到70%。 这意味着相同体积下线圈中的导线更多,电流的传导效率更高,能够减少电阻损耗,产生的磁场更强,电机功率也就更大&…

IP地址与SSL证书:保障网络安全的关键

在数字时代,网络安全至关重要,而SSL(安全套接层)证书作为加密用户与服务器之间数据传输的利器,扮演着不可或缺的角色。然而,谈及SSL证书时,一个常见的误区是它们通常与域名绑定,而非…

【前端】理解与使用sessionStorage、localStorage与cookie

深入理解与高效使用 sessionStorage、localStorage 与 cookie 背景 在构建一个多页面的 Vue web 应用时,我面临了一个关键问题:如何有效地管理用户的登录状态。为了减少对服务器的不必要请求,我尝试了全局状态注入的方法,但这种…

【通俗理解】深度学习特征提取——Attention机制的数学原理与应用

【通俗理解】深度学习特征提取——Attention机制的数学原理与应用 关键词提炼 #深度学习 #特征提取 #Attention机制 #CNN #Transformer #关联特征 #MLP #拟合处理 第一节:Attention机制的类比与核心概念 1.1 Attention机制的类比 Attention机制可以被视为一个“特…

【kafa系列】kafka如何保证消息不丢失

【kafa系列】kafka如何保证消息不丢失 Apache Kafka通过多种机制来确保消息不丢失,这些机制包括但不限于副本机制、ISR(In-Sync Replicas)机制、ACK(Acknowledgment)机制、幂等生产者(Idempotent Producer&…

K8S对接Ceph分布式存储

文章目录 一、Ceph理论知识1、Ceph简介2、Ceph分布式存储的优点3、Ceph核心组件 二、部署Ceph高可用集群1、服务器环境信息2、部署前环境准备工作3、部署Ceph监控服务Monitor4、激活Ceph存储服务OSD 三、K8S对接Ceph存储1、K8S对接Ceph RBD实现数据持久化2、基于Ceph RBD生成PV…

计算机视觉编程 1(图片处理)

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值,用来描述图像中各个像素的明暗程度。在计算机视觉中,灰度可以通过以下方式来计算: 1. 平均值法:将图像中每…

计算机毕业设计推荐-基于python的个性化旅游路线推荐平台

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的个性化旅游路线…

ubuntu20 安装ros noetic版本

【ROS】Ubuntu20.04卸载重装ROS_ubuntu20.04卸载ros-CSDN博客 错误处理——rosdep init,rosdep update失败解决方案_rosdep init出错-CSDN博客 ubuntu 20.04解决在处理时有错误发生: /var/cache/apt/archives/python3-catkin-pkg-modules_0.4.24-1_all…

NoSQL数据库-Redis集群详解及案例实现

一、 关系型数据库和 NoSQL 数据库 1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库 关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL、Oracle、MS SQL Server 和 D…

基于JAVA的专利资源共享平台

项目介绍 基于JAVA的专利资源共享平台系统是一个集专利信息展示、资源共享、交易服务等功能于一体的综合性平台。该系统利用JAVA语言的强大功能和广泛的生态系统,结合数据库技术、Web开发技术等,为用户提供了一个高效、安全、便捷的专利资源共享和交易环…

【C++】日期和时间

C 提供了多种处理日期和时间的功能&#xff0c;主要通过标准库 <ctime> 和 <chrono> 提供。以下是 C 中处理日期和时间的功能介绍及其用法&#xff1a; 1. <ctime> 库 <ctime> 是 C 中处理时间的传统库&#xff0c;提供了一些基本的时间操作函数。这…

Amazon Bedrock 实践:零基础创建贪吃蛇游戏

本文探讨了如何利用 Amazon Bedrock 和大型语言模型&#xff0c;快速创建经典的贪吃蛇游戏原型代码。重点展示了利用提示工程&#xff0c;将创新想法高效转化为可运行代码方面的过程。文章还介绍了评估和优化提示词质量的最佳实践。 亚马逊云科技开发者社区为开发者们提供全球的…

SD三分钟入门!秋叶大佬24年8月最新的Stable Diffusion整合包V4.9.7来了~

先感谢赛博菩萨秋葉大佬&#xff0c;开发绘世启动器&#xff0c;**8月15日更新了秋叶整合包最新版本4.9。**文末有安装包&#xff01;&#xff01; SD整合包可以扫描下方,免费获取 1 什么是 Stable Diffusion&#xff1f; Stable Diffusion&#xff08;简称SD&#xff09;是…

一键编译QT5源码脚本(交叉编译arm64、mips64版本)

前言 这几天为了编写国产专用机上的软件&#xff0c;又盘起了交叉编译.. 一开始想使用深度最新的deepin 23正式版做系统&#xff0c;搭建编译环境。然而交叉编译链工具直接安装失败&#xff01; 然后又装了Debian12原版系统&#xff0c;编译环境倒是顺利搭建起来&#xff0c…

DDIA 分布式数据的分区与复制 - 基于 Redis、Kafka、Elasticsearch 的深入分析

引言 本文基于《Designing Data-Intensive Applications》一书&#xff08;设计数据密集型应用&#xff0c;简称 DDIA&#xff09;&#xff0c;深入探讨了 Redis、Kafka 和 Elasticsearch 等常用组件的分区与复制机制。通过这些案例分析&#xff0c;我们可以更好地理解分布式系…

Java Web实战教程:如何一步步开发美容美发管理系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

Python编码系列—Docker容器的高效使用与实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Linux系统(Centos7)没有安装GUI图形界面后期加装方法

问题背景 前期图方便安装了centos7的命令行版本&#xff0c;后期发现需要有图形界面才行&#xff0c;所以需要在后期加装图形界面。 问题解决 必要要求&#xff1a;服务器能够连接互联网&#xff0c;如果是VMware,网络选择NAT&#xff0c;开机后就可以联网&#xff1b;所有操…

《上海包装》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《上海包装》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《上海包装》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;上海世纪出版&#xff08;集团&#xff09;有限公司…