天天看点

一个脚本实现Centos-Ubuntu自动化批量部署zabbix-agent2并自动修改配置文件

1. 脚本介绍

1.1 使用场景

  • Zabbix-Server为5.0版本(可通过修改脚本自定义)
  • 操作系统版本为centos6、centos7、ubuntu14、ubuntu18、ubuntu20的Linux服务器(可自行修改脚本添加)
  • 未配置zabbix-agent2的Linux主机自动化部署zabbix-agent2
  • 集群节点批量自动部署zabbix-agent2

1.2 脚本功能

  • 脚本自动识别Linux操作系统发行版,安装对应的Zabbix软件源并安装zabbix-agent2
  • 支持操作系统发行版:centos6、centos7、ubuntu14、ubuntu18、ubuntu20(ubuntu14不支持agent2因此部署agent)
  • 自动修改zabbix-agent2配置文件里的Server、ServerActive配置部分,即自动修改agent2被动模式和主动模式的Zabbix-Server服务器的IP地址

1.3 配置文件实例:

一个脚本实现Centos-Ubuntu自动化批量部署zabbix-agent2并自动修改配置文件
一个脚本实现Centos-Ubuntu自动化批量部署zabbix-agent2并自动修改配置文件

2. 使用方法

脚本名称:auto_deployment_zabbix_agent2.sh

2.1 直接运行脚本

./auto_deployment_zabbix_agent2.sh
           
一个脚本实现Centos-Ubuntu自动化批量部署zabbix-agent2并自动修改配置文件

脚本会使用默认配置的IP来修改zabbix-agent的配置文件,如需自定义,修改ZABBIX_SERVER_DEFAULT_HOST变量的值即可

一个脚本实现Centos-Ubuntu自动化批量部署zabbix-agent2并自动修改配置文件

2.2 带IP地址运行脚本

./auto_deployment_zabbix_agent2.sh 192.168.222.200
           
一个脚本实现Centos-Ubuntu自动化批量部署zabbix-agent2并自动修改配置文件

3. 运行案例

3.1 直接运行脚本

./auto_deployment_zabbix_agent2.sh 
           
一个脚本实现Centos-Ubuntu自动化批量部署zabbix-agent2并自动修改配置文件
自动部署完zabbix-agent程序并修改配置Server的IP地址为脚本设置的ZABBIX_SERVER_DEFAULT_HOST变量值(192.168.222.137)

3.2 带IP地址运行脚本

./auto_deployment_zabbix_agent2.sh 192.168.222.200
           

4. 脚本源代码

#!/bin/bash
#--------------------------------------------------------------------------------------------------
#Author:cosann
#Script_Name:auto_deployment_zabbix_agent2.sh
#Script_Function:自动化部署Zabbix-agent2
#Version:2.0
#Create_Date:20220916
#Update_Date:20220917
#Description:
#1.自动化安装zabbix-agent2(ubuntu14安装agent)
#2.自动修改agent配置文件;脚本预先设置了默认的Zabbix-Server IP地址,可通过修改全局变量ZABBIX_SERVER_DEFAULT_HOST的值定义默认IP
#3.脚本会检测操作系统发现版本,根据不同的发行版本下载zabbix软件源
#4.配置默认的Zabbix-Server批量自动化部署Zabbix-agent
#Update_Description:
#1.增加判断逻辑
#2.优化输出信息
#3.修正子进程未能退出脚本bug
#---------------------------------------------------------------------------------------------------



#----------------------------------------------全局变量----------------------------------------------
OS_NAME=                                                #Linux发行版名称
OS_VERSION=                                             #操作系统版本信息
ZAABIX_CONFINA_NAME=()                                  #接收函数返回的配置名和完整配置名的数组变量
ZABBIX_CONFIGNAME=                                      #zabbix-agent配置文件名
ZABBIX_COMPLETE_CONFIGNAME=                             #zabbix-agent完整配置文件名
ZABBIX_SERVER_DEFAULT_HOST="192.168.222.137"            #让脚本自动运行时指定目标zabbix-server修改该处变量值
ZABBIX_SERVER_HOST=${1-$ZABBIX_SERVER_DEFAULT_HOST}     #若为传入位置参数$1,使用脚本默认定义的ZABBIX_SERVER_DEFAULT_HOST作为Zabbix服务器IP
AGENT_NAME=                                             #安装的agent名字
PARAMETER_SUM=$#                                        #位置参数数量
SCRIPTNAME=$0

