Linux脚本集合--持续更新

发布于:2025-09-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

                  1.1、多版本替换镜像源

1.2、linux多版本安装zabbix

1.3、安装zabbix agent,agent2脚本

1.4、整合更新多版本linux系统仓库源和zabbix-agent多版本安装包脚本

二、安装docker脚本

三、安装harbor脚本

四、一键编译安装Redis脚本

五、一键安装mongdb脚本

本文提供多个Linux系统管理脚本,涵盖以下功能:

  1. 系统管理脚本
  • 多版本替换镜像源(支持Ubuntu/Debian、CentOS/RHEL等)
  • IP地址修改脚本(支持静态/DHCP配置)
  1. 监控工具安装
  • Zabbix Agent/Agent2安装(支持多版本选择)
  • 自动检测系统类型并适配安装方式
  1. 容器化部署
  • Docker安装脚本(支持在线/离线安装)
  • Harbor私有镜像仓库部署脚本
  1. 数据库安装
  • Redis编译安装脚本(支持多版本)
  • MongoDB一键安装脚本

主要特点:

  1. 自动识别操作系统类型和版本
  2. 支持阿里云镜像源替换
  3. 包含错误检测和网络检查
  4. 安装完成后自动配置服务
  5. 支持交互式版本选择

这些脚本适用于Linux系统管理员快速部署常用服务,提升运维效率。

1.1、多版本替换镜像源

​
#! /bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
​
#查询版本
ID=$(cat /etc/os-release | grep -E '^ID='|cut -d "=" -f2 | tr -d "\"")
​
#定义路径
ubuntupath="/etc/apt/sources.list"
centospath="/etc/yum.repos.d/Rocky*.repo"
file=/aliyun/aliyun.txt
​
replace_ubuntu() {
​
if [ -f $ubuntupath ];then
  sed -i 's#http://cn.archive.ubuntu.com/#https://mirrors.aliyun.com/#' $ubuntupath
  sed -i 's#http://security.ubuntu.com/#https://mirrors.aliyun.com/#' $ubuntupath
  echo -e "\e[31m 执行更新源:aliyun \e[0m"
  apt clean
  apt update
  echo -e "\e[32m 更新完成为aliyun源仓库 \e[0m"
else
  touch $ubuntupath < $file
fi
}
​
​
replace_centos() {
             echo -e "\e[31m 执行更新源:aliyun \e[0m"
 for file in $centospath ;do
        if [ -f $file  ];then
             sed -i -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' $file
        else      
             echo -e "${RED}不存在.repo文件"
        fi
​
done
             echo -e "\e[32m 更新完成为aliyun源仓库 \e[0m"
            echo  
             echo -e "$GREEN 执行清除源缓存"
             yum clean all
             echo -e "$GREEN 执行增加缓存"
             yum makecache
             echo -e "$GREEN 执行更新"
             yum update
          
}
​
case $ID in 
        ubuntu|debian)
        echo -e "${GREEN}执行更新ubuntu源为aliyun"
         replace_ubuntu
        ;;
        centos|rhel|almalinux|rocky)
        echo -e "${GREEN}执行更新rocky源为aliyun"
         replace_centos
        ;;
        *)
                echo -e "${RED}不支持的操作系统:$ID"
        ;;
esac
​

1.2、安装zabbix agent,agent2脚本

#! /bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
​
#公共变量
        ID=$(. /etc/os-release;echo $ID ) 
        VERSION_ID=$(. /etc/os-release;echo $VERSION_ID ) 
        package_name=zabbix-release_latest_6.0+${ID}${VERSION_ID}_all.deb
        centos_name=$(. /etc/os-release;echo $VERSION_ID |cut -d "." -f1 )
    read -p "请输入想要下载的agent版本: " usernum
