【Shell实战】Linux多节点分发文件

多节点分发文件

通过shell脚本将跳板机或者软件中转机上的文件,分发至一组目标机器中。

使用前提:

  • 跳板机或者软件中转机与目标集群均配置免密。
  • 目标机器的接收目录拥有足够的大小。

脚本使用说明:

sh distributing_packages.sh /data/gd/distributing /data/software 22

  • 第一个参数为分发文件所在目录所在的绝对路径:/data/gd/distributing
  • 第二个参数为目标机器接收目录所在的绝对路径:/data/software
  • 第三个参数为(可选参数) ssh端口号 要求整个分发机器们统一.22

使用日志输出样例

2023-11-15 17:46:39,273 [INFO ] 参数提示:第一个参数为分发目录所在的绝对路径,第二个参数为目标接收目录所在的绝对路径,第三个参数为(可选参数) ssh端口号 要求整个分发机器们统一.
例如: sh distributing_packages.sh /data/gd/distributing /data/software 22
2023-11-15 17:46:39,275 [INFO ] =================== 安装前检查开始 ===================
2023-11-15 17:46:39,280 [INFO ] =================== 安装前检查完毕 ===================
2023-11-15 17:46:39,665 [INFO ] =================== 分发文件开始 ===================
2023-11-15 17:46:39,672 [INFO ] 正在向[192.168.1.1]发送文件[apache-doris-2.0.2-bin-x64-noavx2.tar.gz]...
2023-11-15 17:47:04,260 [INFO ] 正在向[192.168.1.1]发送文件[apache-doris-2.0.2-bin-x64.tar.gz]...
2023-11-15 17:47:28,916 [INFO ] 正在向[192.168.1.1]发送文件[distributing_config.properties]...
2023-11-15 17:47:29,055 [INFO ] 正在向[192.168.1.1]发送文件[distributing_packages.sh]...
2023-11-15 17:47:29,195 [INFO ] 正在向[192.168.1.1]发送文件[jdk1.8.0_161.tgz]...
2023-11-15 17:47:30,969 [INFO ][192.168.1.1]发送文件完毕
2023-11-15 17:47:30,977 [INFO ] 正在向[192.168.1.2]发送文件[apache-doris-2.0.2-bin-x64-noavx2.tar.gz]...
2023-11-15 17:47:55,485 [INFO ] 正在向[192.168.1.2]发送文件[apache-doris-2.0.2-bin-x64.tar.gz]...
2023-11-15 17:48:19,987 [INFO ] 正在向[192.168.1.2]发送文件[distributing_config.properties]...
2023-11-15 17:48:20,132 [INFO ] 正在向[192.168.1.2]发送文件[distributing_packages.sh]...
2023-11-15 17:48:20,272 [INFO ] 正在向[192.168.1.2]发送文件[jdk1.8.0_161.tgz]...
2023-11-15 17:48:22,036 [INFO ][192.168.1.2]发送文件完毕
2023-11-15 17:48:22,044 [INFO ] 正在向[192.168.1.3]发送文件[apache-doris-2.0.2-bin-x64-noavx2.tar.gz]...
2023-11-15 17:48:46,588 [INFO ] 正在向[192.168.1.3]发送文件[apache-doris-2.0.2-bin-x64.tar.gz]...
2023-11-15 17:49:11,176 [INFO ] 正在向[192.168.1.3]发送文件[distributing_config.properties]...
2023-11-15 17:49:11,323 [INFO ] 正在向[192.168.1.3]发送文件[distributing_packages.sh]...
2023-11-15 17:49:11,470 [INFO ] 正在向[192.168.1.3]发送文件[jdk1.8.0_161.tgz]...
2023-11-15 17:49:13,266 [INFO ][192.168.1.3]发送文件完毕
2023-11-15 17:49:13,269 [INFO ] =================== 分发文件成功 ===================

目标机器的IP存放在配置文件distributing_config.properties中,脚本通过解析配置文件获取它们。

脚本源码:

distributing_packages.sh