#----------------------------------------------函数定义----------------------------------------------
#传参检测
parameter_judge(){
    #位置参数大于等于2时退出脚本并提示
    if [ $PARAMETER_SUM -ge 2 ];then echo "Usage:$0 zabbix_server_host_ip(option)" && exit ;fi

}

os_release_judge(){
    #判断操作系统发行版,返回发行版信息
    local osname
    local osname_result
    osname=`sudo cat /proc/version`
    if [[ $osname =~ "Red" ]];then osname_result="Centos";elif [[ $osname =~ "Ubuntu" ]];then osname_result="Ubuntu";fi
    echo $osname_result
}

#判断操作系统版本
os_version_judge(){
    #使用一个数组存储操作系统版本和位数信息
    #osversion_digits[0]:操作系统发行版版本,Centos5、Centos6、Centos7;Ubuntu14,Ubuntu20...
    #osversion_digits[1]:操作系统位数,32位,64位
    local osversion_digits
    osversion_digits=()

    osversion_digits[0]=`sudo cat /etc/os-release | sed -nr 's/^VERSION_ID="?([0-9]+).?.*/\1/p'`
    osversion_digits[1]=`sudo uname -a | awk '{print $14}'`
    if [[ ${osversion_digits[1]} =~ "64" ]];then osversion_digits[1]="64";elif [[ ${osversion_digits[1]} =~ "32" ]];then osversion_digits[1]="32";fi
    echo "${osversion_digits[@]}"
}

#判断zabbix-agent是否已经安装
zabbix_agent_installed_judge(){
    #位置参数传入OS发行版信息,调用对应发行版软件函数检查zabbix-agent软件信息和是否已经安装
    local os

    os=$1
    if [ -z $os ];then echo "OS_NAME is error" && exit; fi 
    #根据发行版调用对应软件检查函数
    case "$os" in 
    "Centos" ) centos::installed_judge ;;
    "Ubuntu" ) ubuntu::installed_judge ;;
    * ) echo "!!! No operating system distribution information was matched" ;;
    esac
}

#centos软件检查函数
centos::installed_judge(){
    #检查软件是否安装, installed显示结果退出脚本,未安装调用安装函数
    local agent_installed_result
    local zabbix_agent_ver

    #检查是否安装zabbix-agent
    sudo rpm -qa | grep zabbix-agent &> /dev/null 
    agent_installed_result=`echo $?`
    #获取agent版本号
    zabbix_agent_ver=`sudo rpm -qa | grep zabbix-agent | sed -r 's/\w+-(\w+2?)-.*/\1/'`
    if [ $agent_installed_result -eq 0 ];then 
        echo ">> zabbix-$zabbix_agent_ver installed" 
    else
        echo -e "\033[31m>> zabbix-agent未安装"'!!!!'"\033[0m"
        #传入OS操作系统发行版版本信息,调用对应的安装函数安装zabbix-agent
        centos::zabbix_agent_install ${OS_VERSION[0]} 
    fi
}

#ubuntu软件检查函数
ubuntu::installed_judge(){
    #检查软件是否安装, installed显示结果退出脚本,未安装调用安装函数
    local agent_installed_result
    local zabbix_agent_ver

    #检查是否安装zabbix-agent
    sudo dpkg -s zabbix-agent &> /dev/null
    agent_installed_result=`echo $?`
    #获取agent版本号
    zabbix_agent_ver=`sudo apt-cache show zabbix-agent &> /dev/null | awk 'NR==1{print $2}'`
    if [ $agent_installed_result -eq 0 ];then 
        echo ">> $zabbix_agent_ver installed" 
    else 
        echo -e "\033[0m>> zabbix-agent未安装"'!!!!'"\033[0m"
        #传入OS操作系统发行版版本信息,调用对应的安装函数安装zabbix-agent
        ubuntu::zabbix_agent_install ${OS_VERSION[0]} 
    fi
}