​
        ping_net() {
        echo -e "${YELLOW}检测网络是否正常..."
        for num in {1..5};do
          num=`ping -c$num -w1 www.bu.com` 
          echo $num > /dev/null
        if [ $(echo $?) -eq 0 ];then
               echo -e "${GREEN}网络正常"
        else
               echo -e "${RED}网络不正常"
        fi
        done
            
}
​
​
​
#ubunutu  agent安装
install_ubunturepo() {
        echo -e "$YELLOW检测是否存在zabbix包并做删除"
        delete_zbfile=$(find . -name "zabbix-release_latest*" -exec rm -rf ./{} \;)
echo
        echo -e "$GREEN删除成功"
echo -e "$YELLOW获取zabbix包"
       wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/$package_name
       echo
​
       echo -e "$GREEN安装zabbix包"
       dpkg -i ./$package_name
       echo
​
if [ $usernum -eq 1 ];then
       echo -e "$YELLOW将zabbix的默认源替换为aliyun源"
       ubuntu_path=$(find /etc/apt/sources.list.d/  -name "zabbix*")
      for f in $ubuntu_path;do
      sed -i 's#repo.zabbix.com#mirrors.aliyun.com/zabbix#' $f
      done
       echo -e "$YELLOW zabbix的默认源替换为aliyun源完成"
​
​
     echo -e "$GREEN更新源"
       apt update
      echo
​
​
      echo
      echo -e "$GREEN安装zabbix-agent"
     apt -y install zabbix-agent 
       
elif [ $usernum -eq 2 ];then
​
       echo -e "$YELLOW将zabbix的默认源替换为aliyun源"
       ubuntu_path=$(find /etc/apt/sources.list.d/  -name "zabbix*")
      for f in $ubuntu_path;do
      sed -i 's#repo.zabbix.com#mirrors.aliyun.com/zabbix#' $f
      done
       echo -e "$YELLOW zabbix的默认源替换为aliyun源完成"
       
       
       echo -e "$GREEN更新源"
       apt update
      echo
​
​
      echo -e "$YELLOW zabbix的默认源替换为aliyun源完成"
      echo -e "$GREEN安装zabbix-agent2"
      apt -y install zabbix-agent2 
​
fi
}
​
​
#centos agent安装
install_centosrepo(){
​
echo -e "$YELLOW检测是否存在zabbix包并做删除"
        delete_zbfile=$(find . -name "zabbix-release*" -exec rm -rf ./{} \;)
        echo -e "$GREEN删除成功"
echo
echo -e "$YELLOW获取zabbix包"
   rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-latest-6.0.el$centos_name.noarch.rpm
       echo
​
if [ $usernum -eq 1 ];then
       echo -e "$GREEN安装zabbix_agent包"
                dnf clean all
       dnf -y install zabbix-agent 
       echo
elif [ $usernum -eq 2 ];then
       echo -e "$GREEN安装zabbix_agent2包"
                dnf clean all
       dnf -y install zabbix-agent2 
fi
       echo -e "$GREEN更新源"
       yum update
​
}
​
​
#ubuntu,centos服务重启
server_restart() {
if [ $usernum -eq 1 ];then
        echo -e "$GREEN重启agent服务"
        $(systemctl restart zabbix-agent)
        echo
        echo -e "$GREEN设置开机自启服务"
        $(systemctl enable --now zabbix-agent)
        echo
        echo -e "$GREEN检测服务是否存活"
        systemctl is-active zabbix-agent
​
elif [ $usernum -eq 2 ];then
​
        echo -e "$GREEN重启agent2服务"
        $(systemctl restart zabbix-agent2)
        echo
        echo -e "$GREEN设置开机自启服务"
        $(systemctl enable --now zabbix-agent2)
        echo
        echo -e "$GREEN检测服务是否存活"
        systemctl is-active zabbix-agent2
else
   echo -e "$RED######未知请求######"
fi
}
​
​
​
#ubuntu主函数
​
ubuntu_main(){
install_ubunturepo
server_restart
}
​
​
​
#centos主函数
​
centos_main(){
​
install_centosrepo
server_restart
}
​
​
​
case $ID in
        ubuntu|debian)
        echo -e "${GREEN}执行安装ubuntu_zabbixagent"
        ubuntu_main
                ;;
        centos|rhel|almalinux|rocky)
        echo -e "${GREEN}执行安装centos_zabbixagent"
        centos_main
        ;;
        *)
        echo -e "${RED}不支持的操作系统:$ID"
        ;;
esac

1.3、整合更新多版本linux系统仓库源和zabbix-agent多版本安装包脚本

#! /bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
​
#公共变量
        ID=$(. /etc/os-release;echo $ID ) 
        VERSION_ID=$(. /etc/os-release;echo $VERSION_ID ) 
        package_name=zabbix-release_latest_6.0+${ID}${VERSION_ID}_all.deb
        centos_name=$(. /etc/os-release;echo $VERSION_ID |cut -d "." -f1 )
        read -p "请输入想要下载的agent版本: " usernum
​
#定义路径
        ubuntu_repo="/etc/apt/sources.list"
        centos_repo="/etc/yum.repos.d/Rocky*.repo"
        file=/aliyun/aliyun.txt