#!/bin/bash
# Author                : Donny
# Date                  : 2023/11/15
# Func                  : 软件包分发脚本
#                         例如:sh distributing_packages.sh /data/gd/distributing /data/software 22
########################################################################### ############################## Prameter area ##############################
# 采用绝对地址表示软件包分发的目录,容量至少50G。
distributingPackagePath=$1
# 分发配置文件名
distributingConfigFile="distributing_config.properties"
# 获取本地IP
localIP=$(ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}')
# ssh端口 为可选参数
sshPort=22# 分发目标节点IP
targetIps=""# 分发目标节点的接收目录,容量至少50G。
targetPath=$2if [[ -n "${3}" ]]; thensshPort=${3}
fi# ############################## Buildin function area ##############################
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 日志模块 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 初始化日志模块
function initLogModule() {# 初始化日志输出logPath=$(pwd)# 脚本日志目录LogFile="$logPath/logs/distributing_package_$(date +%F).log"mkdir -p "${distributingPackagePath}/logs"# 创建日志文件if ! [ -f "${LogFile}" ]; thentouch "$LogFile"fiecho "日志文件为: ${LogFile}"
}# 输出红色高亮字体并标记ERROR
function echo_error() {echo -e "\033[1;31m$1\033[0m"[ -n "${LogFile}" ] && echo "$(date +%F\ %T,%N | cut -c1-23) [ERROR] $1" >>"${LogFile}"
}# 输出默认字体并标记INFO
function echo_info() {echo -e "$1"[ -n "${LogFile}" ] && echo "$(date +%F\ %T,%N | cut -c1-23) [INFO ] $1" >>"${LogFile}"
}# 输出绿色字体并标记INFO
function echo_green() {echo -e "\033[32m$1\033[0m"[ -n "${LogFile}" ] && echo "$(date +%F\ %T,%N | cut -c1-23) [INFO ] $1" >>"${LogFile}"
}
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 日志模块 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<# 获取配置文件内容
function getPropertiesValue() {# check文件是否存在if ! [ -f "${distributingPackagePath}/${distributingConfigFile}" ]; thenecho_error "缺少配置文件[${distributingPackagePath}/${distributingConfigFile}]"exit 1fi# check 文件中是否配置了distributingTargeIpsfile=$(grep 'distributingTargeIps' "${distributingPackagePath}"/"${distributingConfigFile}")if [[ -z "${file}" ]]; thenecho_error "缺少配置项distributingTargeIps"exit 1fi# check distributingTargeIps的合法性targetIps=$(echo "$file" | awk -F "=" '{print $2}' | awk -F "," '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf a[i,j] " ";print ""}}')length1=$(echo "$targetIps" | wc -l)length2=$(echo "$targetIps" | sort -u | wc -l)if [[ "$length1" != "$length2" ]]; thenecho_error "distributingTargeIps中存在IP重复或存在多余分隔符"exit 1fierrorIp=""for ip in ${targetIps}; doif [[ "${ip}" != "${localIP}" ]]; thenssh -p${sshPort} "${ip}" 'mkdir -p '${targetPath}'' &>/dev/null[ "$?" != "0" ] && errorIp="$errorIp"$ip, && continuefidoneif [[ -n "${errorIp}" ]]; thenerrorIp=${errorIp::-1}echo_error "${errorIp}无法ssh"exit 1fi}# ############################## Execute body area ##############################
# 初始化日志
initLogModule
echo_info "参数提示:第一个参数为分发目录所在的绝对路径,第二个参数为目标接收目录所在的绝对路径,第三个参数为(可选参数) ssh端口号 要求整个分发机器们统一.
例如: sh $0 /data/gd/distributing /data/software 22"echo_info "=================== 安装前检查开始 ==================="
current=$(whoami)
# 0.用户检查
if [[ "root" != "$current" ]]; thenecho_error "请使用root用户执行脚本!"exit 1
fi
# 1.检查参数是否齐全
if [[ -z "${distributingPackagePath}" || -z "${targetPath}" ]]; thenecho_error "请输入正确参数:第一个参数为分发目录所在的绝对路径,第二个参数为目标接收目录所在的绝对路径第三个参数为(可选参数) ssh端口号 要求整个集群统一.
例如: sh $0 /data/gd/distributing /data/software 22"exit 1
# 2.检查路径是否非法
elif ! [ -d "${distributingPackagePath}" ]; thenecho_error "目录${distributingPackagePath}不存在"exit 1
fi
echo_green "=================== 安装前检查完毕 ==================="getPropertiesValueerrorflag=0
echo_info "=================== 分发文件开始 ==================="
# 向集群结点分发
for ip in ${targetIps}; doerrorDistribution=""if [[ "${ip}" != "${localIP}" ]]; then# 发送配置文件packageFiles=$(ls ${distributingPackagePath})for file in ${packageFiles}; dosudo scp -P${sshPort} ${distributingPackagePath}/${file} root@${ip}:${targetPath}/${file} &>/dev/null[ "$?" != "0" ] && errorDistribution="$errorDistribution""向[$ip]发送[$file]失败, "doneif [[ -n "${errorDistribution}" ]]; thenerrorflag=1errorDistribution=${errorDistribution}""echo_error "${errorDistribution}"elseecho_info "[${ip}]发送文件完毕"fifidoneif ((${errorflag} == 1)); thenecho_error "=================== 分发文件失败 ==================="exit 1
elseecho_green "=================== 分发文件成功 ==================="
fi# ############################## Return value area ##############################
exit 0

distributing_config.properties

# distributingTargeIps代表软件包需要分发到的IP地址,格式ip1,ip2,ip3
distributingTargeIps=192.168.1.1,192.168.1.2,192.168.1.3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务实战系列之Token

前言 什么是“Token”&#xff1f; 它是服务端生成的一串字符串&#xff0c;以作客户端进行请求的一个令牌&#xff0c;当第一次登录后&#xff0c;服务器生成一个Token便返回给客户端&#xff1b;以后客户端只携带此Token请求数据即可。 简言之&#xff0c;Token其实就是用户身…

数据结构与算法之美学习笔记:20 | 散列表(下):为什么散列表和链表经常会一起使用?

目录 前言LRU 缓存淘汰算法Redis 有序集合Java LinkedHashMap解答开篇 & 内容小结 前言 本节课程思维导图&#xff1a; 今天&#xff0c;我们就来看看&#xff0c;在这几个问题中&#xff0c;散列表和链表都是如何组合起来使用的&#xff0c;以及为什么散列表和链表会经常…

3ds Max渲染用专业显卡还是游戏显卡?

使用3dsmax建模时&#xff0c;会面临诸多选择&#xff0c;除了用vr还是cr的决策&#xff0c;硬件选择上也存在着疑问&#xff0c;比如用专业显卡还是消费级游戏显卡&#xff1f;一般来说&#xff0c;除非是特别专业的大型项目和软件&#xff0c;且预算在5位数以上&#xff0c;常…

Android Glide加载transform CenterCrop, CircleCrop ShapeableImageView圆形图并描边,Kotlin

Android Glide加载transform CenterCrop, CircleCrop ShapeableImageView圆形图并描边&#xff0c;Kotlin import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.…

代码随想录算法训练营第二十五天| 216 组合总合 ||| 17 电话号码的字母组合

216 组合总和 ||| 暴力 class Solution {List<List<Integer>>res new ArrayList<>();List<Integer>newList new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {soluHelper(1,k,n,0);return res;}pr…

qt笔记之qml和C++的交互系列(一):初记

code review! —— 杭州 2023-11-16 夜 文章目录 一.qt笔记之qml和C的交互&#xff1a;官方文档阅读理解0.《Overview - QML and C Integration》中给出五种QML与C集成的方法1.Q_PROPERTY&#xff1a;将C类的成员变量暴露给QML2.Q_INVOKABLE()或public slots&#xff1a;将C类…

Gradle中的DSL,Groovy Kotlin 引用arr库新写法

build.gradle 文件这样写 api fileTree(include: [*.aar], dir: libs) api fileTree(include: [*.aar], dir: libs/gromore) //gromore为lib子目录 api fileTree(include: [*.aar], dir: libs/gromore/baidu) api fileTree(include: [*.aar], dir: libs/gromore/ks…

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-B

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …

scp 跨服务器传输命令,把一个服务器上的文件复制传到当前服务器目录下

要将一个服务器上的文件复制到当前服务器的目录下&#xff0c;可以使用 scp 命令进行跨服务器传输。以下是具体的命令格式&#xff1a; 复制 scp usernamesource_server:/path/to/source_file destination_directory username: 远程服务器的用户名。 source_server: 远程服务…

探索arkui(2)--- 布局(列表)--- 2(支持分组/实现响应滚动位置)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中&#xff0c;开发人员通常会展示新网站或应用程序的设计、功能和用户体验&#xff0c;并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件&#xff0c;吸…

MongoDB分片集群搭建

----前言 mongodb分片 一般用得比较少&#xff0c;需要较多的服务器&#xff0c;还有三种的角色 一般把mongodb的副本集应用得好就足够用了&#xff0c;可搭建多套mongodb复本集 mongodb分片技术 mongodb副本集可以解决数据备份、读性能的问题&#xff0c;但由于mongodb副本集是…

创作者焦点:Temple of Dum-Dum(试炼 3)

《Bomkus 博士的试炼》创作的幕后花絮。 《创作者焦点》系列共分为六部分&#xff0c;重点介绍《Bomkus 博士的试炼》的游戏创作过程及其独特的游戏功能。 Temple of Dum-Dum&#xff1a; Temple of Dum-Dum 是 Bomkus 博士试炼中的第三个挑战&#xff0c;该试炼由六项体验组成…

SecureCRT 9.4.2 for Mac

SecureCRT是一款由VanDyke Software公司开发的终端仿真软件&#xff0c;它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT专门为网络管理员、系统管理员和其他需要保密访问网络设备的用户设计。 SecureCRT具有以下特点&#xff1a; 安全性&#xff1a;SecureCRT支持…

py 时候同时打开多个页面,操作多个页面

在Python中&#xff0c;可以使用多种库和工具来同时打开多个页面并操作它们。以下是几种常见的方法&#xff1a; 使用浏览器自动化库&#xff1a; selenium&#xff1a;这是一个流行的库&#xff0c;用于自动化浏览器操作。你可以使用Selenium来启动多个浏览器窗口或标签页&…

windows服务器热备、负载均衡配置

安装网络负载平衡 需要加入的服务器上全部需要安装网络负载平衡管理器 图形化安装&#xff1a;使用服务器管理器安装 在服务器管理器中&#xff0c;使用“添加角色和功能”向导添加网络负载均衡功能。 完成向导后&#xff0c;将安装 NLB&#xff0c;并且不需要重启计算机。 …

337. 打家劫舍 III

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连…

GoFrame学习随便记1

用Yii1.1中典型的 blog 项目作为例子来学习Web应用应该不错。数据库 sqlite3&#xff0c;windows下可以下载 sqlite-tools-win-x64-*** &#xff08;https://www.sqlite.org/download.htm&#xff09;&#xff0c;把下载的几个exe放到 %GOPATH%\bin 目录下&#xff0c;而该目…

MATLAB中zticks函数用法

目录 语法 说明 示例 指定 z 轴刻度值和标签 指定非均匀 z 轴刻度值 以 2 为增量递增 z 轴刻度值 将 z 轴刻度值设置回默认值 指定特定坐标区的 z 轴刻度值 删除 z 轴刻度线 zticks函数的功能是设置或查询 z 轴刻度值。 语法 zticks(ticks) zt zticks zticks(auto)…

java解析Cron时间表达式为中文描述

碰到个需求&#xff0c;后端返回给前端的时候如果直接返回表达式给前端在页面展示&#xff0c;用户会看不懂&#xff01;所以要转为非开发人员看到也能明白的中文描述 这里说一下后端解析&#xff0c;无非就是空格切分一个个判断了&#xff1a; 前端js解析在这里&#xff1a;…

ReportLab创建合同PDF

一、前言 有一个项目需要将电子签名后的报价合同和生成的发票发送给客户&#xff0c;这种发送给客户的文件一般都是使用PDF格式&#xff0c;主要是因为PDF特别适合阅读且不同平台打开文件格式不会变形&#xff0c;不过要在程序中生成PDF还是比较麻烦的&#xff0c;我们的发票是…