文章目录
脚本后续更新说明
#因假期无聊、再次脚本的基础上进行重构,便于后续的添加、修改等
#且重构的文件数量较多、统一提交给gitee.com
gitee地址:
https://gitee.com/yuanhuanliang/run
未设置公用,如有需要请私信联系
后续新增的功能详见如下链接
https://blog.csdn.net/qq_44246980/article/details/124528778
本文末尾附2千行的脚本,且有些功能尚不支持,可自行复制下载查看
项目背景
最近在微信公众号中看到一篇很有参考意义的脚本脚本大集合,但是却没有对外公布相应的源码
所以空余时间无聊,根据那个那脚本信息,准备把我之前写的相关脚本给串联启动,时间非运维类可以执行,显得非常人性化。
首先,简单介绍一下脚本
执行方式很简单
sh Run.sh
# 或者
bash Run.sh
# 或者
chmod +x Run.sh
./Run.sh
#任选一种都可以完美地执行
执行结果如下
主菜单的模块较多,实际上只有选项一和选项二完成了,三的话涉及一系列脚本,当前尚未完善,且不准备开放,不做过多的描述,选项四是日常学习过程中用到的小脚本,后续会陆续补充
脚本目录结构
选项一 系统资源查看
CPU信息查看
先选择CPU,填入数字“1”
磁盘信息查看
内存信息查看
网卡信息查看
服务器信息查看
选择"6"的话,会把CPU、磁盘、内存、服务器、网卡的信息都打印在屏幕上
选项二 网卡实时流量
网卡实时流量
选项三 常见服务部署
监控服务(prometheus、zabbix)及其组件
选项四 自定义脚本
RPM安装包下载
执行结果如下
选项五 Yum仓库配置
yum仓库的添加(在线)
选项六 基础环境配置
基础环境配置
以选项6为例,检查服务状态
备注:
如果想要安装harbor服务,则执行脚本输入:3 > 4> 1
https的方式方式尚未完善,需要手动修改证书,且生产证书的脚本,则执行脚本输入:4==>2
然后手动修改一下:harbor.yml文件,重新加载服务即可
选项七 中间件服务
选项八 docker镜像构建
目录添加了kafka的镜像构建方式,当时对应的jdk、kafka的安装包都需要手动下载并上传到指定的目录下
下面分享一下脚本
#!/bin/bash
#所有者:北城半夏
#当前版本
#v1.0.1
#################################################################################
# #
# 定义变量 #
# #
#################################################################################
centosVersion=$(awk '{print $(NF-1)}' /etc/redhat-release)
bashpath="$(cd `dirname $0`;pwd)"
#检查当前系统安装包是否已安装如下的rpm包
rpm_name="wget net-tools vim sysstat bash-completion net-tools"
#################################################################################
# #
# 日志输出 #
# #
#################################################################################
#
info(){
echo -e "\033[35m 【`hostname` `date '+%Y-%m-%d %H:%M:%S'`】\033[0m" "\033[36m$1\033[0m "
}
info1(){
echo -e "\033[36m $1 \033[0m "
}
info2(){
echo -e "\033[34m 【`hostname` `date '+%Y-%m-%d %H:%M:%S'`】\033[0m" "\033[35m$1\033[0m "
}
info3(){
info1 "------------------------------------------------------------------------------"
}
info4(){
echo -e "\033[32m $1 \033[0m "
}
info5(){
info1 "=============================================================================="
}
info6(){
echo -e "\033[33m 【`hostname` `date '+%Y-%m-%d %H:%M:%S'`】\033[0m" "\033[91m$1\033[0m "
}
info7(){
echo -e "\033[35m 【`hostname` `date '+%Y-%m-%d %H:%M:%S'`】\033[0m" "\033[32m$1\033[0m "
}
info8(){
echo -e "\033[31m 【`hostname` `date '+%Y-%m-%d %H:%M:%S'`】\033[0m" "\033[35m$1\033[0m "
}
info9(){
echo -e "\033[32m 【`hostname` `date '+%Y-%m-%d %H:%M:%S'`】\033[0m" "\033[36m$1\033[0m "
}
#################################################################################
# #
# 服务器相关信息查看 #
# #
#################################################################################
#查看CPU相关信息
getCpuStatus(){
echo ""
info5
Physical_CPUs=$(grep "physical id" /proc/cpuinfo| sort | uniq | wc -l)
Virt_CPUs=$(grep "processor" /proc/cpuinfo | wc -l)
CPU_Kernels=$(grep "cores" /proc/cpuinfo|uniq| awk -F ': ' '{print $2}')
CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq)
CPU_Arch=$(uname -m)
load_1=$(uptime |awk -F ":" '{print $NF}'|awk -F "," '{print $1}')
load_5=$(uptime |awk -F ":" '{print $NF}'|awk -F "," '{print $2}')
load_15=$(uptime |awk -F ":" '{print $NF}'|awk -F "," '{print $3}')
#####################################
info4 "CPU的基本信息"
info2 " 物理CPU个数:$Physical_CPUs"
info2 " 逻辑CPU个数:$Virt_CPUs"
info2 " 每CPU核心数:$CPU_Kernels"
info2 " CPU型号:$CPU_Type"
info2 " CPU架构:$CPU_Arch"
info5
info4 "CPU的负载情况"
info2 " 一分钟负载:${load_1}"
info2 " 五分钟负载:${load_5}"
info2 "十五分钟负载:${load_15}"
info5
info4 "CPU进程占用情况"
printf "\e[34m %-5s%-8s %-4s%-7s %-6s %-5s %-s %-3s %-s %-5s %-7s %-5s \e[0m\n" PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
top b -n1 | head -17 | tail -10
}
#查看磁盘相关信息
getDiskStatus(){
echo ""
info5
df -hiP | sed 's/Mounted on/Mounted/'> /tmp/inode
df -hTP | sed 's/Mounted on/Mounted/'> /tmp/disk
#cat /tmp/disk
local name_disk=()
local size_disk=()
local disk_name=$(fdisk -l| grep "Disk /dev"|awk 'BEGIN{FS=":"};{print $1,$NF}'|awk '{print $2}')
local disk_Size=$(fdisk -l| grep "Disk /dev"|awk 'BEGIN{FS=":"};{print $1,$NF}'|awk '{print $3$4}' |awk -F ',' '{print $1}')
for i in ${disk_name};do name_disk[${#name_disk[*]}]=$i;done
for ii in ${disk_Size};do size_disk[${#size_disk[*]}]=$ii;done
local num=$(fdisk -l| grep "Disk /dev"|awk 'BEGIN{FS=":"};{print $1,$NF}'|awk '{print $3$4}' |awk -F ',' '{print $1}'|wc -l)
local num_01=`for((i=0;i<$num;i++)); do echo $i; done`
info4 "磁盘(disk)的基本信息"
printf "\e[34m%-35s %-10s \e[0m\n" Disk_name Size
for i in $num_01
do
printf "\e[31m%-35s %-10s \e[0m\n" ${name_disk[i]} ${size_disk[i]}
done
info5
info4 "磁盘(disk)使用详情"
printf "\e[34m%-32s %-4s %-4s %-4s %-5s %-3s \e[0m\n" Disk_name Size Used Avail Use% Mounted_on
df -h |grep /dev/
#join /tmp/disk /tmp/inode | awk '{print $1,$2,"|",$3,$4,$5,$6,"|",$8,$9,$10,$11,"|",$12}'| column -t
local disk_name_all_1=()
local disk_uuid1=()
local disk_type1=()
local disk_name_all=`blkid|awk -F: '{print $1}'`
local disk_uuid=`blkid|awk '{print $2}'|awk -F '"' '{print $2}'`
local disk_type=`blkid|awk '{print $3}'|awk -F '"' '{print $2}'`
for i in ${disk_name_all};do disk_name_all_1[${#disk_name_all_1[*]}]=$i;done
for i in ${disk_uuid};do disk_uuid1[${#disk_uuid1[*]}]=$i;done
for i in ${disk_type};do disk_type1[${#disk_type1[*]}]=$i;done
local num1=$(blkid|awk '{print $1}' | wc -l)
local num_02=`for((i=0;i<$num1;i++)); do echo $i; done`
info5
info4 "磁盘(disk)设备详情"
printf "\e[34m%-48s %-24s %-20s \e[0m\n" Disk_name UUID Type
for i in $num_02
do
#echo ${disk_name_all_1[i]} ${disk_uuid1[i]} ${disk_type1[i]}
printf "\e[31m%-32s %-40s %-20s \e[0m\n" ${disk_name_all_1[i]} ${disk_uuid1[i]} ${disk_type1[i]}
done
info5
info4 "磁盘(IO)使用详情"
iostat
info3
iostat_log_run
}
#查看内存相关信息
getMemStatus(){
echo ""
info5
info4 "内存检查"
if [[ $centosVersion < 7 ]];then
free -mo
else
free -h
fi
#报表信息
MemTotal=$(grep MemTotal /proc/meminfo| awk '{print $2}') #KB
MemFree=$(grep MemFree /proc/meminfo| awk '{print $2}') #KB
MemAvailable=$(grep -i Cached /proc/meminfo | awk '{print $2}' |head -1) #KB
SwapTotal=$(grep SwapTotal /proc/meminfo| awk '{print $2}')
SwapFree=$(grep SwapFree /proc/meminfo| awk '{print $2}') #KB
let MemUsed=MemTotal-MemFree
MemPercent=$(awk "BEGIN {if($MemTotal==0){printf 100}else{printf \"%.2f\",$MemUsed*100/$MemTotal}}")
report_MemTotal="$((MemTotal/1024))" #内存总容量(MB)
report_MemFree="$((MemFree/1024))" #内存剩余(MB)
report_MemAvai="$((MemAvailable/1024))" #使用中(MB)
#swap
report_swapTotal="$((SwapTotal/1024))""MB" #内存总容量(MB)
report_swapFree="$((SwapFree/1024))""MB" #内存剩余(MB)
let Memfree=MemAvailable+MemFree
let MemUsed=MemTotal-Memfree
report_Mem="$((Memfree/1024))""MB"
report_MemUsedPercent="$(awk "BEGIN {if($MemTotal==0){printf 100}else{printf \"%.2f\",$MemUsed*100/$MemTotal}}")""%" #内存使用率%
info5
info4 " 内存报表信息查询"
info2 " 内存总容量(MB):${report_MemTotal}MB"
info2 "尚未被使用的物理内存数量:${report_MemAvai}MB"
info2 " 内存剩余(MB):${report_MemFree}MB+${report_MemAvai}MB=${report_Mem}"
info2 " 内存使用率:${report_MemUsedPercent}"
info6 " 交换分区内存总容量:${report_swapTotal}"
info6 " 交换分区内存使用容量:${report_swapTotal}"
info5
info4 "内存进程占用查询"
printf "\e[34m%-5s %-5s %-7s %-7s \e[0m\n" PID %MEM RSS COMMAND
echo -e "$(ps aux | awk '{print $2, $4, $6, $11}' | sort -k3rn | head -n 10 )"| column -t
}
#网卡信息
getnetworkstatus(){
echo ""
local ifs=(`ifconfig | egrep "^e|^d|^l" | awk -F: '{print $1}'`)
info5
info4 "网卡及IP"
info "网卡名\t IP地址"
for i in `echo ${ifs[@]}`;do info6 "${i}\t `ifconfig ${i} | awk 'NR==2{print $2}'`" ;done
info3
info4 "网卡基本信息"
local a=`ifconfig | egrep "^e|^d" |awk -F ':' '{print $1}'`
local b=`for i in $a; do echo $(ifconfig ${i} |grep inet6 |awk '{print $2}') ;done`
local ipv4=$(for i in $a;do echo "`ifconfig ${i} | awk 'NR==2{print $2}'`" ;done)
local netmask=$(for i in $a ;do echo `ifconfig $i|grep netmask|awk '{print $4}'` ; done)
local broadcast=$(for i in $a ;do echo `ifconfig $i|grep broadcast|awk '{print $6}'` ; done)
local RX_packets=$(for i in $a ;do echo `ifconfig $i|grep "RX packets"|awk -F '(' '{print $2}'|cut -d ")" -f 1|awk '{print $1}'` ; done)
local TX_packets=$(for i in $a ;do echo `ifconfig $i|grep "TX packets"|awk -F '(' '{print $2}'|cut -d ")" -f 1|awk '{print $1}'` ; done)
local num=`ifconfig | egrep "^e|^d|^l" |awk -F ':' '{print $1}'|wc -l`
local num_01=`for((i=0;i<$num;i++)); do echo $i; done`
#ipv4
for i in $ipv4 ;do network_ipv4[${#network_ipv4[*]}]=$i ;done
#ipv6
for i in $b; do network_ipv6[${#network_ipv6[*]}]=$i ; done
#网卡名
eth_name=(`ifconfig | egrep "^e|^d" | awk -F: '{print $1}'`)
#netmask 子网掩码
for i in $netmask; do network_netmask[${#network_netmask[*]}]=$i ; done
#broadcast 默认网关
for i in $broadcast; do network_broadcast[${#network_broadcast[*]}]=$i ; done
#RX packets 出流量
for i in $RX_packets; do network_RX_packets[${#network_RX_packets[*]}]=$i ; done
#TX packets 进流量
for i in $TX_packets; do network_TX_packets[${#network_TX_packets[*]}]=$i ; done
printf "\e[34m%-2s %-15s %-15s %-12s %-0s %-15s %-23s\e[0m\n" Network IPV4 Netmask Broadcas RX_packets TX_packets IPV6
for i in $num_01
do
echo -e "${eth_name[i]}\t${network_ipv4[i]}\t${network_netmask[i]}\t${network_broadcast[i]}\t${network_RX_packets[i]}\t${network_TX_packets[i]}\t${network_ipv6[i]}\t"
done
}
#服务器信息
getservertatus(){
echo ""
if [ `rpm -qa | grep ^bc | wc -l` -eq 1 ];then
info5
local code1=`dmidecode |grep -i "system information" -A9 |grep -i -E "Man" |awk -F: '{print $2}'`
local code2=`dmidecode |grep -i "system information" -A9 |grep -i -E "pro" |awk -F: '{print $2}'`
local code3=`dmidecode |grep -i "system information" -A9 |grep -i -E "ser" |awk -F: '{print $2}'`
local bios=`dmidecode -t bios|grep -i Version|awk -F: '{print $2}'`
#查看逻辑CPU数量
local cpu1=`cat /proc/cpuinfo |grep "processor" |sort |uniq |wc -l`
local cpu2=`cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l`
#cpu使用率
local cpuid=`top -b -n 1|grep -i cpu|awk '/st$/'|awk '{print $8}'|grep ^[0-9]`
local cpunum=100-${cpuid}
local ad=`echo ${cpunum}|bc`
local free1=`free -m|awk '{print $4}'|grep ^[1-9]|awk 'NR==1'|tr -cd "[0-9]"`
local avai1=`free -m|awk '{print $7}'|grep ^[0-9]|awk 'NR==1'|tr -cd "[0-9]"`
local avai=`free -h|awk '{print $7}'|grep ^[0-9]|awk 'NR==1'`
local disk=`lsblk|grep /$|awk '/\//{print $4}'`
local total=`free -h|awk '{print $2}'|grep ^[1-9]|awk 'NR==1'`
local free=`free -h|awk '{print $4}'|grep ^[1-9]|awk 'NR==1'`
local num=${free1}+${avai1}
local upavil=`uptime | awk '{print $(NF-2),$(NF-1),$NF}'`
info7 " 服务器厂商: ${code1}\033[0m"
info7 " 服务器版本: ${code2}\033[0m"
info7 " 服务器序列号: ${code3}\033[0m"
info7 " bios版本号: ${bios}\033[0m"
info7 " 逻辑CPU数量: ${cpu1}\033[0m"
info7 " CPU数量: ${cpu2}\033[0m"
info7 " CPU使用率: ${ad}\033[0m"
info7 " 根目录总容量: ${disk}\033[0m"
info7 " 内存总容量: ${total}\033[0m"
info7 " 内存使用容量: ${free}+${avai}=$((num))M\033[0m"
info7 " cpu平均负载: ${upavil}\033[0m"
else
info3
info "因脚本需要,需要安装bc命令,请等待!!!"
yum -y install bc >/dev/null
[ $? -eq 0 ] && info6 "bc 安装成功"
getservertatus
fi
}
#查看网卡实时流量
traffic(){
local NIC=$1
echo -e " 进 ------ 出"
while true; do
OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
sleep 1
NEW_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
IN=$(printf "%.1f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s")
OUT=$(printf "%.1f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s")
echo "$IN $OUT"
sleep 1
done
}
#################################################################################
# #
# 常见脚本,下载RPM安装包 #
# #
#################################################################################
#下载rpm的命令
rpm_run(){
local dir="$1"
info "start download ${rpm_name},wait !!!"
yum -y install --downloadonly --downloaddir=${dir} ${rpm_name} &>/dev/null
if [ $? -eq 0 ] ;then
info "${rpm_name}及相关依赖下载完成,安装包的路径是:${dir}"
else
info2 "${rpmdump_name}及相关依赖下载失败,请检查${rpm_name}的yum仓库是否配置"
exit -1
fi
}
#配置yum仓库
rpm_wget_repo(){
if [ -f /etc/yum.repos.d/CentOS-Base.repo ];then
info "阿里云yum仓库已配置"
if [ `rpm -qa | grep epel-release|wc -l` -eq 0 ];then
yum -y install epel-release.noarch >/dev/null
[ $? -eq 0 ]&& info4 "epel-release 安装成功"
fi
else
curl http://mirrors.aliyun.com/repo/Centos-7.repo > /etc/yum.repos.d/CentOS-Base.repo >/dev/null
rpm_wget_repo
fi
}
#rpm下载启动
rpm_download_run(){
info7 "请根据提示选择:"
read -p "请输入RPM包存放路径(/opt/rpm):" rpm_dir
read -p "请输入RPM安装包名称:" rpm_name
local rpm_dir=${rpm_dir:-/opt/rpm}
if [ -z ${rpm_dir} ] || [[ -z ${rpm_name} ]];then
info6 "请重新输入"
rpm_log
rpm_download_run
else
#配置yum仓库
rpm_wget_repo
rpm_run ${rpm_dir} ${rpm_name}
fi
}
#################################################################################
# 数据库服务 #
# mysql服务启动脚本 #
# #
#################################################################################
#
mysql_run(){
local registory=`docker images --format {{.Repository}}:{{.Tag}}|grep ${mysql_images}|wc -l`
###########################docker mysql##################
[ ! -d ${MYSQL_HOME} ] && mkdir -p ${MYSQL_HOME}
info2 "Pull the image MySQL Wait !!!"
if [ ${registory} -ne 1 ];then
docker pull ${mysql_images} &> /dev/null
fi
[ $? -eq 0 ] && info2 "Pull the image MySQL success"
info2 "Start Mysql to the root user"
a=`docker ps -a | grep ${mysql_name}|wc -l`
if [ $a -eq 1 ];then
docker rm -f ${mysql_name} &>/dev/null
docker run -d -p ${mysql_port}:3306 --name ${mysql_name} -v ${MYSQL_HOME}:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=${mysql_passwd} -u root --privileged=true ${mysql_images} &>/dev/null
else
docker run -d -p ${mysql_port}:3306 --name ${mysql_name} -v ${MYSQL_HOME}:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=${mysql_passwd} -u root --privileged=true ${mysql_images} &>/dev/null
fi
[ $? -eq 0 ] && info "Pull the image MySQL success"
info "mysql root password is ${mysql_passwd}"
}
#启动方式
start_mysql(){
read -p "请输入mysql数据持久化存储目录(/opt/mysql):" mysql_home
read -p "请输入mysql容器启动的容器名称(mysql):" mysql_name
read -p "请输入mysql容器启动的镜像版本(mysql:5.7):" mysql_version
read -p "请输入mysql容器启动的初始密码(123456):" mysql_password
read -p "请输入mysql容器启动的初始密码(3306):" mysql_port
MYSQL_HOME="${mysql_home:-/opt/mysql}"
mysql_name="${mysql_name:-mysql}"
mysql_images="${mysql_version:-mysql:5.7}"
mysql_passwd="${mysql_password:-123456}"
mysql_port="${mysql_port:-3306}"
if [ -z ${mysql_home} ] && [ -z ${mysql_name} ] && [ -z ${mysql_version} ]&& [ -z ${mysql_password} ]&& [ -z ${mysql_port} ];then
info8 "请根据提示,输入所有的值"
exit 0
else
info8 "第一次使用,选择启动方式必须是: run"
read -p "选择${mysql_name}的启动方式:(run|restart|start|stop|rm)" mysql_start_run1
case $mysql_start_run1 in
'run')
mysql_run
info "\033[34m 进入数据库后执行以下命令进行用户授权 \033[0m"
info "docker exec -it ${mysql_name} mysql -p${mysql_passwd}"
info "grant all on *.* to admin@\"%\" identified by \"123qqq...A\" ;";;
'restart')
docker restart ${mysql_name} &>/dev/null
[ $? -eq 0 ] && info " ${mysql_name} Restart successful"||log;;
'start')
docker start ${mysql_name} &>/dev/null
[ $? -eq 0 ] && info " ${mysql_name} Start successful"||log;;
'stop')
docker stop ${mysql_name} &>/dev/null
[ $? -eq 0 ] && info " ${mysql_name} Stop successful"||log;;
'rm')
docker rm -f ${mysql_name} &>/dev/null
[ $? -eq 0 ] && info " ${mysql_name} delete successful"||log;;
'*')
info "脚本执行错误,请检查后继续";;
esac
fi
}
redis_run(){
local registory=`docker images --format {{.Repository}}:{{.Tag}}|grep ${redis_images}|wc -l`
###########################docker mysql##################
[ ! -d ${redis_HOME} ] && mkdir -p ${redis_HOME}/data
cd ${redis_HOME}
info2 "加载配置文件"
cat > redis.conf <<EOF
bind 0.0.0.0
port 6379
protected-mode no
daemonize no
databases 16
masterauth 123456
dir ./
appendonly yes
EOF
sed -i "s/123456/${redis_password}/g" redis.conf
info2 "Pull the image ${redis_images} Wait !!!"
if [ ${registory} -ne 1 ];then
docker pull ${redis_images} &> /dev/null
fi
[ $? -eq 0 ] && info2 "Pull the image ${redis_images} success"
info2 "Start ${redis_name} to the root user"
a=`docker ps -a | grep ${redis_name}|wc -l`
if [ $a -eq 1 ];then
docker rm -f ${redis_name} &>/dev/null
docker run -p ${redis_port}:6379 --name ${redis_name} -v ${redis_HOME}/redis.conf:/etc/redis/redis.conf \
-v ${redis_HOME}/data:/data -d redis redis-server \
/etc/redis/redis.conf --appendonly yes &>/dev/null
else
docker run -p ${redis_port}:6379 --name ${redis_name} -v ${redis_HOME}/redis.conf:/etc/redis/redis.conf \
-v ${redis_HOME}/data:/data -d redis redis-server \
/etc/redis/redis.conf --appendonly yes &>/dev/null
fi
[ $? -eq 0 ] && info "start the image ${redis_name} success"
}
start_redis(){
read -p "请输入redis数据持久化存储目录(/opt/redis):" redis_home
read -p "请输入redis容器启动的容器名称(redis):" redis_name
read -p "请输入redis容器启动的镜像版本(redis:4.0.9):" redis_version
read -p "请输入redis容器启动的初始密码(123456):" redis_password
read -p "请输入redis容器启动的初始密码(6379):" redis_port
redis_HOME="${redis_home:-/opt/redis}"
redis_name="${redis_name:-redis}"
redis_images="${redis_version:-redis:4.0.9}"
redis_password="${redis_password:-123456}"
redis_port="${redis_port:-6379}"
if [ -z ${redis_home} ] && [ -z ${redis_name} ] && [ -z ${redis_version} ]&& [ -z ${redis_password} ]&& [ -z ${redis_port} ];then
info8 "请根据提示,输入所有的值"
exit 0
else
info8 "第一次使用,选择启动方式必须是: run"
read -p "选择${redis_name}的启动方式:(run|restart|start|stop|rm):" redis_start_run1
if [ -z ${redis_start_run1} ];then
info6 "请重新输入"
info5
Service_database
else
case $redis_start_run1 in
'run')
redis_run;;
'restart')
docker restart ${redis_name} &>/dev/null
[ $? -eq 0 ] && info " ${redis_name} Restart successful";;
'start')
docker start ${redis_name} &>/dev/null
[ $? -eq 0 ] && info " ${redis_name} Start successful";;
'stop')
docker stop ${redis_name} &>/dev/null
[ $? -eq 0 ] && info " ${redis_name} Stop successful";;
'rm')
docker rm -f ${redis_name} &>/dev/null
[ $? -eq 0 ] && info " ${redis_name} delete successful";;
'*')
info "脚本执行错误,请检查后继续";;
esac
fi
fi
}
#################################################################################
# #
# 中间件服务启动脚本 #
# #
#################################################################################
zk_server(){
local registory=`docker images --format {{.Repository}}:{{.Tag}}|grep ${zookeeper_version}|wc -l`
if [ ${registory} -eq 0 ];then
docker pull ${node_exporter_images} &>/dev/null
else
bashpath="$(cd `dirname $0`;pwd)"
[ ! -d ${zookeeper_home} ] && mkdir -p ${zookeeper_home}
[ $? -eq 0 ] && info "mkdir ${zookeeper_home} success"
if [ `docker ps -a | grep ${zookeeper_name}|wc -l` -eq 1 ];then
docker rm -f ${zookeeper_name}
docker run -d -p ${zk_port}:2181 -v ${zookeeper_home}:/data/ \
--name zookeeper --privileged ${zookeeper_version} &>/dev/null
[ $? -eq 0 ] && info "${zookeeper_name} start success"
else
docker run -d -p ${zk_port}:2181 -v ${zookeeper_home}:/data/ \
--name zookeeper --privileged ${zookeeper_version} &>/dev/null
[ $? -eq 0 ] && info "${zookeeper_name} start success"
fi
fi
}
start_zk(){
echo ""
info5
read -p "请输入zookeeper数据持久化存储目录(/opt/zookeeper):" zookeeper_home
read -p "请输入zookeeper容器启动的容器名称(zookeeper):" zookeeper_name
read -p "请输入zookeeper容器启动的容器端口(2181):" zk_port
read -p "请输入zookeeper容器启动的镜像版本(zookeeper:3.4.9):" zookeeper_version
zookeeper_version=${zookeeper_version:-zookeeper:3.4.9}
zookeeper_name=${zookeeper_name:-zookeeper}
zk_port=${zk_port:-2181}
zookeeper_home=${zookeeper_home:-/opt/zookeeper}
if [ -z ${zookeeper_version} ] && [ -z ${zookeeper_name} ] && [ -z ${zk_port} ]&& [ -z ${zookeeper_home} ];then
info8 "请根据提示,输入所有的值"
exit 0
else
info8 "第一次使用,选择启动方式必须是: run"
read -p "选择${zookeeper_name}的启动方式:(run|restart|start|stop|rm):" zk_start_run1
if [ -z ${zk_start_run1} ];then
info6 "请重新输入"
info5
middleware_server_run
else
case $zk_start_run1 in
'run')
zk_server;;
'restart')
docker restart ${zookeeper_name} &>/dev/null
[ $? -eq 0 ] && info " ${zookeeper_name} Restart successful";;
'start')
docker start ${zookeeper_name} &>/dev/null
[ $? -eq 0 ] && info " ${zookeeper_name} Start successful";;
'stop')
docker stop ${zookeeper_name} &>/dev/null
[ $? -eq 0 ] && info " ${zookeeper_name} Stop successful";;
'rm')
docker rm -f ${zookeeper_name} &>/dev/null
[ $? -eq 0 ] && info " ${zookeeper_name} delete successful";;
'*')
info "脚本执行错误,请检查后继续";;
esac
fi
fi
}
#################################################################################
# #
# harbor服务启动脚本 #
# #
#################################################################################
start_harbor(){
echo ""
info5
source ${bashpath}/script/base_harbor.sh
read -p " 离线安装包名称,默认(harbor-offline-installer-v2.0.1.tgz):" harbor_images
read -p " 离线安装包存放路径,默认(/opt):" harbor_path
read -p "离线安装包解压后名称,默认(harbor):" harbor_name_path
read -p "离线安装包的镜像名称,默认(harbor.v2.0.1.tar.gz)" harbor_images_name
read -p " Harbor访问的域名,默认(registry.harbor.com):" harbor_hostname
read -p "Harbor访问平台的密码,默认(Harbor12345):" harbor_password
read -p "Harbor访问平台的端口,默认(8081):" harbor_http_port
read -p " Harbor数据持久化,挂载卷(\/opt\/harbor\/data):" harbor_volume
local harbor_images=${harbor_images:-harbor-offline-installer-v2.0.1.tgz}
local harbor_path=${harbor_path:-/opt}
local harbor_hostname=${harbor_hostname:-registry.harbor.com}
local harbor_password=${harbor_password:-Harbor12345}
local harbor_http_port=${harbor_http_port:-8081}
local harbor_name_path="${harbor_name_path:-harbor}"
local harbor_images_name=${harbor_images_name:-harbor.v2.0.1.tar.gz}
local harbor_volume=${harbor_volume:-\/opt\/harbor\/data}
#在线下载路径
harbor_compose_path="/opt/harbor"
docker_compose_name="docker-compose"
harbor_conn="https://github.com/goharbor/harbor/releases/download/v2.3.1/harbor-offline-installer-v2.3.1.tgz"
harbor_conn_name="harbor-offline-installer-v2.3.1.tgz"
docker_compose_conn="https://github.com/docker/compose/releases/download/1.25.1/docker-compose-$(uname -s)-$(uname -m)"
if [[ $1 == "install" ]];then
if [ -d ${harbor_path}/${harbor_name_path} ];then
if [ -f ${harbor_path}/${harbor_name_path}/${docker_compose_name} ];then
harbor_install
else
harbor_install_zaixian
fi
else
if [ -d ${harbor_path}/${harbor_name_path} ];then
info "Harbor installation directory already exists"
else
mkdir -p ${harbor_path}/${harbor_name_path}
log
exit 0
fi
fi
else
Usage
exit -1
fi
}
#################################################################################
# #
# 常用脚本使用 #
# 服务器系统配置初始化脚本 #
#################################################################################
#常用脚本使用 #
# #
#服务器系统配置初始化脚本 #
#################################################################################
run_set_system(){
echo ""
info5
# 设置时区并同步时间
read -p "设置ssh超时时间(600):" time
read -p "是否禁止root用户远程登录(yes),默认允许:" ban
read -p "是否安装基础安装包(vim,wget...),默认允许安装(yes):" install
read -p "是否检查基础设置是否成功(yes/no),默认自动检查:" check_system
read -p "设置主机名称(myos):" hostname_name
info "重新加载yum仓库,请等待!!!"
yum makecache >/dev/null
local repolost_num=`yum repolist|grep repolist|awk -F: '{print $2}'|cut -c2`
local check_system=${check_system:-yes}
local tmout_time=${time:-600}
local ban_root=${ban:-no}
local install_run=${install:-yes}
local hostname_name=${hostname_name:-myos}
#判断
if [ $repolost_num -eq 0 ];then
read -p "检测到没有yum仓库,是否添加阿里云yum仓库(yes/no),默认添加:" aliyun_yum_1
aliyun_yum_2=${aliyun_yum_1:-yes}
if [ ${aliyun_yum_2} == "yes" ] ;then
aliyun_yum
fi
fi
#设置主机名
info6 "设置主机名${hostname_name}"
hostnamectl set-hostname ${hostname_name}
info6 "设置时区,并同步时间"
time=`timedatectl |grep "Time zone"|awk '{print $3}'`
if [ ${time} == "Asia/Shanghai" ];then
info7 "当前时区:${time}"
else
info7 "当前时区:${time}"
info "Set time zone to Shanghai"
timedatectl set-timezone Asia/Shanghai
info `timedatectl |grep "Time zone"|awk '{print $3}'`
fi
#ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#if [ `crontab -l |grep ntpdate|wc -l` -eq 0 ]; then
# echo "* 1 * * * ntpdate ntp1.aliyun.com >/dev/null 2>&1"
#fi
# 禁用selinux
info6 "设置selinux策略模式"
selinux=`sestatus |grep "SELinux status" |awk '{print $3}'`
if [ ${selinux} == disabled ];then
echo -e "\033[32m selinux禁用成功 \033[0m"
else
info6 "Disable SELinux"
setenforce 0
# sed -i 's/^SELINUX=.\*/SELINUX=disabled/' /etc/selinux/config
sed -i '/^SELINUX/s/enforcing/disabled/' /etc/selinux/config
[ $? -eq 0 ] && info9 "设置selinux策略的状态disabled成功,重启生效"
fi
# 关闭防火墙
info6 "开始关闭防火墙"
if egrep "7.[0-9]" /etc/redhat-release &>/dev/null; then
systemctl stop firewalld >/dev/null
systemctl disable firewalld >/dev/null
elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null; then
service iptables stop >/dev/null
chkconfig iptables off >/dev/null
fi
[ $? -eq 0 ] && info9 "firewalld 关闭成功"
# 历史命令显示操作时间
info6 "修改history历史命令的输出格式"
if ! grep HISTTIMEFORMAT /etc/bashrc; then
echo 'export HISTTIMEFORMAT="%F %T `whoami` "' >> /etc/bashrc >/dev/null
fi
[ $? -eq 0 ] && info9 "history历史命令的输出格式已设置"
# SSH超时时间
info6 "设置ssh超时时间"
if ! grep "TMOUT=${tmout_time}" /etc/profile &>/dev/null; then
echo "export TMOUT=${tmout_time}" >> /etc/profile
fi
[ $? -eq 0 ] && info9 "超时时间设置:TMOUT=${tmout_time}"
# 禁止root远程登录
if [ ${ban_root} == "yes" ];then
info6 "禁止root远程登录"
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
[ $? -eq 0 ] && info9 "禁止root远程登录,设置成功"
fi
# 禁止定时任务向发送邮件
info6 "设置禁止定时任务向发送邮件"
sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab
[ $? -eq 0 ] && info9 "禁止定时任务向发送邮件设置成功"
# 设置最大打开文件数
info6 "设置最大打开文件数"
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
EOF
ulimit -n 65535
ulimit -SHn 65535
fi
[ $? -eq 0 ] && info9 "设置最大打开文件数"
# 禁用SWAP使用
Free=`free -h|grep -i swap|awk '{print $2}'|cut -c 1`
if [ ${Free} -eq 0 ];then
info7 "Swap禁用成功"
else
info7 "Swap未禁用"
info "Disable swap"
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
info "Disable swap success"
fi
swapoff -a
echo "0" > /proc/sys/vm/swappiness
# 安装系统性能分析工具及其他
if [ ${install_run} == "yes" ];then
info6 "安装系统性能分析工具及其他,请等待!!!"
yum -y install ${rpm_name} >/dev/null
[ $? -eq 0 ] && info9 "安装系统基础工具:\n ${rpm_name} install success"
fi
# 系统内核优化
local system_num=`egrep "tcp_syncookies|tcp_max_tw_buckets|max_syn_backlog|netdev_max_backlog|tcp_fin_timeout" /etc/sysctl.conf |wc -l `
if [ ${system_num} -eq 0 ];then
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF
fi
if [ ${check_system} == "yes" ];then
check_system_run
fi
}
####################################################
#清理登录系统的信息
Clean_up_system_login(){
echo ""
info5
read -p "是否检查历史命令信息,默认显示最后10行(yes/no):" history_name
read -p "是否检查登录系统的用户名单,默认允许(yes/no):" last_name
read -p "是否检查登入系统失败的用户相关信息,默认允许(yes/no):" lastb_name
read -p "是否确认全部清理系统登录信息(yes/no),默认禁止:" name
info3
local name=${name:-no}
local lastb_name=${lastb_name:-yes}
local last_name=${last_name:-yes}
local history_name=${history_name:-yes}
if [ ${history_name} == yes ];then
info "显示最后10行历史命令"
cat /$USER/.bash_history |tail -10
fi
if [ ${lastb_name} == yes ];then
info "登录系统的用户名单"
last |head -10
fi
if [ ${history_name} == yes ];then
info "显示最后10行历史命令"
cat /$USER/.bash_history |tail -10
fi
if [ ${lastb_name} == yes ];then
info6 "登入系统失败的用户相关信息"
lastb |head -10
fi
if [ ${name} == yes ];then
echo > /var/log/wtmp
echo > /var/log/btmp
echo > /$USER/.bash_history
[ $? -eq 0 ] && info "系统登录信息清理成功"
fi
}
#统计当前系统中可以登录计算机的账户有多少个
Count_the_number(){
echo ""
info5
count_num=`grep "bash$" /etc/passwd | wc -l`
info "当前系统中可以登录计算机的账户: ${count_num}"
}
Count_number_documents(){
echo ""
info5
# 统计/var/log 有多少个文件,并显示这些文件名
# 使用 ls 递归显示所有,再判断是否为文件,如果是文件则计数器加 1
cd /var/log
sum=0
info4 "/var/log的文件名"
info3
for i in `ls -r *`
do
if [ -f $i ];then
let sum++
info2 "文件名:$i"
fi
done
info3
info "总文件数量为:$sum"
}
################################################################################
# #
# 进度条 #
# #
################################################################################
processBar(){
now=$1
all=$2
arr=('|' '/' '-' '\\')
percent=`awk BEGIN'{printf "%f", ('$now'/'$all')}'`
len=`awk BEGIN'{printf "%d", (100*'$percent')}'`
bar='>'
for((i=0;i<len-1;i++))
do
bar="#"$bar
done
#printf "[%-10s][%03d/%03d]\r" $bar $len 100
for((i=0;i<=${now};i++))
do
let index=i%4
printf "[%-10s][%03d/%03d]\r[%c]" $bar $len 100 ${arr[$index]}
done
}
run_process(){
whole=$1
process=$2
while [ $process -lt $whole ]
do
let process++
processBar $process $whole
sleep 0.1
done
printf "\n"
}
################################################################################
# #
# yum源 #
# #
################################################################################
install_chronyd_server(){
echo ""
info5
local chronyd_rpm=`rpm -qa | grep chrony|wc -l`
read -p "允许客户端登连接服务端的网段,默认(192.168.1.0/24)" ntp_ipaddr
local ntp_ipaddr=${ntp_ipaddr:-192.168.1.0/24}
if [ ${chronyd_rpm} -eq 1 ];then
info2 "`rpm -qa | grep chrony` 已安装"
info5
if [ -f /etc/chrony.conf ];then
#修改配置文件
sed -i '/^server/ s/^\(.*\)$/#\1/g' /etc/chrony.conf
sed -i '/^# Please/ a server ntp2.aliyun.com iburst' /etc/chrony.conf
#allow 192.168.0.0/16
sed -i "25 a allow $ntp_ipaddr" /etc/chrony.conf
systemctl restart chronyd.service
systemctl enable chronyd.service
info3
info2 "验证时间同步是否成功"
chronyc sources -v
else
info6 "/etc/chrony.conf 不存在,请检查后重试"
exit 0
fi
else
yum -y install chrony >/dev/null
if [ $? -eq 0 ];then
if [ -f /etc/chrony.conf ];then
#修改配置文件
sed -i '/^server/ s/^\(.*\)$/#\1/g' /etc/chrony.conf
sed -i '/^# Please/ a server ntp2.aliyun.com iburst' /etc/chrony.conf
#allow 192.168.0.0/16
sed -i "25 a allow $ntp_ipaddr" /etc/chrony.conf
systemctl restart chronyd.service
systemctl enable chronyd.service
info3
info2 "验证时间同步是否成功"
chronyc sources -v
else
info6 "/etc/chrony.conf 不存在,请检查后重试"
exit 0
fi
else
read -p "是否加载阿里云yum(yes/no):" aliyun_yum_3
local aliyun_yum_3=${aliyun_yum_3:-yes}
if [ $aliyun_yum_3 == "yes" ];then
aliyun_yum
else
info6 "未加载yum源,检查口进行确定"
exit 0
fi
fi
fi
}
install_chronyd_client(){
echo ""
info5
local chronyd_rpm=`rpm -qa | grep chrony|wc -l`
read -p "客户端登连接服务端的地址,默认(192.168.1.100)" ntp_ipaddr
local ntp_ipaddr=${ntp_ipaddr:-192.168.1.100}
if [ ${chronyd_rpm} -eq 1 ];then
info2 "`rpm -qa | grep chrony` 已安装"
info5
if [ -f /etc/chrony.conf ];then
#修改配置文件
sed -i '/^server/ s/^\(.*\)$/#\1/g' /etc/chrony.conf
sed -i "/^# Please/ a server $ntp_ipaddr iburst" /etc/chrony.conf
systemctl restart chronyd.service
systemctl enable chronyd.service
info3
info2 "验证时间同步是否成功"
chronyc sources -v
else
info6 "/etc/chrony.conf 不存在,请检查后重试"
exit 0
fi
else
yum -y install chrony >/dev/null
if [ $? -eq 0 ];then
if [ -f /etc/chrony.conf ];then
#修改配置文件
sed -i '/^server/ s/^\(.*\)$/#\1/g' /etc/chrony.conf
sed -i "/^# Please/ a server $ntp_ipaddr iburst" /etc/chrony.conf
systemctl restart chronyd.service
systemctl enable chronyd.service
info3
info2 "验证时间同步是否成功"
chronyc sources -v
else
info6 "/etc/chrony.conf 不存在,请检查后重试"
exit 0
fi
else
read -p "是否加载阿里云yum(yes/no):" aliyun_yum_3
local aliyun_yum_3=${aliyun_yum_3:-yes}
if [ $aliyun_yum_3 == "yes" ];then
aliyun_yum
else
info6 "未加载yum源,检查口进行确定"
exit 0
fi
fi
fi
}
#################################################################################
# #
# docker基础环境部署 #
# #
#################################################################################
#
install_docker(){
#官方网站下载最新版docker
info "官方网站下载最新版docker"
yum install -y vim yum-utils bash-completion net-tools gcc ipvsadm wget ipset bc &>/dev/null
if [ $? -eq 0 ];then
info "安装docker的相关依赖包"
else
info8 "install docker CE fail"
fi
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo &>/dev/null
if [ $? -eq 0 ];then
info "添加docker的在线yum仓库"
else
info8 "install docker CE fail"
fi
info6 "重新加载yum仓库,根据网速决定等待的时间,请耐心等待!!!"
yum makecache &>/dev/null
info "yum仓库加载成功"
info3
info4 "开始安装docker基础环境,亲耐心等待"
yum -y install docker-ce &> /dev/null
[ $? -eq 0 ] && info2 "docker 环境安装成功"
#开启路由转发
cat >>/etc/sysctl.conf<<EOF
net.ipv4.ip_forward = 1
EOF
sysctl -p &>/dev/null
#添加阿里云镜像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://geuj9lut.mirror.aliyuncs.com"]
}
EOF
}
#启动docker
start_docker(){
if [ `rpm -qa|grep docker |wc -l` -eq 0 ];then
install_docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker >/dev/null
else
a=`rpm -qa|grep docker-ce|tail -1`
info8 "\033[32m ${a}已安装,不需要重新部署\033[0m"
local docker_status=`systemctl status docker |grep Active|awk '{print $2}'`
if [ ! ${docker_status} == "active" ];then
systemctl start docker
info8 "\033[32m docker服务已重新正常启动\033[0m"
else
info8 "\033[32m docker服务已正常启动!!!\033[0m"
run
fi
fi
}
#################################################################################
# #
# 环境检查 #
# #
#################################################################################
#网络状态检查函数
network_check(){
echo ""
info2 "正在检测网络,请稍等..."
ping -c 2 www.baidu.com >/dev/null
if [ $? -eq 0 ];then
info7 "网络连接正常,请继续!!!"
info3
else
info6 "网络连接失败,请检查网络后重新执行"
network_check_run="1"
exit -1
fi
}
#docker环境检查
docker_check(){
echo ""
info7 "正在检测docker基础环境,请稍等..."
local docker_version=`docker --version|awk -F ',' '{print $1}'|awk '{print $3}'`
local docker_status=`systemctl status docker |grep Active|awk '{print $2}'`
local docker_driver=`docker info | grep -i "Cgroup Driver"|awk '{print $3}'`
local docker_home=`docker info|grep -i "docker root dir"|awk '{print $4}'`
if [ ${docker_status} == "active" ];then
info2 "docker 版本: ${docker_version}"
info2 "docker 状态: ${docker_status}"
info2 "docker 文件系统: ${docker_driver}"
info2 "docker 家目录: ${docker_home}"
info7 "docker基础环境正常运行,请继续!!!"
echo "-------------------------------------------------------------------"
else
info6 "docker未启动或者当前机器未安装docker,请选择\"docker基础环境\"先安装环境后再启动服务"
server_run
fi
}
#基础环境检查
check_system_run(){
#定义变量
local sorf=`ulimit -n`
local hard=`ulimit -Hn`
local selinux=`sestatus |grep "SELinux status" |awk '{print $3}'`
local time=`timedatectl |grep "Time zone"|awk '{print $3}'`
local selinux=`sestatus |grep "SELinux status" |awk '{print $3}'`
local firewalld=`systemctl status firewalld|awk '/Active/{print $2}'`
local tmount=`grep TMOUT /etc/profile | awk '{print $2}'`
local Free=`free -h|grep -i swap|awk '{print $2}'|cut -c 1`
local rpm=`rpm -qa | egrep "wget|net-tools|vim|sysstat|bash-completion|net-tools" `
local num=`rpm -qa | egrep "wget|net-tools|vim|sysstat|bash-completion|net-tools" |wc -l `
local num_01=`for((i=0;i<$num;i++)); do echo $i; done`
echo ""
info5
info8 "时区检查"
if [ ${time} == "Asia/Shanghai" ];then
info7 "当前时区:${time}"
info3
info4 "时间同步服务"
chronyc sources -V
info3
else
info7 "当前时区:${time}"
info3
info4 "时间同步服务"
chronyc sources -V
info3
fi
info3
info8 "selinux策略模式"
if [ ${selinux} == disabled ];then
info7 "selinux禁用成功,${selinux}"
else
info7 "selinux尚未禁用,${selinux}"
fi
info3
info8 "firewalld防火墙"
if [ $firewalld == "inactive" ];then
info7 "firewalld禁用成功 \033[0m"
else
info7 "firewalld尚未禁用 \033[0m"
fi
if [ ! -z $tmount ];then
info3
info8 "ssh超时时间"
info7 "${tmount}"
fi
local ssh_port=`ss -ntulp | grep sshd|awk 'NR==1{print $5}' |awk -F: '{print $2}'`
if [ ! -z $ssh_port ];then
info3
info8 "ssh端口"
info7 "${ssh_port}"
fi
info3
info8 "文件描述符"
info7 "最大警告值:soft ${sorf}"
info7 " 阈值:hard ${hard}"
info3
info8 "交换分区"
if [ ${Free} -eq 0 ];then
info7 "Swap禁用成功"
else
info7 "Swap未禁用"
info7 "交换分区总total: `free -h|grep -i swap|awk '{print $2}'`"
fi
info3
info8 "基础工具"
for i in $rpm ;do rpm_check[${#rpm_check[*]}]=$i ;done
info4 "查看${rpm_name}\n 是否安装:"
for i in $num_01
do
info6 "${rpm_check[i]}"
done
info3
info8 "系统内核优化"
cat /etc/sysctl.conf |grep -v "^#" |grep $#
info5
}
check_k8s_docker_run(){
info3
docker_check
if [ $? -eq 0 ];then
if [ `rpm -qa | grep kubelet|wc -l` -eq 1 ];then
info1 "check k8s status"
info2 "k8s version list"
kubectl version
echo ""
info2 "All Healthy status check"
kubectl get componentstatus
echo ""
info2 "k8s cluster info list"
kubectl cluster-info
echo ""
info2 "k8s all nodes list"
kubectl get nodes
info2 "k8s all-namespaces's pods list"
kubectl get pod --all-namespaces
echo ""
info2 "k8s all-namespaces's service network"
kubectl get svc --all-namespaces
echo ""
info4 "===================================k8s welcome for you==================================="
else
info6 "当前机器未安装k8s.请安装后重试"
exit 0
fi
else
info6 "请检查docker环境是否安装"
server_run
fi
}
#检查harbor的状态
start_harbor_check(){
echo ""
info5
local compose_pant_name=`find /usr/local/ -name docker-compose |wc -l`
if [ ${compose_pant_name} -eq 1 ];then
read -p "请输入harbor的安装目录,默认(/opt/harbor/harbor):" harbor_path
local harbor_path=${harbor_path:-/opt/harbor/harbor}
read -p "请选择重启(restart),启动(start),停止(stop),默认(check):" harbor_check
local harbor_check=${harbor_check:-check}
info3
cd ${harbor_path}
case $harbor_check in
'check')
docker-compose ps
if [ `docker-compose ps|grep -i exit|wc -l` -ne 0 ];then
info8 "重新harbor服务,请稍等"
docker-compose down -v
docker-compose up -d
fi;;
'restart')
docker-compose down -v
[ $? -eq 0 ] && check " ${harbor_name_path} Restart successful";;
'start')
docker-compose up -d
[ $? -eq 0 ] && check " ${harbor_name_path} Start successful";;
'stop')
docker-compose down -v
[ $? -eq 0 ] && check " ${harbor_name_path} Stop successful";;
'*')
info "\033[91m sh $0 start|stop|restart \033[0m"
info "脚本执行错误,请检查后继续";;
esac
else
info8 "Harbor在【`hostname`】主机中未安装"
fi
}
################################################################################
# #
# 启动函数 #
# #
################################################################################
#启动函数
#1、系统资源查看
system_run(){
System_resources
if [ -z ${system} ];then
info6 "请重新输入"
info5
run
else
case ${system} in
'1')
getCpuStatus;;
'2')
getDiskStatus;;
'3')
getMemStatus;;
'4')
getnetworkstatus;;
'5')
getservertatus;;
'6')
getCpuStatus
getMemStatus
getDiskStatus
getnetworkstatus
getservertatus
;;
'q')
echo ""
exit 0;;
esac
fi
}
#2.网卡实时流量
traffic_run(){
echo ""
local traffic_name=$(ifconfig |grep mtu|awk -F ':' '{print $1}')
info5
info "当前主机上的网卡名称"
ifs=(`ifconfig | egrep "^e|^d|^l" | awk -F: '{print $1}'`)
printf "\e[36m %-10s %-8s \e[0m\n" 网卡名 IP地址
for i in `echo ${ifs[@]}`;do echo -e "${i}\t `ifconfig ${i} | awk 'NR==2{print $2}'`" ;done
#for i in $traffic_name; do echo $i; done
info3
echo "q【退出】 Enter【主页面】"
read -p "输入的网卡名称:" network
if [ -z ${network} ];then
info6 "请输出网卡名称,当前未输入"
info6 "请重新输入"
info5
run
else
if [ ${network} == "q" ];then
exit 0
else
traffic ${network}
fi
fi
}
#监控服务(prometheus、zabbix)及其组件
monitor_server_run(){
docker_check
Service_Prometheus
if [ -z ${monitoring} ];then
info6 "请重新输入"
info5
server_run
else
case ${monitoring} in
'1')
#Prometheus
echo ""
sh ${bashpath}/monitor/start_prometheus.sh;;
'2')
#grafana
echo ""
sh ${bashpath}/monitor/start_grafana.sh;;
'3')
#cadvisor
echo ""
sh ${bashpath}/monitor/start_cadvisor.sh;;
'4')
#node_export
echo ""
sh ${bashpath}/monitor/start_node_export.sh;;
'5')
#pushgateway
echo ""
sh ${bashpath}/monitor/start_pushgateway.sh;;
'h')
#help
echo ""
monitoring_help;;
'q')
echo ""
exit 0;;
esac
fi
}
#数据库服务
database_server_run(){
echo ""
docker_check
Service_database
if [ -z ${database} ];then
info6 "请重新输入"
info5
server_run
else
case ${database} in
'1')
#Mysql
start_mysql;;
'2')
Service_database_redis
if [ -z ${database_redis} ];then
info6 "请重新输入"
info5
server_run
else
case ${database_redis} in
'1')
echo ""
start_redis ;;
'2')
echo ""
info8 "未完成"
info3
database_server_run;;
'h')
echo ""
info6 "未完成";;
'q')
echo ""
exit 0;;
esac
fi;;
'h')
database_help
database_server_run;;
'q')
echo ""
exit 0;;
esac
fi
}
#harbor服务
harbor_server_run(){
#Harbor
echo ""
docker_check
Harbor_SERVICE
if [ -z ${harbor_Service} ];then
info6 "请重新输入"
info5
server_run
else
case ${harbor_Service} in
'1')
#Mysql
start_harbor install;;
'2')
start_harbor_check;;
'3')
info6 "尚未完成"
start_harbor_check;;
'h')
harbor_help;;
'q')
echo ""
exit 0;;
esac
fi
}
#3、常见服务部署
server_run(){
network_check
Service_deployment
if [ -z ${Service} ];then
info6 "请重新输入"
info5
run
else
case ${Service} in
'1')
#docker基础环境
echo ""
start_docker;;
'2')
#监控服务(prometheus、zabbix)及其组件
monitor_server_run;;
'3')
#数据库服务
database_server_run ;;
'4')
#harbor服务
harbor_server_run;;
'q')
echo ""
exit 0;;
esac
fi
}
#4.常用脚本使用
used_script_run(){
network_check
Commonly_used_script
if [ -z ${script} ];then
info6 "请重新输入"
info5
run
else
case ${script} in
'1')
#docker基础环境
echo ""
rpm_download_run;;
'2')
#
sh ${bashpath}/script/harbor_ssl.sh;;
'3')
#echo ""
run_set_system;;
'4')
Clean_up_system_login;;
'5')
Count_the_number;;
'6')
Count_number_documents;;
'h')
script_help;;
'q')
echo ""
exit 0;;
esac
fi
}
#6.基础环境检查
env_config_peizhi(){
network_check
env_config
if [ -z ${env_script} ];then
info6 "请重新输入"
info5
run
else
case ${env_script} in
'1')
#docker基础环境
echo ""
run_set_system;;
'2')
install_chronyd_server;;
'3')
install_chronyd_client;;
'4')
check_system_run;;
'5')
check_k8s_docker_run;;
'6')
start_harbor_check;;
'h')
env_help
info5
env_config_peizhi;;
'q')
echo ""
exit 0;;
esac
fi
}
#7.中间件服务
middleware_server_run(){
docker_check
middleware_server
if [ -z ${middleware} ];then
info6 "请重新输入"
info5
middleware_server_run
else
case ${middleware} in
'1')
#start_zk
start_zk;;
'h')
#help
echo ""
monitoring_help;;
'q')
echo ""
exit 0;;
esac
fi
}
#构建基础镜像
basi_build_run(){
docker_check
basi_build
if [ -z ${basi_build_num} ];then
info6 "请重新输入"
info5
basi_build_run
else
case ${basi_build_num} in
'1')
echo ""
sh ${bashpath}/script/build_kafka.sh ;;
'h')
#help
echo ""
basi_build_help;;
'q')
echo ""
exit 0;;
esac
fi
}
################################################################################
# #
# yum源 #
# #
################################################################################
#yum源
aliyun_yum(){
echo ""
info "官方网站下载最新版(CentOS7)"
ls /etc/yum.repos.d/*.repo
if [ $? -eq 0 ];then
[ -d /etc/yum.repos.d/bak ] || mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
fi
if [ `rpm -qa|grep ^wget|wc -l` -eq 1 ];then
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null
else
curl http://mirrors.aliyun.com/repo/Centos-7.repo -o /etc/yum.repos.d/CentOS-Base.repo
fi
yum makecache >/dev/null
[ $? -eq 0 ] && info "Aliyun yum 源加载成功"
}
tenxun_yum(){
echo ""
info "官方网站下载最新版(CentOS7)"
ls /etc/yum.repos.d/*.repo
if [ $? -eq 0 ];then
[ -d /etc/yum.repos.d/bak ] || mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
fi
if [ `rpm -qa|grep ^wget|wc -l` -eq 1 ];then
#base源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo &>/dev/null
#epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo >/dev/null
#参考文档 http://docs.kubernetes.org.cn/457.html,官方网址国内 无法访问,使用腾讯云
else
curl http://mirrors.cloud.tencent.com/repo/centos7_base.repo -o /etc/yum.repos.d/CentOS-Base.repo
curl http://mirrors.cloud.tencent.com/repo/epel-7.repo -o /etc/yum.repos.d/epel.repo
fi
yum makecache >/dev/null
[ $? -eq 0 ] && info "腾讯 yum 源加载成功"
}
wangyiyun(){
echo ""
info "官方网站下载最新版(CentOS7)"
ls /etc/yum.repos.d/*.repo
if [ $? -eq 0 ];then
[ -d /etc/yum.repos.d/bak ] || mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
fi
if [ `rpm -qa|grep ^wget|wc -l` -eq 1 ];then
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS6-Base-163.repo &>/dev/null
else
curl http://mirrors.163.com/.help/CentOS6-Base-163.repo -o /etc/yum.repos.d/CentOS-Base.repo
fi
yum makecache >/dev/null
[ $? -eq 0 ] && info "网易 yum 源加载成功"
}
################################################################################
#5、Yum仓库安装
Service_yum_run(){
Service_yum_repoistory1
if [ -z ${yum_repoistory1} ];then
info6 "请重新输入"
info5
run
else
case ${yum_repoistory1} in
'1')
yum repolist
#run_process 10 1
;;
'2')
yum makecache;;
'3')
network_check
Service_yum_repoistory
if [ -z ${yum_repoistory} ];then
info6 "请重新输入"
info5
Service_yum_run
else
case ${yum_repoistory} in
'1')
aliyun_yum;;
'2')
tenxun_yum;;
'3')
wangyiyun;;
'h')
echo ""
env_help
info5
env_config_peizhi;;
'q')
echo ""
exit 0;;
esac
fi ;;
'q')
echo ""
exit 0;;
esac
fi
}
################################################################################
# #
# 启动面板 #
# #
################################################################################
index_run(){
info3
echo -e " CentOS7 系统菜单 "
info3
echo " 1、系统资源查看"
echo " 2、网卡实时流量"
echo " 3、常见服务部署"
echo -e "\033[36m 4、自定义脚本\033[0m"
echo " 5、Yum仓库配置"
echo " 6、基础环境配置"
echo -e "\033[35m 7、中间件服务\033[0m"
echo -e "\033[34m 8、docker镜像构建\033[0m"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
info3
read -n1 -p "请输入对应的数字编号:" check
}
#1、系统资源查看面板
System_resources(){
echo ""
echo "请选择你要查看的系统资源:"
echo "1) CPU"
echo "2) 磁盘"
echo "3) 内存"
echo "4) 网卡"
echo "5) 服务器"
echo "6) ALL"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" system
}
#二级面板,常见服务部署
Service_deployment(){
echo ""
echo -e "\033[36m 个人原因:喜欢使用docker去部署相应的服务,所以该脚本上的服务大多基于docker环境使用的 \033[0m "
echo "请选择你要部署服务:"
echo "1) docker基础环境"
echo "2) 监控服务(prometheus、zabbix)及其组件"
echo "3) 数据库服务"
echo "4) Harbor"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" Service
}
#
Harbor_SERVICE(){
echo -e "\033[36m 个人原因:喜欢使用docker去部署相应的服务,所以该脚本上的服务大多基于docker环境使用的 \033[0m "
echo "请选择你要部署的方式:"
echo "1) http install"
echo "2) http check "
echo "3) https(未完成)"
info3
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" harbor_Service
}
#三级监控服务(prometheus、zabbix)及其组件面板
Service_Prometheus(){
echo ""
info5
echo "请选择你要部署服务:"
echo "1) Prometheus"
echo "2) Grafana"
echo "3) cadvisor"
echo "4) node_export"
echo "5) Pushgateway"
echo "h) 帮助信息"
info3
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" monitoring
}
#三级数据库服务()及其组件面板
Service_database(){
echo ""
info5
echo "请选择你要部署服务:"
echo "1) Mysql"
echo "2) redis"
echo "3) mongo"
echo "4) Oracle"
echo "5) RabbitMQ"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" database
}
Service_database_redis(){
echo ""
info5
echo "请选择你要部署服务:"
echo "1) redis(单机)"
echo "2) redis(集群)"
echo "h) 帮助信息"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" database_redis
}
#三级面板,yum常见服务部署
Service_yum_repoistory1(){
echo ""
info5
info4 "yum源配置"
echo "请选择你要部署服务:"
echo "1) 检查yum源仓库"
echo "2) 重新加载yum源仓库"
echo "3) 配置yum源仓库"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" yum_repoistory1
}
#二级面板,常见服务部署
Service_yum_repoistory(){
echo ""
echo -e "\033[32m 建议使用阿里源\033[0m "
echo "请选择你要部署服务:"
echo "1) 阿里源"
echo "2) 腾讯源"
echo "3) 网易yum源"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" yum_repoistory
}
#二级面板、常用脚本使用
Commonly_used_script(){
echo ""
info5
echo "请选择你要使用的脚本:"
echo "1) rpm下载"
echo "2) harbor证书生成脚本"
echo -e "3)\033[34m 初始化服务器配置\033[0m"
echo -e "4)\033[31m 清理系统登录信息\033[0m"
echo "5) 统计当前系统中可以登录计算机的账户有多少个"
echo "6) 统计/var/log 有多少个文件,并显示这些文件名"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" script
}
#基础环境配置
env_config(){
echo ""
info5
echo "请选择你要使用的脚本:"
echo -e "1)\033[91m 初始化服务器配置\033[0m"
echo "2) chronyd时间同步服务端"
echo "3) chronyd时间同步客户端"
echo "4) 基础环境检查"
echo "5) k8s/docker环境检查"
echo "6) harbor服务检查及服务重新操作"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" env_script
}
#中间件服务
middleware_server(){
echo ""
info5
echo "请选择你要部署服务:"
echo "1) zookeeper"
echo "2) kafka"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" middleware
}
#8、镜像构建
basi_build(){
echo ""
info5
echo "请选择你要构建的镜像:"
echo "1) kafka"
info3
echo "h【帮助】 Enter【主页面】"
echo "q【退出】 Enter【主页面】"
read -n1 -p "请输入对应的数字编号:" basi_build_num
}
################################################################################
# #
# 帮助信息 #
# #
################################################################################
help(){
echo ""
info5
info7 "脚本注解:"
info8 "该脚本整合了本人学习脚本过程中所写的脚本,以及网上开源的脚本"
info8 "结合统一的启动门户($0),实现统一的管理,不过内容添加的越多,越觉得脚本冗余性太复杂"
info8 "执行方式:"
info "sh $0"
info8 "根据屏幕上的输出信息, 进行填写即可"
info5
}
script_help(){
echo ""
info5
info4 "帮助信息"
info3
info7 "1) rpm下载脚本,通过页面上的提示进行选择性的下载指定的安装包,并且存放到执行的路径下"
info6 "注意: 1.默认路径是: /opt/rpm"
info6 " 2.下载多个安装包时: 只需要在填写包名时,以空格为分隔符即可"
info3
info7 "2) harbor证书生成脚本,脚本未集成至$0脚本中,调用harbor_ssl.sh脚本执行"
info6 "注意: 1.脚本生成的证书,在ssl目录下把certs.d目录打包成certs_d.tar.gz,复制其他docker客户端使用"
info6 " 2.复制到docker客户端的/etc/docker/目录下"
info6 " 3.执行tar -xvf registry.harbor.cn.tar.gz,解压到当前路径"
info6 " 4.在daemon.json文件中添加\"insecure-registries\": [\"registry.harbor.cn\"]"
info6 "其中,服务使用的证书也在此目录下,需要根据实际情况,修改对应的harbor.yml文件,重启harbor服务即可实现https登录harbor"
info3
info7 "3) 初始化服务器配置,是因为每次新装一台linux服务器后,都需要做一些基础的操作,例如"
info6 "selinux、firewalld、ntp时间同步、文件描述的限制、基础安装包(vim、bash-completion...)"
info6 "注意: 1.可以配合主页面\"基础环境检查\"进行查看配置是否生效"
info6 " 2.selinux、内核参数的限制需要重启服务器后生效"
info6 " 3.设置的主机名需要重新打开一次终端,或者直接在命令行中输入:\"bash\""
info5
used_script_run
}
basi_build_help(){
source ${bashpath}/conf/conf.conf
echo ""
info5
info4 "帮助信息"
info3
info7 "1) kafka"
info6 "kafka镜像构建依赖于jdk的环境,所以需要提前准备好jdk的安装包(${basic_pkg})"
info6 "需要提前确认好jdk的版本,如果版本如默认的不一致,则需要修改对应的Dockerfile"
info6 "把下载好的安装包,存放在当前机器上的一个目录下即可(手动)"
info7 "kafka的版本则是根据kafka的安装包而定的,也是需要手动下载,与jdk安装包放置在同一目录下"
info5
basi_build_run
}
#输出日志
rpm_log(){
info2 "使用本脚本时,需要链接外网"
info2 "请检查网络的连接"
info2 "后面的路径可以是相对路径,或者绝对路径"
}
iostat_log_run(){
info4 "cpu属性值说明"
info2 "%user:CPU处在用户模式下的时间百分比"
info2 "%nice:CPU处在带NICE值的用户模式下的时间百分比"
info2 "%system:CPU处在系统模式下的时间百分比"
info2 "%iowait:CPU等待输入输出完成时间的百分比"
info2 "%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比"
info2 "%idle:CPU空闲时间百分比"
info3
info4 "Device属性值说明"
info2 "tps:该设备每秒的传输次数"
info2 "kB_read/s:每秒从设备(drive expressed)读取的数据量"
info2 "kB_wrtn/s:每秒向设备(drive expressed)写入的数据量"
info2 "kB_read: 读取的总数据量"
info2 "kB_wrtn:写入的总数量数据量"
}
#监控信息监控帮助信息
monitoring_help(){
info3
info4 "选项帮助信息"
info6 "1)Prometheus"
info2 "Prometheus,因配置文件外置,需要根据实际情况编写,当前尚未自动化维护配置文件,所以需要手动需要手动修改"
info2 "prometheus.yml文件存放路径是:${bashpath}/monitor/prometheus.yml"
info3 "2)Grafana"
info2 "Grafana数据可视化展示,把Prometheus对接的采集"
}
#harbor
harbor_help(){
info4 "harbor信息帮助"
}
env_help(){
info3
info4 "选项帮助信息"
info6 "1)初始化服务器配置"
info7 "\033[31m 初次装机时进行的相应基础的配置033\0m(ssh超时时间、安装基础安装包、设置主机名、修改时区、统内核优化等)"
info3
info6 "2) chronyd时间同步服务端"
info2 "CentOS7上部署chronyd时间同步服务,且指定外网地址(阿里云时间同步服务器)"
info2 "可通过: chronyc sources -v进行检查时间"
info6 "3) chronyd时间同步客户端"
info2 "CentOS7上部署chronyd时间同步服务,且指定外网地址(阿里云时间同步服务器)"
info2 "可通过: chronyc sources -v进行检查时间"
info3
info6 "4) 基础环境检查"
info2 "检查上面的初始化服务配置是否成功"
}
database_help(){
info3
info4 "选项帮助信息"
info6 "1)mysql"
info7 "需要安装docker环境且网络状态良好"
info3
info6 "2) redis"
info2 "需要安装docker环境且网络状态良好"
info6 "3) Oracle"
info2 "需要安装docker环境且网络状态良好"
info3
info6 "4) RabbitMQ"
info2 "需要安装docker环境且网络状态良好"
}
################################################################################
# #
# 启动方式,第一主页面 #
# #
################################################################################
#启动方式,第一主页面
run(){
index_run
if [ -z ${check} ];then
info6 "请重新输入"
run
else
case $check in
'1')
system_run;;
#sh script/check.sh ;;
'2')
traffic_run ;;
'3')
server_run ;;
'4')
used_script_run;;
'5')
Service_yum_run;;
'6')
env_config_peizhi;;
'7')
middleware_server_run;;
'8')
basi_build_run;;
'h')
help
index_run;;
'q')
echo ""
exit 0 ;;
esac
fi
}
############################################################################
run