​
#检测网络正常是否
        ping_net() {
        echo -e "${YELLOW}检测网络是否正常..."
        for num in {1..5};do
          num=`ping -c$num -w1 www.bu.com` 
          echo $num > /dev/null
        if [ $(echo $?) -eq 0 ];then
               echo -e "${GREEN}网络正常"
        else
               echo -e "${RED}网络不正常"
        fi
        done
            
}
​
​
#替换ubuntu系列源路径
replace_ubuntu() {
​
echo -e "${GREEN}执行更新ubuntu系列源为aliyun"
if [ -f $ubuntu_repo ];then
  sed -i 's#http://cn.archive.ubuntu.com/#https://mirrors.aliyun.com/#' $ubuntu_repo
  sed -i 's#http://security.ubuntu.com/#https://mirrors.aliyun.com/#' $ubuntu_repo
  echo -e "\e[31m 执行更新源:aliyun \e[0m"
  apt -y clean
  apt -y update
  echo -e "\e[32m 更新完成为aliyun源仓库 \e[0m"
  echo
  echo
else
  touch $ubuntu_repo < $file
fi
}
​
#替换centos系列源路径
replace_centos() {
​
echo -e "${GREEN}执行更新ubuntu系列源为aliyun"
 for file in $centos_repo ;do
        if [ -f $file  ];then
             sed -i -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' $file
        else      
             echo -e "${RED}不存在.repo文件"
        fi
​
done
             echo -e "\e[32m 更新完成为aliyun源仓库 \e[0m"
            echo  
             echo -e "$GREEN 执行清除源缓存"
             yum -y clean all
             echo -e "$GREEN 执行增加缓存"
             yum -y makecache
             echo -e "$GREEN 执行更新"
             yum -y update
          
}
​
​
​
​
​
#ubunutu  agent安装
install_ubunturepo() {
        echo -e "${GREEN}*********执行安装ubuntu_zabbixagent系列***********"
        echo
        echo
        echo -e "$YELLOW检测是否存在zabbix包并做删除"
        delete_zbfile=$(find . -name "zabbix-release_latest*" -exec rm -rf ./{} \;)
echo
        echo -e "$GREEN删除成功"
echo -e "$YELLOW获取zabbix包"
       wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/$package_name
       echo
​
       echo -e "$GREEN安装zabbix包"
       dpkg -i ./$package_name
       echo
​
if [ $usernum -eq 1 ];then
       echo -e "$YELLOW将zabbix的默认源替换为aliyun源"
       ubuntu_path=$(find /etc/apt/sources.list.d/  -name "zabbix*")
      for f in $ubuntu_path;do
      sed -i 's#repo.zabbix.com#mirrors.aliyun.com/zabbix#' $f
      done
       echo -e "$YELLOW zabbix的默认源替换为aliyun源完成"
​
​
     echo -e "$GREEN更新源"
       apt -y update
      echo
​
​
      echo
      echo -e "$GREEN安装zabbix-agent"
     apt -y install zabbix-agent 
       
elif [ $usernum -eq 2 ];then
​
       echo -e "$YELLOW将zabbix的默认源替换为aliyun源"
       ubuntu_path=$(find /etc/apt/sources.list.d/  -name "zabbix*")
      for f in $ubuntu_path;do
      sed -i 's#repo.zabbix.com#mirrors.aliyun.com/zabbix#' $f
      done
       echo -e "$YELLOW zabbix的默认源替换为aliyun源完成"
       
       
       echo -e "$GREEN更新源"
       apt -y update
      echo
​
​
      echo -e "$YELLOW zabbix的默认源替换为aliyun源完成"
      echo -e "$GREEN安装zabbix-agent2"
      apt -y install zabbix-agent2 
​
fi
}
​
​
#centos agent安装
install_centosrepo(){
        echo -e "${GREEN}*********执行安装centos_zabbixagent系列***********"
        echo
        echo
​
echo -e "$YELLOW检测是否存在zabbix包并做删除"
        delete_zbfile=$(find . -name "zabbix-release*" -exec rm -rf ./{} \;)
        echo -e "$GREEN删除成功"
echo
echo -e "$YELLOW获取zabbix包"
   rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-latest-6.0.el$centos_name.noarch.rpm
       echo
​
if [ $usernum -eq 1 ];then
       echo -e "$GREEN安装zabbix_agent包"
                dnf clean all
       dnf -y install zabbix-agent 
       echo
elif [ $usernum -eq 2 ];then
       echo -e "$GREEN安装zabbix_agent2包"
                dnf clean all
       dnf -y install zabbix-agent2 
fi
       echo -e "$GREEN更新源"
       yum -y update
​
}
​
​
#ubuntu,centos服务重启
server_restart() {
if [ $usernum -eq 1 ];then
        echo -e "$GREEN重启agent服务"
        $(systemctl restart zabbix-agent)
        echo
        echo -e "$GREEN设置开机自启服务"
        $(systemctl enable --now zabbix-agent)
        echo
        echo -e "$GREEN检测服务是否存活"
        systemctl is-active zabbix-agent
​
elif [ $usernum -eq 2 ];then
​
        echo -e "$GREEN重启agent2服务"
        $(systemctl restart zabbix-agent2)
        echo
        echo -e "$GREEN设置开机自启服务"
        $(systemctl enable --now zabbix-agent2)
        echo
        echo -e "$GREEN检测服务是否存活"
        systemctl is-active zabbix-agent2
else
   echo -e "$RED######未知请求######"
fi
}
​
​
​
#ubuntu主函数
​
ubuntu_main(){
replace_ubuntu
echo -e "$RED****************************************************************************************"
echo -e "$YELLOW****************************************************************************************"
echo -e "$GREEN****************************************************************************************"
echo
echo
echo
​
​
install_ubunturepo
echo -e "$RED****************************************************************************************"
echo -e "$YELLOW****************************************************************************************"
echo -e "$GREEN****************************************************************************************"
echo
echo
echo
​
​
server_restart
}
​
​
​
#centos主函数
​
centos_main(){
replace_centos
echo -e "$RED****************************************************************************************"
echo -e "$YELLOW****************************************************************************************"
echo -e "$GREEN****************************************************************************************"
echo
echo
echo
​
​
​
install_centosrepo
echo -e "$RED****************************************************************************************"
echo -e "$YELLOW****************************************************************************************"
echo -e "$GREEN****************************************************************************************"
echo
echo
echo
​
​
​
server_restart
}
​
​
​
case $ID in
        ubuntu|debian)
        ubuntu_main
        ;;
​
        centos|rhel|almalinux|rocky)
        centos_main
        ;;
        
        *)
        echo -e "${RED}不支持的操作系统:$ID"
        ;;
esac

1.5、一键更改IP

#!/bin/bash
# Linux Network Configuration Script
# Supported Distributions: Ubuntu/Debian, CentOS/RHEL, Fedora, openSUSE/SLES, Arch Linux
​
# Check root permission
if [ "$(id -u)" != "0" ]; then
    echo "Error: This script must be run as root!" 1>&2
    exit 1