#centos软件安装函数
centos::zabbix_agent_install(){
    #下载软件源并安装agent
    local os_version 

    os_version=$1
    echo -e "\n====== Starting to Install the Zabbix-agent ======"
    if [ -z $os_version ];then echo ">> An error occurred during the installation of ZABBIx-Agent, not knowing the operating system distribution information" && exit 1;fi 
    case "$os_version" in
        "6" )
            if [ ! -d "/tmp" ];then sudo mkdir /tmp ;fi
            cd /tmp
            if [ ! -e "/etc/yum.repos.d/zabbix.repo" ];then
            echo "------Start downloading the Zabbix software source-----"
            sudo rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/6/x86_64/zabbix-release-5.0-1.el6.noarch.rpm &> /dev/null 
            if [ $? -ne 0 ];then echo "zabbix软件源下载失败,请检查!!!" && exit 1 ;fi 
            fi 

            sudo yum clean all &> /dev/null
            echo "------The system starts to download the Zabbix-Agent2 software------"
            echo ">> The Zabbix-agent2 is being installed. Please wait..."
            sudo yum install -y zabbix-agent2 &> /dev/null 
            if [ $? -ne 0 ];then echo "yum安装zabbix-agent2下载失败,请检查!!!" && exit 1 ;else echo -e "\n>> zabbix-agent2 installed";fi 
            cd -
        ;;

        "7" )
            if [ ! -d "/tmp" ];then sudo mkdir /tmp ;fi
            cd /tmp
            if [ ! -e "/etc/yum.repos.d/zabbix.repo" ];then
            echo "------Start downloading the Zabbix software source-----"
            sudo rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm &> /dev/null 
            if [ $? -ne 0 ];then echo "zabbix软件源下载失败,请检查!!!" && exit 1 ;fi 
            fi 
 
            sudo yum clean all &> /dev/null
            echo "------The system starts to download the Zabbix-Agent2 software------"
            echo ">> The Zabbix-agent2 is being installed. Please wait..."
            sudo yum install -y zabbix-agent2 &> /dev/null 
            if [ $? -ne 0 ];then echo "yum安装zabbix-agent2下载失败,请检查!!!" && exit 1 ;else echo -e "\n>> zabbix-agent2 installed";fi 
            cd -
        ;;
        "*" ) echo "os_version=$os_version,无法检测对应操作系统信息!" ;;
    esac
}

#ubuntu软件安装函数
ubuntu::zabbix_agent_install(){
    #下载软件源并安装agent
    local os_version 

    os_version=$1
    echo -e "\n====== Starting to Install the Zabbix-agent ======"
    if [ -z $os_version ];then echo ">> An error occurred during the installation of ZABBIx-Agent, not knowing the operating system distribution information" && exit 1;fi 
    case "$os_version" in
        "14" )
            #ubuntu14安装zabbix-agent
            if [ ! -d "/tmp" ];then sudo mkdir /tmp ;fi
            cd /tmp
            echo "------Start downloading the Zabbix software source-----"
            sudo wget --no-check-certificate https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1%2Btrusty_all.deb &> /dev/null 
            if [ $? -ne 0 ];then echo "zabbix软件源下载失败,请检查!!!" && exit 1;fi 
            echo "------The system starts to download the Zabbix-Agent2 software------"
            echo ">> The Zabbix-agent is being installed. Please wait..."
            sudo dpkg -i zabbix-release_5.0-1+trusty_all.deb &> /dev/null
            sudo apt update &> /dev/null
            sudo apt install -y zabbix-agent &> /dev/null 
            if [ $? -ne 0 ];then echo "apt安装zabbix-agent下载失败,请检查!!!" && exit 1 ;else echo -e "\n>> Zabbix-agent installed";fi 
            cd -
        ;;
        "18" )
            if [ ! -d "/tmp" ];then sudo mkdir /tmp ;fi
            cd /tmp
            echo "------Start downloading the Zabbix software source-----"
            sudo wget --no-check-certificate https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1%2Bbionic_all.deb &> /dev/null 
            if [ $? -ne 0 ];then echo "zabbix软件源下载失败,请检查!!!" && exit 1;fi 
            echo "------The system starts to download the Zabbix-Agent2 software------"
            echo ">> The Zabbix-agent2 is being installed. Please wait..."
            sudo dpkg -i zabbix-release_5.0-1+bionic_all.deb &> /dev/null
            sudo apt update &> /dev/null
            sudo apt install -y zabbix-agent &> /dev/null 
            if [ $? -ne 0 ];then echo "apt安装zabbix-agent下载失败,请检查!!!" && exit 1 ;else echo -e "\n>> Zabbix-agent installed";fi
            cd -
        ;;
        "20" )
            if [ ! -d "/tmp" ];then sudo mkdir /tmp ;fi
            cd /tmp
            echo "------Start downloading the Zabbix software source-----"
            sudo wget --no-check-certificate https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1%2Bfocal_all.deb &> /dev/null 
            if [ $? -ne 0 ];then echo "zabbix软件源下载失败,请检查!!!" && exit 1;fi 
            echo "------The system starts to download the Zabbix-Agent2 software------"
            echo ">> The Zabbix-agent2 is being installed. Please wait..."
            sudo dpkg -i zabbix-release_5.0-1+focal_all.deb &> /dev/null
            sudo apt update &> /dev/null
            sudo apt install -y zabbix-agent2 &> /dev/null 
            if [ $? -ne 0 ];then echo "apt安装zabbix-agent下载失败,请检查!!!" && exit 1 ;else echo -e "\n>> Zabbix-agent installed";fi
            cd -
        ;;

        "*" ) echo "os_version=$os_version,无法检测对应操作系统信息!" ;;
    esac
}

