#!/bin/bash # 本脚本意在一键初始化Linux服务器的环境 ### 需要修改以下的内容 ### KUBERNETES_VERSION=1.18.9 DOCKER_VERSION=20.10.10 ### 需要修改以上的内容 ### CMD_INSTALL="" CMD_UPDATE="" CMD_REMOVE="" SOFTWARE_UPDATED=0 LinuxReleaseVersion="" LinuxRelease="" RED="31m" ## 姨妈红 GREEN="32m" ## 水鸭青 YELLOW="33m" ## 鸭屎黄 PURPLE="35m" ## 基佬紫 BLUE="36m" ## 天依蓝 BlinkGreen="32;5m" ##闪烁的绿色 BlinkRed="31;5m" ##闪烁的红色 BackRed="41m" ## 背景红色 SplitLine="----------------------" #会被sys函数中的方法重写 ######## 颜色函数方法很精妙 ############ colorEcho() { echo -e "\033[${1}${@:2}\033[0m" 1>&2 } check_root() { if [[ $EUID != 0 ]]; then colorEcho ${RED} "当前非root账号(或没有root权限),无法继续操作,请更换root账号!" colorEcho ${YELLOW} "使用sudo -命令获取临时root权限(执行后可能会提示输入root密码)" exit 1 fi } FunctionStart() { colorEcho ${PURPLE} ${SplitLine} colorEcho ${PURPLE} ${SplitLine} echo "" } FunctionSuccess() { colorEcho ${GREEN} ${SplitLine} echo "" } FunctionEnd() { echo "" colorEcho ${BlinkGreen} ${SplitLine} echo "" echo "" } # 判断命令是否存在 command_exists() { command -v "$@" >/dev/null 2>&1 } ####### 获取系统版本及64位或32位信息 check_sys() { # 获取当前终端的宽度,动态调整分割线的长度 shellwidth=$(stty size|awk '{print $2}') SplitLine=$(yes "-" | sed ${shellwidth}'q' | tr -d '\n') sys_bit=$(uname -m) case $sys_bit in i[36]86) os_bit="32" LinuxRelease="386" ;; x86_64) os_bit="64" LinuxRelease="amd64" ;; *armv6*) os_bit="arm" LinuxRelease="arm6" ;; *armv7*) os_bit="arm" LinuxRelease="arm7" ;; *aarch64* | *armv8*) os_bit="arm64" LinuxRelease="arm64" ;; *) colorEcho ${RED} " 哈哈……这个 辣鸡脚本 不支持你的系统。 (-_-) \n 备注: 仅支持 Ubuntu 16+ / Debian 8+ / CentOS 7+ 系统 " && exit 1 ;; esac ## 判定Linux的发行版本 if [ -f /etc/redhat-release ]; then LinuxReleaseVersion="centos" elif cat /etc/issue | grep -Eqi "debian"; then LinuxReleaseVersion="debian" elif cat /etc/issue | grep -Eqi "ubuntu"; then LinuxReleaseVersion="ubuntu" elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then LinuxReleaseVersion="centos" elif cat /proc/version | grep -Eqi "debian"; then LinuxReleaseVersion="debian" elif cat /proc/version | grep -Eqi "ubuntu"; then LinuxReleaseVersion="ubuntu" elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then LinuxReleaseVersion="centos" else LinuxReleaseVersion="" fi # 判断系统的包管理工具 apt, yum, or zypper getPackageManageTool() { if [[ -n $(command -v apt-get) ]]; then CMD_INSTALL="apt-get -y -qq install" CMD_UPDATE="apt-get -qq update" CMD_REMOVE="apt-get -y remove" elif [[ -n $(command -v yum) ]]; then CMD_INSTALL="yum -y -q install" CMD_UPDATE="yum -q makecache" CMD_REMOVE="yum -y remove" elif [[ -n $(command -v zypper) ]]; then CMD_INSTALL="zypper -y install" CMD_UPDATE="zypper ref" CMD_REMOVE="zypper -y remove" else return 1 fi return 0 } # 检查系统包管理方式,更新包 getPackageManageTool if [[ $? -eq 1 ]]; then colorEcho ${RED} "系统的包管理不是 APT or YUM, 请手动安装所需要的软件." return 1 fi ### 更新程序引索 if [[ $SOFTWARE_UPDATED -eq 0 ]]; then colorEcho ${BLUE} "正在更新软件包管理...可能花费较长时间…………" $CMD_UPDATE SOFTWARE_UPDATED=1 fi return 0 } ## 安装所需要的程序,及依赖程序 installDemandSoftwares() { for software in $@; do ## 安装该软件 if [[ -n $(command -v ${software}) ]]; then colorEcho ${GREEN} "${software}已经安装了...跳过..." echo "" else colorEcho ${BLUE} "正在安装 ${software}..." $CMD_INSTALL ${software} ## 判断该软件是否安装成功 if [[ $? -ne 0 ]]; then colorEcho ${RED} "安装 ${software} 失败。" colorEcho ${RED} "如果是重要软件,本脚本会自动终止!!" colorEcho ${PURPLE} "一般软件,本脚本会忽略错误并继续运行,请之后手动安装该程序。" return 1 else colorEcho ${GREEN} "已经成功安装 ${software}" FunctionSuccess echo "" fi fi done return 0 } shutdownFirewall() { ## 关闭防火墙、SElinux、Swap FunctionStart colorEcho ${BLUE} "开始关闭系统的防火墙…………" systemctl stop firewalld systemctl disable firewalld echo "" if [ ${LinuxReleaseVersion} = "centos" ]; then colorEcho ${GREEN} "当前系统的发行版为-- ${LinuxReleaseVersion}!!" FunctionSuccess colorEcho ${BLUE} "开始关闭SELinux……" setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config colorEcho ${GREEN} " SELinux关闭完成 " else colorEcho ${GREEN} "当前系统的发行版为-- ${LinuxReleaseVersion}!!" colorEcho ${GREEN} "无需关闭SELinux,现在 跳过" fi echo "" } disableSwap() { FunctionStart colorEcho ${BLUE} "开始关闭系统的虚拟内存…………" swapoff -a colorEcho ${GREEN} " 虚拟内存关闭完成 " echo "" colorEcho ${BLUE} "正在备份系统的文件系统表……" cp -f /etc/fstab /etc/fstab_bak colorEcho ${GREEN} " 备份完成 " echo "" colorEcho ${BLUE} "正在修改文件系统表,去除虚拟内存的部分……" cat /etc/fstab_bak | grep -v swap >/etc/fstab colorEcho ${GREEN} " 修改完成 " echo "" FunctionSuccess echo "" } ## 安装docker时,修改系统的配置文件 modifySystemConfig_Docker() { FunctionStart colorEcho ${BLUE} "开始修改系统内核参数…………" ## 配置内核参数 cat >/etc/sysctl.d/k8s.conf <>/etc/sysctl.d/k8s.conf < /dev/null colorEcho ${GREEN} " 添加成功 " echo "" fi colorEcho ${BLUE} "正在执行更新操作!!" apt-get update colorEcho ${GREEN} "----------更新完成----------" FunctionSuccess colorEcho ${BLUE} "可以安装的docker-ce的${dockerVersion}版本为:" colorEcho ${GREEN} "--------------------------------------------------------------" apt-cache madison docker-ce | grep -w ${dockerVersion} | awk '{print$3}' colorEcho ${GREEN} "--------------------------------------------------------------" echo "" colorEcho ${GREEN} "开始安装docker-ce,版本为${DOCKER_VERSION}" realDockerSTag=$(apt-cache madison docker-ce-cli | grep -w ${dockerVersion} | awk '{print$3}' | grep ${DOCKER_VERSION}) echo "real docker version is $realDockerSTag" installDemandSoftwares "docker-ce-cli=${realDockerSTag}" "docker-ce=${realDockerSTag}" containerd.io || return $? fi echo "" colorEcho ${GREEN} "----------安装完成----------" FunctionSuccess colorEcho ${BLUE} "正在启动docker的服务进程…………" systemctl enable docker.service systemctl start docker.service colorEcho ${GREEN} "----------启动完成----------" echo "" FunctionEnd } InstallDockerCompose() { FunctionStart colorEcho ${PURPLE} "正在下载 +++++++++++++ docker-compose文件 ++++++++++++++" # curl -L "https://github.com.cnpmjs.org/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" \ # -o /usr/local/bin/docker-compose local dockerComposeOssUrl="https://b2.107421.xyz/docker-compose-linux-x86_64-v2.18.0" curl -L "${dockerComposeOssUrl}" \ -o /usr/local/bin/docker-compose if [[ -e /usr/local/bin/docker-compose ]]; then colorEcho ${BLUE} "docker-compose文件下载成功!!" echo "" chmod +x /usr/local/bin/docker-compose docker-compose --version &>/dev/null if [[ $? -eq 0 ]]; then colorEcho ${GREEN} "docker-compose安装成功!!版本为$(docker-compose --version | cut -d" " -f3)尽情享用" else ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose fi else colorEcho ${RED} "docker-compose文件下载失败!! 无法访问github的资源。。" colorEcho ${RED} "请手动下载docker-compose的安装文件!" fi FunctionEnd } installKubernetes() { ### 国内的环境 ### ## 添加kubernetes的yum源 FunctionStart colorEcho ${BLUE} "开始安装kubernetes的相关组件…………" echo "" colorEcho ${GREEN} "当前系统的发行版为-- ${LinuxReleaseVersion}!!" echo "" if [[ ${LinuxReleaseVersion} == "centos" ]]; then colorEcho ${BLUE} "添加kubepernetes的yum源--国内的阿里云源!!" cat </etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF colorEcho ${GREEN} "----------添加完成----------" else installDemandSoftwares apt-transport-https curl colorEcho ${BLUE} "开始添加国内的阿里云源的kubernetes的apt-key……" curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add echo "" colorEcho ${BLUE} "开始添加国内的阿里云源的kubernetes的apt源……" cat </etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF colorEcho ${GREEN} "----------添加完成----------" colorEcho ${BLUE} "开始添加国内的阿里云源的kubernetes的apt源……" colorEcho ${BLUE} "开始执行apt update 操作……" apt-get update colorEcho ${GREEN} "--------------------------------------------------------------" fi echo "" colorEcho ${BLUE} "开始安装 kubelet-${KUBERNETES_VERSION} kubeadm-${KUBERNETES_VERSION} kubectl-${KUBERNETES_VERSION}" installDemandSoftwares kubelet-${KUBERNETES_VERSION} kubeadm-${KUBERNETES_VERSION} kubectl-${KUBERNETES_VERSION} || return $? colorEcho ${GREEN} "----------k8s的相关组件安装完成----------" FunctionSuccess FunctionEnd } ## 对外暴露的安装Redis的主函数 InstallRedis(){ FunctionStart RedisPort="6379" RedisInstallMethod="binary" RedisInstallHelp="0" while [[ $# > 0 ]]; do case "$1" in -p|--port) RedisPort="${2}" shift # past argument ;; -m|--method) RedisInstallMethod="${2}" shift # past argument ;; -h|--help) RedisInstallHelp="1" ;; *) echo "输入的内容有误,请检查!" # unknown option ;; esac shift # past argument or value done if [ "${RedisInstallHelp}" -eq "1" ]; then cat - 1>& 2 << EOF ./install-release.sh [-h] [-p|--port 6379] [-m|--method binary|docker] -h, --help 打印此安装帮助说明 -p, --port 安装Redis的端口,如果不指定此参数,则默为6379 -m, --method 安装Redis的方式,binary == 源码编译安装,docker == 使用docker安装;不指定则使用binary EOF fi # echo $RedisPort # echo $RedisInstallMethod if [[ ${RedisInstallMethod} == "binary" ]]; then installRedisBinary ${RedisPort} else installRedisDocker ${RedisPort} fi FunctionEnd } installRedisBinary() { RedisPort="" if [[ "$1" -ne " " ]]; then RedisPort="$1" echo "Redis Port = ${RedisPort}" fi echo "InstallRedisBinary" CMD_REMOVE gcc installDemandSoftwares gcc wget echo "开始下载 Redis 6.2.6 的二进制包!" wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/redis-6.2.6.tar.gz if [ -e redis-6.2.6.tar.gz ]; then echo "redis源码包下载完成!" echo "" echo "开始解压缩redis的安装包!" tar -zvxf redis-6.2.6.tar.gz cd redis-6.2.6 clear echo "" echo "" echo "开始执行编译安装过程!!" echo "开始执行编译安装过程!!" echo "开始执行编译安装过程!!" echo "取决于服务器的性能,可能花费较长的时间!!!" sleep 3 echo "" ./configure make && make install cd redis-6.2.6 echo "Redis已经安装成功!!" ehco "开始进行redis的配置修改!!" wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/redis-6.2.6.conf wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/redis-server-6.2.6.service if [ -e redis-6.2.6.conf ] && [ -e redis-server-6.2.6.service ]; then echo "redis配置文件下载成功,开始进行修改!!" echo "" touch /var/log/redis_${RedisPort}.log mkdir -p /var/redis/${RedisPort} mkdir -p /etc/redis/ sed -i "s/RedisPort/${RedisPort}/g" redis-6.2.6.conf cp redis-6.2.6.conf /etc/redis/${RedisPort}.conf sed -i "s/RedisPort/${RedisPort}/g" redis-server-6.2.6.service cp redis-server-6.2.6.service /etc/init.d/redisd cd /etc/init.d chmod +x /etc/init.d/redisd if [ command_exists chkconfig ]; then chkconfig redisd on elif [ command_exists update-rc.d ]; then update-rc.d redisd defaults else echo "所需要的守护程序未安装,请手动设置!!" fi # 启动程序 echo "" echo "开始启动redis-server服务……" service redisd start service redisd status netstat -ntlp | grep redis else echo "redis配置文件下载失败!!请手动进行修改!!" return 3 fi else echo "redis源码包下载失败!" return 3 fi } installRedisDocker(){ RedisPort="" if [[ "$1" -ne " " ]]; then RedisPort="$1" echo "Redis Port = ${RedisPort}" fi echo "InstallRedisDocker" echo "" if [ ! command_exists "docker info" ]; then colorEcho ${RED} "docker 未安装!! 无法使用docker的方式安装 redis!" return 3 fi echo "## 为redis配置添加 ">>/etc/sysctl.conf echo "vm.overcommit_memory = 1">>/etc/sysctl.conf sysctl -p /etc/sysctl.conf echo "开始启动docker-redis !!" # https://hub.docker.com/r/bitnami/redis#configuration # 为redis设置密码 -e REDIS_PASSWORD=v2ryStr@ngPa.ss \ docker run -d \ -e ALLOW_EMPTY_PASSWORD=yes \ -e REDIS_AOF_ENABLED=no \ -e REDIS_PORT_NUMBER=${RedisPort} \ --name redis-server \ --network host \ bitnami/redis:6.2.6 } InstallMysql(){ FunctionStart MysqlPort="3306" MysqlInstallMethod="binary" MysqlInstallHelp="0" MysqlPersistData="/var/lib/docker/mysql-data" colorEcho ${BLUE} "本脚本默认安装版本为 8.0.27 的MySQL !!" colorEcho ${BLUE} "本脚本默认安装版本为 8.0.27 的MySQL !!" colorEcho ${BLUE} "本脚本默认安装版本为 8.0.27 的MySQL !!" while [[ $# > 0 ]]; do case "$1" in -p|--port) MysqlPort="${2}" shift # past argument ;; -m|--method) MysqlInstallMethod="${2}" shift # past argument ;; -d|--data) MysqlPersistData="${2}" shift # past argument ;; -h|--help) MysqlInstallHelp="1" ;; *) echo "输入的内容有误,请检查!" # unknown option ;; esac shift # past argument or value done if [ "${MysqlInstallHelp}" -eq "1" ]; then cat - 1>& 2 << EOF ./install-release.sh [-h] [-p|--port 3306] [-m|--method binary|docker] -h, --help 打印此安装帮助说明 -p, --port 安装Mysql的端口,如果不指定此参数,则默为3306 -m, --method 安装Mysql的方式,binary == 源码编译安装,docker == 使用docker安装;不指定则使用binary EOF return 0 fi # echo $MysqlPort # echo $MysqlInstallMethod if [[ ${MysqlInstallMethod} == "binary" ]]; then installMysqlBinary ${MysqlPort} else installMysqlDocker ${MysqlPort} ${MysqlPersistData} fi FunctionEnd } installMysqlBinary() { MysqlPort="" Latest_Mysql_Version="" if [[ "$1" -ne " " ]]; then MysqlPort="$1" echo "mysql Port = ${MysqlPort}" fi echo "InstallMysqlBinary" if [[ "${LinuxReleaseVersion}" == "centos" ]]; then colorEcho ${BLUE} "当前系统发行版为 centos !" colorEcho ${BLUE} "开始安装mysql官方的yum源!!" echo "" rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm colorEcho ${BLUE} "可以安装的 mysql-server 版本为:" yum list mysql-community-server | grep mysql-community-server echo "" Latest_Mysql_Version=$(yum list mysql-community-server | grep mysql-community-server | awk '{print $2}' ) colorEcho ${BLUE} "开始安装最新版本:" installDemandSoftwares mysql-community-server-${Latest_Mysql_Version} mysql-community-server-${Latest_Mysql_Version} else colorEcho ${BLUE} "当前系统发行版为 ubuntu/debain !" colorEcho ${BLUE} "可以安装的 mysql-server 版本为:" apt-cache madison mysql-server | awk '{print$3}' echo "" Latest_Mysql_Version=$(apt-cache madison mysql-server | head -n 1 | awk '{print$3}') colorEcho ${BLUE} "开始安装最新版本:${Latest_Mysql_Version}" installDemandSoftwares mysql-server=${Latest_Mysql_Version} mysql-client=${Latest_Mysql_Version} fi FunctionSuccess colorEcho ${BLUE} "准备启动Mysql Server的服务 !!!" systemctl start mysqld FunctionSuccess colorEcho ${BLUE} "准备配置Mysql 服务的开机启动 !!!" systemctl enable mysqld FunctionSuccess } installMysqlDocker(){ MysqlPort="" MysqlPersistData="" MysqlPort="$1" echo "mysql Port = ${MysqlPort}" MysqlPersistData="$2" echo "mysql persist data path = ${MysqlPersistData}" echo "InstallMysqlDocker" echo "" echo "开始启动docker-mysql !!" # https://hub.docker.com/r/bitnami/mysql#configuration # 需要准备一个目录方式 mysql.conf文件 # 目录权限需要处理 mkdir -p ${MysqlPersistData} chown -R 1001:1001 ${MysqlPersistData} docker run -d \ -e MYSQL_ROOT_USER=root \ -e MYSQL_ROOT_PASSWORD=v2ryStr@ngPa.ss \ -e MYSQL_CHARACTER_SET=utf8mb4 \ -e MYSQL_COLLATE=utf8mb4_bin \ -e MYSQL_DATABASE=demo \ -e MYSQL_USER=wdd \ -e MYSQL_PASSWORD=wdd14Fk@Clever \ -e MYSQL_PORT_NUMBER=${MysqlPort} \ -e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \ -v ${MysqlPersistData}:/bitnami/mysql/data \ --name mysql-server \ --network host \ bitnami/mysql:8.0.27-debian-10-r40 } ## 对外暴露的安装JDK的主函数 InstallJDK(){ FunctionStart JDK_VERSION="11" JDK_Install_Method="binary" JDKInstallHelp="0" while [[ $# > 0 ]]; do case "$1" in -v|--version) JDK_VERSION="${2}" shift # past argument ;; -m|--method) JDK_Install_Method="${2}" shift # past argument ;; -h|--help) JDKInstallHelp="1" ;; *) echo "输入的内容有误,请检查!" # unknown option ;; esac shift # past argument or value done if [ "${JDKInstallHelp}" -eq "1" ]; then cat - 1>& 2 << EOF ./install-release.sh [-h] [-p|--Version 6379] [-m|--method binary|docker] -h, --help 打印此安装帮助说明 -v, --version 安装JDK的版本,如果不指定此参数,则默为11 -m, --method 安装JDK的方式,binary == 源码编译安装,package == 使用源,package安装;不指定则使用binary EOF return 0 fi # echo $JDKVersion # echo $JDKInstallMethod if [[ ${JDK_Install_Method} == "binary" ]]; then installJDKBinary ${JDK_VERSION} else installJDKPackage ${JDK_VERSION} fi FunctionEnd } installJDKBinary() { JDK_VERSION="" JDK_FILENAME="" if [[ "$1" -ne " " ]]; then JDK_VERSION="$1" echo "JDK Version = ${JDK_VERSION}" fi echo "InstallJDKBinary" echo "" echo "开始下载 JDK 的源码包!!" mkdir -p /usr/local/java/ if [ "${JDK_VERSION}" -eq "11" ]; then JDK_FILENAME="jdk-11.0.9" wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/jdk-11.0.9_linux-x64_bin.tar.gz echo "JDK 二进制文件下载成功,开始解压缩!!" tar -zxvf jdk-11.0.9_linux-x64_bin.tar.gz -C /usr/local/java/ else JDK_FILENAME="jdk1.8.0_271" wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/jdk-8u271-linux-x64.tar.gz echo "JDK 二进制文件下载成功,开始解压缩!!" tar -zxvf jdk-8u271-linux-x64.tar.gz -C /usr/local/java/ fi echo "" echo "开始配置JDK的环境变量!!!" if [ -e /etc/profile.d/jdk-env.sh ]; then echo "jdk的配置文件已经存在!,将会进行覆盖操作!" cp /etc/profile.d/jdk-env.sh .jdk-env-backup.sh rm /usr/bin/java fi cat >/etc/profile.d/jdk-env.sh <> $i 秒 <<-,准备切换shell,上文的日志输出将会消失!!" sleep 2 done chsh -s /bin/zsh zsh else colorEcho ${RED} "zsh 安装失败,大概率是已经安装!!小概率是无法连接GitHub服务器~~" fi FunctionEnd } modifyZSH() { FunctionStart ZSH_SOURCE="cn" if [[ "$1" -ne " " ]]; then ZSH_SOURCE="$1" echo "zsh install source = ${ZSH_SOURCE}" fi colorEcho ${GREEN} "zsh应该已经安装成功!!!" colorEcho ${BLUE} "开始修改zsh的相关配置信息,使其更加好用…………" echo "" cat >~/oh-my-zsh-plugins-list.txt <>/etc/docker/daemon.json <