fi
​
# Detect distribution
detect_distro() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        DISTRO=$ID
        VERSION=$VERSION_ID
    elif [ -f /etc/centos-release ]; then
        DISTRO="centos"
        VERSION=$(grep -oE '[0-9]+\.[0-9]+' /etc/centos-release)
    else
        echo "Unsupported Linux distribution"
        exit 1
    fi
}
​
# Backup current configuration
backup_config() {
    local interface=$1
    TIMESTAMP=$(date +%Y%m%d%H%M%S)
    
    case $DISTRO in
        ubuntu|debian)
            cp /etc/netplan/*.yaml /etc/netplan/*.yaml.bak.$TIMESTAMP 2>/dev/null
            ;;
        centos|rhel|fedora)
            cp /etc/sysconfig/network-scripts/ifcfg-$interface /etc/sysconfig/network-scripts/ifcfg-$interface.bak.$TIMESTAMP 2>/dev/null
            ;;
        opensuse|sles)
            cp /etc/sysconfig/network/ifcfg-$interface /etc/sysconfig/network/ifcfg-$interface.bak.$TIMESTAMP 2>/dev/null
            ;;
        arch)
            cp /etc/netctl/$interface /etc/netctl/$interface.bak.$TIMESTAMP 2>/dev/null
            ;;
    esac
    echo "Configuration backed up with timestamp: $TIMESTAMP"
}
​
# Configure Ubuntu/Debian (Netplan)
configure_netplan() {
    local interface=$1
    local mode=$2
    local ip=${3:-""}
    local prefix=${4:-""}
    local gateway=${5:-""}
    local dns=${6:-""}
    
    CONFIG_FILE=$(ls /etc/netplan/*.yaml | head -n1)
    if [ -z "$CONFIG_FILE" ]; then
        CONFIG_FILE="/etc/netplan/01-network.yaml"
    fi
​
    # Generate Netplan config
    cat > "$CONFIG_FILE" << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    $interface:
      dhcp4: $([ "$mode" == "dhcp" ] && echo "true" || echo "false")
EOF
​
    if [ "$mode" == "static" ]; then
        cat >> "$CONFIG_FILE" << EOF
      addresses: [$ip/$prefix]
      routes:
        - to: default
          via: $gateway
      nameservers:
        addresses: [$dns]
EOF
    fi
​
    # Apply configuration
    netplan apply
}
​
# Configure CentOS/RHEL/Fedora (ifcfg)
configure_rhel() {
    local interface=$1
    local mode=$2
    local ip=${3:-""}
    local prefix=${4:-""}
    local gateway=${5:-""}
    local dns=${6:-""}
    
    CONFIG_FILE="/etc/sysconfig/network-scripts/ifcfg-$interface"
    
    # Generate config
    cat > "$CONFIG_FILE" << EOF
DEVICE=$interface
ONBOOT=yes
BOOTPROTO=$([ "$mode" == "dhcp" ] && echo "dhcp" || echo "none")
EOF
​
    if [ "$mode" == "static" ]; then
        cat >> "$CONFIG_FILE" << EOF
IPADDR=$ip
PREFIX=$prefix
GATEWAY=$gateway
DNS1=$dns
EOF
    fi
​
    # Apply configuration
    if systemctl is-active NetworkManager >/dev/null; then
        nmcli connection reload
        nmcli device reapply $interface
    else
        systemctl restart network
    fi
}
​
# Configure openSUSE/SLES (ifcfg)
configure_suse() {
    local interface=$1
    local mode=$2
    local ip=${3:-""}
    local prefix=${4:-""}
    local gateway=${5:-""}
    local dns=${6:-""}
    
    CONFIG_FILE="/etc/sysconfig/network/ifcfg-$interface"
    
    # Generate config
    cat > "$CONFIG_FILE" << EOF
BOOTPROTO=$([ "$mode" == "dhcp" ] && echo "dhcp" || echo "static")
STARTMODE=auto
NAME=$interface
EOF
​
    if [ "$mode" == "static" ]; then
        cat >> "$CONFIG_FILE" << EOF
IPADDR=$ip
NETMASK=255.255.255.0
GATEWAY=$gateway
DNS1=$dns
EOF
    fi
​
    # Apply configuration
    systemctl restart network
}
​
# Configure Arch Linux (netctl)
configure_arch() {
    local interface=$1
    local mode=$2
    local ip=${3:-""}
    local prefix=${4:-""}
    local gateway=${5:-""}
    local dns=${6:-""}
    
    CONFIG_FILE="/etc/netctl/$interface"
    
    if [ "$mode" == "dhcp" ]; then
        cat > "$CONFIG_FILE" << EOF
Interface=$interface
Connection=ethernet
IP=dhcp
EOF
    else
        cat > "$CONFIG_FILE" << EOF
Interface=$interface
Connection=ethernet
IP=static
Address=('$ip/$prefix')
Gateway='$gateway'
DNS=('$dns')
EOF
    fi
​
    # Apply configuration
    netctl stop $interface 2>/dev/null
    netctl start $interface
}
​
# Main script
detect_distro
echo "Detected distribution: $DISTRO $VERSION"
​
# Get available interfaces
echo -e "\nAvailable network interfaces:"
ip -o link show | awk -F': ' '{print $2}'
read -p "Enter interface name: " INTERFACE
​
# Select configuration mode
PS3="Select configuration mode: "
options=("Static IP" "DHCP" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Static IP")
            MODE="static"
            read -p "IP Address (e.g., 192.168.1.100): " IP
            read -p "Subnet Prefix (e.g., 24): " PREFIX
            read -p "Gateway (e.g., 192.168.1.1): " GATEWAY
            read -p "DNS Server (e.g., 8.8.8.8): " DNS
            break
            ;;
        "DHCP")
            MODE="dhcp"
            break
            ;;
        "Quit")
            exit 0
            ;;
        *) echo "Invalid option";;
    esac
done
​
# Backup and configure
backup_config $INTERFACE
​
case $DISTRO in
    ubuntu|debian)
        configure_netplan $INTERFACE $MODE $IP $PREFIX $GATEWAY $DNS
        ;;
    centos|rhel|fedora)
        configure_rhel $INTERFACE $MODE $IP $PREFIX $GATEWAY $DNS
        ;;
    opensuse|sles)
        configure_suse $INTERFACE $MODE $IP $PREFIX $GATEWAY $DNS
        ;;
    arch)
        configure_arch $INTERFACE $MODE $IP $PREFIX $GATEWAY $DNS
        ;;
    *)
        echo "Unsupported distribution: $DISTRO"
        exit 1
        ;;
esac
​
echo -e "\nNetwork configuration applied successfully!"
echo "Interface $INTERFACE configured in $MODE mode"

二、安装docker脚本

在线安装参考aliyun官网

离线安装docker

#!/bin/bash
#
#********************************************************************
#Author:            wangxiaochun
#QQ:                29308620
#Date:              2022-10-14
#FileName:          install_docker_offline.sh
#URL:               http://www.wangxiaochun.com
#Description:       The test script
#Copyright (C):     2022 All rights reserved
#********************************************************************
​
#支持在线和离线安装
​
DOCKER_VERSION=26.1.4
#DOCKER_VERSION=26.0.0
#DOCKER_VERSION=24.0.7
#DOCKER_VERSION=24.0.5
#DOCKER_VERSION=23.0.3
#DOCKER_VERSION=20.10.19
​
URL=https://mirrors.tuna.tsinghua.edu.cn
#URL=https://mirrors.aliyun.com
#URL=https://download.docker.com
​
color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}
​
prepare () {
    if [ ! -e docker-${DOCKER_VERSION}.tgz ];then
        #wget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
        wget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
    fi
    [ $? -ne 0  ] && { echo "文件下载失败"; exit; }
}
​
install_docker () {
    tar xf docker-${DOCKER_VERSION}.tgz -C /usr/local/
    cp /usr/local/docker/* /usr/local/bin/
    cat > /lib/systemd/system/docker.service <<-EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
​
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/local/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP \$MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
​
[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
}
​
config_docker () {
    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"]
     }
EOF
    #systemctl restart docker
​
}
​
start_docker (){
    systemctl enable --now docker
    docker version && color "Docker 安装成功" 0 ||  color "Docker 安装失败" 1
}
​
​
config_docker_completion () {
    wget -P /etc/bash_completion.d http://www.wangxiaochun.com:8888/testdir/docker/docker_completion 
    #source /etc/bash_completion.d/docker_completion
}
​
​
prepare
​
install_docker
​
config_docker
​
start_docker
​
config_docker_completion

三、安装harbor脚本

#!/bin/bash
#
#********************************************************************
#Author:            wangxiaochun
#QQ:                29308620
#Date:              2020-02-04
#FileName:          install_harbor.sh
#URL:               http://www.wangxiaochun.com
#Description:       The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************
​
#建议提前下载Harbor文件进行离线安装,也支持在线下载安装
#docker和docker-compose无需下载,在线安装即可
​
HARBOR_VERSION=2.11.0
#HARBOR_VERSION=2.10.2
#HARBOR_VERSION=2.9.1
#HARBOR_VERSION=2.9.0
#HARBOR_VERSION=2.8.2
#HARBOR_VERSION=2.7.1
#HARBOR_VERSION=2.7.0
#HARBOR_VERSION=2.6.1
#HARBOR_VERSION=2.6.0
​
GITHUB_PROXY=https://mirror.ghproxy.com/
​
HARBOR_BASE=/usr/local
​
#HARBOR_NAME=harbor.wang.org
HARBOR_NAME=`hostname -I|awk '{print $1}'`
#HARBOR_NAME=10.0.0.200
​
DOCKER_VERSION="26.1.3"
#DOCKER_VERSION="24.0.0"
#DOCKER_VERSION="20.10.20"
#DOCKER_VERSION="19.03.14"
DOCKER_URL="http://mirrors.ustc.edu.cn"
#DOCKER_URL="https://mirrors.tuna.tsinghua.edu.cn"
​
DOCKER_COMPOSE_VERSION=2.27.1
#DOCKER_COMPOSE_VERSION=2.18.1
#DOCKER_COMPOSE_VERSION=2.6.1
#DOCKER_COMPOSE_VERSION=1.29.2
DOCKER_COMPOSE_FILE=docker-compose-linux-x86_64
​
​
HARBOR_ADMIN_PASSWORD=123456
​
HARBOR_IP=`hostname -I|awk '{print $1}'`
​
​
COLOR_SUCCESS="echo -e \\033[1;32m"
COLOR_FAILURE="echo -e \\033[1;31m"
END="\033[m"
​
. /etc/os-release
UBUNTU_DOCKER_VERSION="5:${DOCKER_VERSION}~3-0~${ID}-${UBUNTU_CODENAME}"
​
color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}
​
​
install_docker(){
    if [ $ID = "centos" -o $ID = "rocky" ];then
        if [ $VERSION_ID = "7" ];then
            cat >  /etc/yum.repos.d/docker.repo  <<EOF
[docker]
name=docker
gpgcheck=0
#baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
baseurl=${DOCKER_URL}/docker-ce/linux/centos/7/x86_64/stable/
EOF
        else     
            cat >  /etc/yum.repos.d/docker.repo  <<EOF
[docker]
name=docker
gpgcheck=0
#baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/stable/
baseurl=${DOCKER_URL}/docker-ce/linux/centos/8/x86_64/stable/
EOF
        fi
       yum clean all 
        ${COLOR_FAILURE} "Docker有以下版本"${END}
        yum list docker-ce --showduplicates
        ${COLOR_FAILURE}"5秒后即将安装: docker-"${DOCKER_VERSION}" 版本....."${END}
        ${COLOR_FAILURE}"如果想安装其它Docker版本,请按ctrl+c键退出,修改版本再执行"${END}
        sleep 5
        yum -y install docker-ce-$DOCKER_VERSION docker-ce-cli-$DOCKER_VERSION  \
            || { color "Base,Extras的yum源失败,请检查yum源配置" 1;exit; }
    else
        dpkg -s docker-ce &> /dev/null && $COLOR"Docker已安装,退出" 1 && exit
        apt  update || { color "更新包索引失败" 1 ; exit 1; }  
        apt  -y install docker.io
    fi
    if [ $? -eq 0 ];then
        color "安装软件包成功"  0
    else
        color "安装软件包失败,请检查网络配置" 1
        exit
    fi
        
    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
{
      "registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"],
      "insecure-registries": ["harbor.wang.org"]
}
EOF
    systemctl daemon-reload
    systemctl enable docker
    systemctl restart docker
    docker version && color "Docker 安装成功" 0 ||  color "Docker 安装失败" 1
    echo 'alias rmi="docker images -qa|xargs docker rmi -f"' >> ~/.bashrc
    echo 'alias rmc="docker ps -qa|xargs docker rm -f"' >> ~/.bashrc
}
​
​
​
install_docker_compose(){
    if [ $ID = "centos" -o $ID = "rocky" ];then
        ${COLOR_SUCCESS}"开始安装 Docker compose....."${END}
        sleep 1
        if [ ! -e  ${DOCKER_COMPOSE_FILE} ];then
            curl -L ${GITHUB_PROXY}https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/${DOCKER_COMPOSE_FILE} -o /usr/bin/docker-compose
            #curl -L https://get.daocloud.io/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m) -o /usr/bin/docker-compose
        else
            mv ${DOCKER_COMPOSE_FILE} /usr/bin/docker-compose
        fi
        chmod +x /usr/bin/docker-compose
    else 
        apt -y install docker-compose
    fi
    if docker-compose --version ;then
        ${COLOR_SUCCESS}"Docker Compose 安装完成"${END} 
    else
        ${COLOR_FAILURE}"Docker compose 安装失败"${END}
        exit
    fi
}
​
install_harbor(){
    ${COLOR_SUCCESS}"开始安装 Harbor....."${END}
    sleep 1
    if  [ ! -e  harbor-offline-installer-v${HARBOR_VERSION}.tgz ] ;then
        wget ${GITHUB_PROXY}https://github.com/goharbor/harbor/releases/download/v${HARBOR_VERSION}/harbor-offline-installer-v${HARBOR_VERSION}.tgz || ${COLOR_FAILURE} "下载失败!" ${END}
    fi
    [ -d ${HARBOR_BASE} ] ||  mkdir ${HARBOR_BASE}
    tar xvf harbor-offline-installer-v${HARBOR_VERSION}.tgz  -C ${HARBOR_BASE}
    cd ${HARBOR_BASE}/harbor
    cp harbor.yml.tmpl harbor.yml
    sed -ri "/^hostname/s/reg.mydomain.com/${HARBOR_NAME}/" harbor.yml
    sed -ri "/^https/s/(https:)/#\1/" harbor.yml
    sed -ri "s/(port: 443)/#\1/" harbor.yml
    sed -ri "/certificate:/s/(.*)/#\1/" harbor.yml
    sed -ri "/private_key:/s/(.*)/#\1/" harbor.yml
    sed -ri "s/Harbor12345/${HARBOR_ADMIN_PASSWORD}/" harbor.yml
    sed -i 's#^data_volume: /data#data_volume: /data/harbor#' harbor.yml
    #mkdir -p /data/harbor
    #{HARBOR_BASE}/harbor/install.sh --with-chartmuseum && ${COLOR_SUCCESS}"Harbor 安装完成"${END} ||  ${COLOR_FAILURE}"Harbor 安装失败"${END}
    ${HARBOR_BASE}/harbor/install.sh && ${COLOR_SUCCESS}"Harbor 安装完成"${END} ||  ${COLOR_FAILURE}"Harbor 安装失败"${END}
    cat > /lib/systemd/system/harbor.service <<EOF
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
​
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f  ${HARBOR_BASE}/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f ${HARBOR_BASE}/harbor/docker-compose.yml down
​
[Install]
WantedBy=multi-user.target
EOF
​
    systemctl daemon-reload 
    systemctl enable  harbor &>/dev/null ||  ${COLOR}"Harbor已配置为开机自动启动"${END}
    if [ $?  -eq 0 ];then  
        echo 
        color "Harbor安装完成!" 0
        echo "-------------------------------------------------------------------"
        echo -e "请访问链接: \E[32;1mhttp://${HARBOR_IP}/\E[0m" 
        echo -e "用户和密码: \E[32;1madmin/${HARBOR_ADMIN_PASSWORD}\E[0m" 
    else
        color "Harbor安装失败!" 1
        exit
    fi
    echo "$HARBOR_IP     $HARBOR_NAME"   >> /etc/hosts
}
​
​
​
docker info  &> /dev/null  && ${COLOR_FAILURE}"Docker已安装"${END} || install_docker
​
docker-compose --version &> /dev/null && ${COLOR_FAILURE}"Docker Compose已安装"${END} || install_docker_compose
​
install_harbor
​
​

四、一键编译安装Redis脚本

#!/bin/bash
#
#********************************************************************
#Author:          wangxiaochun
#QQ:              29308620
#Date:            2020-07-22
#FileName:       install_redis.sh
#URL:             http://www.magedu.com
#Description:     The test script
#Copyright (C):   2020 All rights reserved
#********************************************************************
​
#本脚本支持在线和离线安装
​
REDIS_VERSION=redis-7.2.5
#REDIS_VERSION=redis-7.2.4
#REDIS_VERSION=redis-7.2.3
#REDIS_VERSION=redis-7.2.1
#REDIS_VERSION=redis-7.0.11
#REDIS_VERSION=redis-7.0.7
#REDIS_VERSION=redis-7.0.3
#REDIS_VERSION=redis-6.2.6
#REDIS_VERSION=redis-4.0.14
​
PASSWORD=123456
​
INSTALL_DIR=/apps/redis
​
CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`
​
. /etc/os-release
​
color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}
​
​
prepare(){
    if [ $ID = "centos" -o $ID = "rocky" ];then
        yum  -y install gcc make jemalloc-devel systemd-devel
    else
        apt update 
        apt -y install  gcc make libjemalloc-dev libsystemd-dev
    fi
    if [ $? -eq 0 ];then
        color "安装软件包成功"  0
    else
        color "安装软件包失败,请检查网络配置" 1
        exit
    fi
}
​
install() {   
    if [ ! -f ${REDIS_VERSION}.tar.gz ];then
        wget http://download.redis.io/releases/${REDIS_VERSION}.tar.gz || { color "Redis 源码下载失败" 1 ; exit; }
    fi
    tar xf ${REDIS_VERSION}.tar.gz -C /usr/local/src
    cd /usr/local/src/${REDIS_VERSION}
    make -j $CUPS USE_SYSTEMD=yes PREFIX=${INSTALL_DIR} install && color "Redis 编译安装完成" 0 || { color "Redis 编译安装失败" 1 ;exit ; }
​
    ln -s ${INSTALL_DIR}/bin/redis-*  /usr/local/bin/
    
    mkdir -p ${INSTALL_DIR}/{etc,log,data,run}
  
    cp redis.conf  ${INSTALL_DIR}/etc/
​
    sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/'  -e "/# requirepass/a requirepass $PASSWORD"  -e "/^dir .*/c dir ${INSTALL_DIR}/data/"  -e "/logfile .*/c logfile ${INSTALL_DIR}/log/redis-6379.log"  -e  "/^pidfile .*/c  pidfile ${INSTALL_DIR}/run/redis_6379.pid" ${INSTALL_DIR}/etc/redis.conf