#获取zabbix-agent配置文件信息函数
zabbix_agent_config_name_get(){
    #判断获取配置文件名称和含文件的
    local congfigname_arr
    local config_dir
    local config_file_name
    local config_file_num

    congfigname_arr=( )
    
    config_dir="/etc/zabbix"
    #判断配置文件目录是否存在
    if [ ! -d "$config_dir" ];then return 100 ;fi

    #判断配置文件是否存在,若文件数量不为1提示信息并退出脚本
    config_file_num=$(sudo find /etc/zabbix/ -name "zabbix_agent*.conf"| wc -l)
    if [ ! "$config_file_num" -eq 1 ];then return 200 ;fi
    
    
    config_file_name=$(sudo find /etc/zabbix/ -name "zabbix_agent*.conf")
    config_file_name=${config_file_name##/*/}
    #判断配置文件是否为空
    if [ ! -s  `sudo find /etc/zabbix/ -name "zabbix_agent*.conf"` ];then return 44 ;fi 
    #配置文件名
    congfigname_arr[0]=`sudo find /etc/zabbix/ -name "zabbix_agent*.conf" | xargs basename `
    #完整路径配置文件名
    congfigname_arr[1]=`sudo find /etc/zabbix/ -name "zabbix_agent*.conf"`

    #返回配置文件名和完整路径配置文件名
    echo ${congfigname_arr[@]}
}

#修改配置文件
zabbix_config_mod(){
    #接收位置参数获得配置文件信息,修改配置文件内容
    local config_name
    local config_ipaddress_1
    local config_ipaddress_2

    #接受位置参数,将位置参数赋值给局部变量的数组
    config_name=(`echo $1`)          
    if [ -z ${config_name[0]} -o -z ${config_name[1]} ];then echo -e "\033[31m>> config_name参数在函数调用过程中出错,请检查zabbix_agent_config_name_get函数"'!!!'"\033[0m" && exit 1
    else
        config_ipaddress_1=`sudo egrep "^Server=[0-9]+.[0-9]+.[0-9]+.[0-9]+" ${config_name[1]} | awk -F"=" '{print $2}'`
        if [ $? -ne 0 ];then  echo -e "\033[31m>> 配置文件出错,请检查"'!!!'"\033[0m" && exit 1; fi 
        config_ipaddress_2=`sudo egrep "^ServerActive=[0-9]+.[0-9]+.[0-9]+.[0-9]+" ${config_name[1]} | awk -F"=" '{print $2}'`
        if [ $? -ne 0 ];then  echo -e "\033[31m>> 配置文件出错,请检查"'!!!'"\033[0m" && exit 1; fi 
        sudo sed -i '/^Server=/s/'"$config_ipaddress_1"'/'"$ZABBIX_SERVER_HOST"'/' ${config_name[1]} 
        if [ $? -ne 0 ];then  echo -e "\033[31m>> 配置文件出错,请检查"'!!!'"\033[0m" && exit 1; fi 
        sudo sed -i '/^ServerActive=/s/'"$config_ipaddress_2"'/'"$ZABBIX_SERVER_HOST"'/' ${config_name[1]}
        if [ $? -ne 0 ];then  echo -e "\033[31m>> 配置文件出错,请检查"'!!!'"\033[0m" && exit 1; fi 
    fi 
}

#centos-zabbix-agent服务控制
centos::zabbix_agent_run(){
    sudo systemctl restart zabbix-agent2 &> /dev/null;if [ $? -ne 0 ];then echo -e "\033[31m>> 服务启动失败,请检查"'!!!'"\033[0m";fi 
    sudo systemctl enable zabbix-agent2  &> /dev/null;if [ $? -ne 0 ];then echo -e "\033[31m>> 服务启动失败,请检查"'!!!'"\033[0m";fi 
}

#ubuntu-zabbix-agent服务控制
ubuntu::zabbix_agent_run(){
    sudo service zabbix-agent restart &> /dev/null;if [ $? -ne 0 ];then echo -e "\033[31m>> 服务启动失败,请检查"'!!!'"\033[0m";fi 
    sudo update-rc.d zabbix-agent enable &> /dev/null;if [ $? -ne 0 ];then echo -e "\033[31m>> 服务启动失败,请检查"'!!!'"\033[0m";fi 
}

#控制函数
main(){

    clear
    #1.调用传参函数进行位置参数判断
    echo -e "====== start ${SCRIPTNAME##.*/} script ======"
    parameter_judge

    #2.调用Linux发行版判断函数将返回的结果赋值给全局变量OS_NAME
    OS_NAME=`os_release_judge`

    #3.调用Linux操作系统版本判断函数将返回的数组结果赋值给全局变量数组OS_VERSION
    OS_VERSION=(`os_version_judge`)
    echo ">> 当前的操作系统版本:$OS_NAME-${OS_VERSION[0]}-${OS_VERSION[1]}"
    
    #4.输出当前操作系统环境Selinux和Firewall状态信息
    echo -e "\n====== The system starts to check the operating system environment ======"
    if [ $OS_NAME == "Centos" ];then
        echo -e ">> Current system Time: $( date "+%Y-%m-%d %T")"
        echo -e ">> Selinux State:  $(sudo getenforce)"
        echo -n ">> Firewall State:"
        echo -e "  $(sudo firewall-cmd --state)"
    
    elif [ $OS_NAME == "Ubuntu" ];then
        echo -e ">> Current system Time: $( date "+%Y-%m-%d %T")"
    fi

    #5.安装zabbix_agent
    echo -e "\n====== The system starts checking the Zabbix-agent ======"
    #将OS发行版信息传参给安装函数进行软件测试是否安装
    zabbix_agent_installed_judge $OS_NAME
    #if [ $? -ne 0 ];then exit 1;fi
    
    #6.zabbix_agent_config_name_get函数检测配置文件是否正确存在
    echo -e "\n====== The system starts to check the zabbix-agent configuration file ======"
    zabbix_agent_config_name_get &> /dev/null
    case "$?" in
    100 ) echo -e "\033[31m>> /etc/zabbix配置文件目录不存在,请确认"'!!!'"\033[0m" && exit 1 ;;
    200 ) echo -e "\033[31m>> zabbix-agent配置文件错误,请检查配置文件是否存在或存在多个配置文件"'!!!'"\033[0m" && exit 1 ;;
    44 ) echo -e "\033[31m>> zabbix-agent配置文件异常,请检查配置文件是否正确"'!!!'"\033[0m" && exit 1 ;;
    * ) ;;
    esac
    # if [ $? -eq 100 ];then
    #     echo -e "\033[31m>> /etc/zabbix配置文件目录不存在,请确认"'!!!'"\033[0m" && exit 1
    # elif [ $? -eq 200 ];then
    #     echo -e "\033[31m>> zabbix-agent配置文件错误,请检查配置文件是否存在或存在多个配置文件"'!!!'"\033[0m" && exit 1
    # elif [ $? -eq 300 ];then
    #     echo -e "\033[31m>> zabbix-agent配置文件异常,请检查配置文件是否正确"'!!!'"\033[0m" && exit 1
    # fi
    #7.使用配置文件检测函数获取到配置文件信息传参给修改函数修改配置文件的Zabbix-Server IP地址
    ZAABIX_CONFINA_NAME=(`zabbix_agent_config_name_get`)
    ZABBIX_CONFIGNAME=${ZAABIX_CONFINA_NAME[0]}
    ZABBIX_COMPLETE_CONFIGNAME=${ZAABIX_CONFINA_NAME[1]}
    echo -e "\n>> config_file:\n${ZAABIX_CONFINA_NAME[0]}\nfile_path:\n${ZAABIX_CONFINA_NAME[1]}"

    echo -e "\n====== The system starts to modify the Zabbix-agent configuration file ======"
    zabbix_config_mod "${ZAABIX_CONFINA_NAME[*]}"

    echo -e "\n>> ${ZAABIX_CONFINA_NAME[0]} Zabbix-Server HOST:"
    egrep "^Server.*=[0-9]+.[0-9]+.[0-9]+.[0-9]+" ${ZAABIX_CONFINA_NAME[1]}

    #8.重启zabbix_agent服务
    echo -e "\n====== Start Start the Zabbix-agent process and set it to start upon startup ======\n"
    if [ $OS_NAME == "Centos" ];then centos::zabbix_agent_run && echo -e ">> The zabbix-agent process has been rstarted!";fi
    if [ $OS_NAME == "Ubuntu" ];then ubuntu::zabbix_agent_run && echo -e ">> The zabbix-agent process has been rstarted!";fi
}

#----------------------------------------------脚本运行----------------------------------------------
main
exit