​
​
    if id redis &> /dev/null ;then 
         color "Redis 用户已存在" 1 
    else
         useradd -r -s /sbin/nologin redis
         color "Redis 用户创建成功" 0
    fi
​
    chown -R redis.redis ${INSTALL_DIR}
​
    cat >> /etc/sysctl.conf <<EOF
net.core.somaxconn = 1024
vm.overcommit_memory = 1
EOF
    sysctl -p 
    if [ $ID = "centos" -o $ID = "rocky" ];then
        echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
        chmod +x /etc/rc.d/rc.local
        /etc/rc.d/rc.local 
    else 
        echo -e '#!/bin/bash\necho never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
        chmod +x /etc/rc.local
        /etc/rc.local
    fi
​
​
cat > /lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
​
[Service]
ExecStart=${INSTALL_DIR}/bin/redis-server ${INSTALL_DIR}/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT \$MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000
​
[Install]
WantedBy=multi-user.target
​
EOF
     systemctl daemon-reload 
     systemctl enable --now  redis &> /dev/null 
     if [ $? -eq 0 ];then
         color "Redis 服务启动成功,Redis信息如下:"  0 
     else
        color "Redis 启动失败" 1 
        exit
     fi
     sleep 2
     redis-cli -a $PASSWORD INFO Server 2> /dev/null
}
​
prepare 
​
install 
​

五、一键安装MongoDB脚本

#!/bin/bash
#
#********************************************************************
#Author:            wangxiaochun
#QQ:                29308620
#Date:              2021-02-19
#Filename:          install_mongodb.sh
#URL:               http://www.wangxiaochun.com
#Description:       The test script
#Copyright (C):     2021 All rights reserved
#********************************************************************

MONGODB_VERSOIN=rhel80-5.0.3
#MONGODB_VERSOIN=rhel70-5.0.3
#MONGODB_VERSOIN=ubuntu1804-5.0.3
#MONGODB_VERSOIN=ubuntu1804-4.4.4

MONGODB_FILE=mongodb-linux-x86_64-${MONGODB_VERSOIN}.tgz
#MONGODB_FILE=mongodb-linux-x86_64-ubuntu1804-4.4.4.tgz
URL=https://fastdl.mongodb.org/linux/$MONGODB_FILE
MONGODB_DIR=/mongodb
INSTALL_DIR=/usr/local
PORT=27017
MY_IP=`hostname -I|awk '{print $1}'`

. /etc/os-release

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


system_prepare () {
    [ -e $MONGODB_DIR -o -e $INSTALL_DIR/mongodb ] && { color  "MongoDB 数据库已安装!" 1;exit; }
    if  [ $ID = "centos" -o $ID = "rocky" ];then
        rpm -q curl  &> /dev/null || yum install -y -q curl
    elif [ $ID = "ubuntu" ];then
        dpkg -l curl &> /dev/null || apt -y install curl
    else
        color  '不支持当前操作系统!' 1
        exit
    fi
    if [ -e /etc/rc.local ];then
        echo "echo never > /sys/kernel/mm/transparent hugepage/enabled" >> /etc/rc.local
    else
        cat > /etc/rc.local <<EOF
#!/bin/bash
echo never > /sys/kernel/mm/transparent hugepage/enabled
EOF
    fi
    chmod +x /etc/rc.local   
}

mongodb_file_prepare () {
    if [ ! -e $MONGODB_FILE ];then
        curl -O  $URL || { color  "MongoDB 数据库文件下载失败" 1; exit; } 
    fi
}

install_mongodb () {
    id mongod &> /dev/null || useradd -m -s /bin/bash mongod
    tar xf $MONGODB_FILE -C $INSTALL_DIR
    ln -s $INSTALL_DIR/mongodb-linux-x86_64-${MONGODB_VERSOIN} $INSTALL_DIR/mongodb
    #mongod --dbpath $db_dir --bind_ip_all --port $PORT --logpath $db_dir/mongod.log --fork
}

config_mongodb(){
    echo PATH=$INSTALL_DIR/mongodb/bin/:'$PATH' > /etc/profile.d/mongodb.sh
    . /etc/profile.d/mongodb.sh
    mkdir -p $MONGODB_DIR/{conf,data,log}
    cat > $MONGODB_DIR/conf/mongo.conf <<EOF
systemLog:
  destination: file
  path: "$MONGODB_DIR/log/mongodb.log"
  logAppend: true

storage:
  dbPath: "$MONGODB_DIR/data/"
  journal:
    enabled: true
 
processManagement:
  fork: true

net:
  port: 27017
  bindIp: 0.0.0.0
EOF
    chown -R  mongod.mongod $MONGODB_DIR/
    cat > /lib/systemd/system/mongod.service <<EOF
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
User=mongod
Group=mongod
ExecStart=$INSTALL_DIR/mongodb/bin/mongod --config $MONGODB_DIR/conf/mongo.conf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=$INSTALL_DIR/bin/mongod --config $MONGODB/conf/mongo.conf --shutdown
PrivateTmp=true
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
    systemctl enable --now  mongod &>/dev/null
}

start_mongodb() { 
    systemctl is-active mongod.service &>/dev/null
    if [ $?  -eq 0 ];then  
        echo 
        color "MongoDB 安装完成!" 0
    else
        color "MongoDB 安装失败!" 1
        exit
    fi 
}

system_prepare 
mongodb_file_prepare
install_mongodb
config_mongodb
start_mongodb

五、一键安装mongdb脚本

#!/bin/bash
#
#********************************************************************
#Author:            wangxiaochun
#QQ:                29308620
#Date:              2021-02-19
#Filename:          install_mongodb.sh
#URL:               http://www.wangxiaochun.com
#Description:       The test script
#Copyright (C):     2021 All rights reserved
#********************************************************************

MONGODB_VERSOIN=rhel80-5.0.3
#MONGODB_VERSOIN=rhel70-5.0.3
#MONGODB_VERSOIN=ubuntu1804-5.0.3
#MONGODB_VERSOIN=ubuntu1804-4.4.4

MONGODB_FILE=mongodb-linux-x86_64-${MONGODB_VERSOIN}.tgz
#MONGODB_FILE=mongodb-linux-x86_64-ubuntu1804-4.4.4.tgz
URL=https://fastdl.mongodb.org/linux/$MONGODB_FILE
MONGODB_DIR=/mongodb
INSTALL_DIR=/usr/local
PORT=27017
MY_IP=`hostname -I|awk '{print $1}'`

. /etc/os-release

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


system_prepare () {
    [ -e $MONGODB_DIR -o -e $INSTALL_DIR/mongodb ] && { color  "MongoDB 数据库已安装!" 1;exit; }
    if  [ $ID = "centos" -o $ID = "rocky" ];then
        rpm -q curl  &> /dev/null || yum install -y -q curl
    elif [ $ID = "ubuntu" ];then
        dpkg -l curl &> /dev/null || apt -y install curl
    else
        color  '不支持当前操作系统!' 1
        exit
    fi
    if [ -e /etc/rc.local ];then
        echo "echo never > /sys/kernel/mm/transparent hugepage/enabled" >> /etc/rc.local
    else
        cat > /etc/rc.local <<EOF
#!/bin/bash
echo never > /sys/kernel/mm/transparent hugepage/enabled
EOF
    fi
    chmod +x /etc/rc.local   
}

mongodb_file_prepare () {
    if [ ! -e $MONGODB_FILE ];then
        curl -O  $URL || { color  "MongoDB 数据库文件下载失败" 1; exit; } 
    fi
}

install_mongodb () {
    id mongod &> /dev/null || useradd -m -s /bin/bash mongod
    tar xf $MONGODB_FILE -C $INSTALL_DIR
    ln -s $INSTALL_DIR/mongodb-linux-x86_64-${MONGODB_VERSOIN} $INSTALL_DIR/mongodb
    #mongod --dbpath $db_dir --bind_ip_all --port $PORT --logpath $db_dir/mongod.log --fork
}

config_mongodb(){
    echo PATH=$INSTALL_DIR/mongodb/bin/:'$PATH' > /etc/profile.d/mongodb.sh
    . /etc/profile.d/mongodb.sh
    mkdir -p $MONGODB_DIR/{conf,data,log}
    cat > $MONGODB_DIR/conf/mongo.conf <<EOF
systemLog:
  destination: file
  path: "$MONGODB_DIR/log/mongodb.log"
  logAppend: true

storage:
  dbPath: "$MONGODB_DIR/data/"
  journal:
    enabled: true
 
processManagement:
  fork: true

net:
  port: 27017
  bindIp: 0.0.0.0
EOF
    chown -R  mongod.mongod $MONGODB_DIR/
    cat > /lib/systemd/system/mongod.service <<EOF
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
User=mongod
Group=mongod
ExecStart=$INSTALL_DIR/mongodb/bin/mongod --config $MONGODB_DIR/conf/mongo.conf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=$INSTALL_DIR/bin/mongod --config $MONGODB/conf/mongo.conf --shutdown
PrivateTmp=true
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
    systemctl enable --now  mongod &>/dev/null
}

start_mongodb() { 
    systemctl is-active mongod.service &>/dev/null
    if [ $?  -eq 0 ];then  
        echo 
        color "MongoDB 安装完成!" 0
    else
        color "MongoDB 安装失败!" 1
        exit
    fi 
}

system_prepare 
mongodb_file_prepare
install_mongodb
config_mongodb
start_mongodb