Zabbix学习(1)-监控服务与Zabbix介绍

Zabbix学习(2)-Zabbix安装和基础使用

Zabbix学习(3)-Zabbix监控入门

Zabbix学习(4)-Proxy主动被动部署

Zabbix学习案例(1)-TCP状态监控

Zabbix学习案例(2)-memcached状态监控

Zabbix学习案例(3)-redis状态监控

Zabbix学习案例(4)-nginx状态监控

Zabbix学习案例(5)-SNMP监控和WEB监控

Zabbix学习案例(6)-MySQL监控

Zabbix学习案例(7)-grafana图形展示

Zabbix学习案例(8)-Zabbix故障自治愈

Zabbix学习案例(9)-Zabbix事件通知

zabbix 自动化部署

zabbix 自动化部署主要指自动化的部署 zabbix agent 主机,由于 zabbix server主机或者 zabbix proxy 主机的数量往往比较少,而生产实践中要监控的主机往往很多,如果一台一台的安装 zabbix agent 则不现实,这时可以考虑使用脚本通过ssh 批量部署,或者使用 ansible 批量部署安装 zabbix agent。

编写脚本使用源码编译安装 zabbix agent

实验环境:这里用web的2台服务器 WEB-1 :172.20.32.106和WEB-1 :172.20.32.107
zabbix server :172.20.32.101

基础命令:
# apt-get -y install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server iotop unzip zip make

编写脚本

root@WEB-1:/usr/local/src# vim compile_install_zabbix.sh 
#!/bin/bash
#
WORK_DIR="/usr/local/src"
ZABBIX_VER="zabbix-4.0.20"

if [[ ! -e "${WORK_DIR}" ]]; then
    WORK_DIR=`pwd`
fi

## install some libs and deps.
if grep -iq "ubuntu" /etc/issue; then

    apt update
    apt -y install iproute2 ntpdate tcpdump telnet \
    traceroute nfs-kernel-server nfs-common lrzsz tree \
    openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev \
    ntpdate tcpdump telnet traceroute gcc openssh-server \
    iotop unzip zip make

else
    yum install -y vim iotop bc gcc gcc-c++ glibc glibc-devel \
    pcre  pcre-devel openssl  openssl-devel zip unzip zlib-devel\
    net-tools lrzsz tree ntpdate telnet lsof tcpdump wget libevent \
    libevent-devel bc systemd-devel bash-completion traceroute
fi

## compile zabbix and install
cd ${WORK_DIR}
tar -xf ${ZABBIX_VER}.tar.gz && \
            cd ${ZABBIX_VER} && \
            ./configure --prefix=/apps/zabbix_agent --enable-agent && \
            make && make install

## add user and create dir for pid file and log file
useradd zabbix
mkdir /apps/zabbix_agent/pid
mkdir /apps/zabbix_agent/logs

# copy conf file to the app folder
\cp ${WORK_DIR}/zabbix-agent.service    /lib/systemd/system/zabbix-agent.service
\cp ${WORK_DIR}/zabbix_agentd.conf      /apps/zabbix_agent/etc/zabbix_agentd.conf
\cp ${WORK_DIR}/zabbix_agentd.conf.d/*  /apps/zabbix_agent/etc/zabbix_agentd.conf.d/

## modify the zabbix hostname to ip.
HOST_IP=`ifconfig  eth0 | grep -w inet  | awk '{print $2}'`
sed -i "s/Hostname=/Hostname=${HOST_IP}/g" /apps/zabbix_agent/etc/zabbix_agentd.conf

chown zabbix.zabbix -R /apps/zabbix_agent/

systemctl daemon-reload
systemctl enable zabbix-agent
systemctl restart zabbix-agent

准备部署需要的文件

从原来的受 zabbix 监控的主机(在这里是172.20.32.105)将监控脚本和 agent 监控入口配置文件拷贝到新加的主机(172.20.32.106),此处为Mysql-slave:172.20.32.105原有的受监控主机,WEB-1:172.20.32.106为新加主机,这个新加的主机就是用来编写部署的所有准备文件以及安装包,到时候只要这个机器部署好了环境,就可以整体打包给其他机器进行批量部署。

从之前部署过的机器拷贝相关文件到新的部署机器

root@Mysql-slave:~# cd /etc/zabbix/zabbix_agentd.d/
root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# ll
total 44
drwxr-xr-x 2 root root 4096 May  3 16:12 ./
drwxr-xr-x 3 root root 4096 May  3 15:36 ../
-rw-r--r-- 1 root root   82 May  3 15:25 cus.conf
-rwxr-xr-x 1 root root  388 May  1 13:02 linux_tcp_status.sh*
-rwxr-xr-x 1 root root  335 May  1 16:39 memcache_monitor.sh*
-rwxr-xr-x 1 root root  731 May  3 16:12 mysql_monitor.sh*
-rwxr-xr-x 1 root root 1272 May  1 21:33 nginx_status1.sh*
-rwxr-xr-x 1 root root 2047 May  1 21:19 nginx_status.sh*
-rwxr-xr-x 1 root root  563 May  1 19:17 redis_monitor1.sh*
-rwxr-xr-x 1 root root  481 May  1 19:29 redis_monitor.sh*

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# scp cus* 172.20.32.106:/usr/local/src

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# scp *.sh 172.20.32.106:/usr/local/src
root@172.20.32.106's password: 
linux_tcp_status.sh                                                                                           100%  388   449.2KB/s   00:00    
memcache_monitor.sh                                                                                           100%  335   624.2KB/s   00:00    
mysql_monitor.sh                                                                                              100%  731     1.4MB/s   00:00    
nginx_status1.sh                                                                                              100% 1272     3.1MB/s   00:00    
nginx_status.sh                                                                                               100% 2047     3.9MB/s   00:00    
redis_monitor1.sh                                                                                             100%  563    39.1KB/s   00:00    
redis_monitor.sh                                                                                              100%  481   682.0KB/s   00:00    

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# scp /etc/zabbix/zabbix_agentd.conf   172.20.32.106:/usr/local/src

root@Mysql-slave:/etc/zabbix/zabbix_agentd.d# scp /etc/zabbix/zabbix_agentd.conf   172.20.32.106:/usr/local/src

在新机器WEB-1:172.20.32.106中:

root@WEB-1:/usr/local/src# ll
total 16852
drwxr-xr-x  4 root   root       4096 May  4 14:22 ./
drwxr-xr-x 10 root   root       4096 May  4 13:17 ../
-rwxr-xr-x  1 root   root       1816 May  4 14:22 compile_install_zabbix.sh* #部署安装脚本
-rw-r--r--  1 root   root   17215217 Apr 29 13:41 zabbix-4.0.20.tar.gz #zabbix源码
-rw-r--r--  1 root   root      13773 May  4 13:17 zabbix_agentd.conf #zabbix agent配置文件
drwxr-xr-x  2 root   root       4096 May  4 13:35 zabbix_agentd.conf.d/ #zabbix agent配置文件的包含文件
-rw-r--r--  1 root   root        472 May  4 12:01 zabbix-agent.service #zabbix systemd service文件

root@WEB-1:/usr/local/src# ll zabbix_agentd.conf.d/  #这里需要把上一级目录中的所有脚本文件给mv到此目录,还需要一个监控项自定义入口文件
total 40
drwxr-xr-x 2 root root 4096 May  4 13:35 ./
drwxr-xr-x 4 root root 4096 May  4 14:22 ../
-rw-r--r-- 1 root root  790 May  4 13:18 cus.conf   ## 自定义监控项入口
##各服务的监控脚本
-rwxr-xr-x 1 root root  388 May  4 13:26 linux_tcp_status.sh*
-rwxr-xr-x 1 root root  335 May  4 11:42 memcache_monitor.sh*
-rwxr-xr-x 1 root root  731 May  4 11:42 mysql_monitor.sh*
-rwxr-xr-x 1 root root 1272 May  4 13:25 nginx_status1.sh*
-rwxr-xr-x 1 root root 2047 May  4 11:42 nginx_status.sh*
-rwxr-xr-x 1 root root  563 May  4 11:42 redis_monitor1.sh*
-rwxr-xr-x 1 root root  481 May  4 11:42 redis_monitor.sh*

root@WEB-1:/usr/local/src# cat zabbix_agentd.conf.d/cus.conf   #这里的脚本路径要和配置文件中的includ路径一致
UserParameter=linux_tcp_status[*],bin/bash /apps/zabbix_agent/etc/zabbix_agentd.conf.d/linux_tcp_status.sh "$1" "$2"

UserParameter=linux_status[*],bin/bash /apps/zabbix_agent/etc/zabbix_agentd.conf.d/linux_tcp_status.sh "$1" "$2"

UserParameter=memcached_status[*],bin/bash /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcache_monitor.sh "$1" "$2" "$3"

UserParameter=redis_status[*],bin/bash /apps/zabbix_agent/etc/zabbix_agentd.conf.d/redis_monitor.sh "$1" "$2" "$3"

UserParameter=nginx_status[*],bin/bash /apps/zabbix_agent/etc/zabbix_agentd.conf.d/nginx_status1.sh "$1"

UserParameter=nginx.status[*],bin/bash /apps/zabbix_agent/etc/zabbix_agentd.conf.d/nginx_status.sh "$1" "$2" "$3"

UserParameter=mysql_monitor[*],/apps/zabbix_agent/etc/zabbix_agentd.conf.d/mysql_monitor.sh  "$1"

agent 配置文件

root@WEB-1:/usr/local/src#  vim zabbix_agentd.conf
root@WEB-1:/usr/local/src#  grep "^[a-Z]" zabbix_agentd.conf
PidFile=/apps/zabbix_agent/pid/zabbix_agentd.pid
LogFile=/apps/zabbix_agent/logs/zabbix_agentd.log
DebugLevel=4
EnableRemoteCommands=1
LogRemoteCommands=1
Server=172.20.32.102,172.20.32.101
ListenPort=10050
ListenIP=0.0.0.0
StartAgents=5
ServerActive=172.20.32.102
Hostname=            #在这里为空,到时候一键部署脚本会部署本机地址上去
Include=/apps/zabbix_agent/etc/zabbix_agentd.conf.d/*.conf  #和自定义监控入口中的脚本路径一致
UnsafeUserParameters=1

agent service 文件

root@WEB-1:/usr/local/src# cat zabbix-agent.service
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/apps/zabbix_agent/etc/zabbix_agentd.conf"  #与agent 配置文件保持一致
EnvironmentFile=-/etc/default/zabbix-agent
Type=forking
Restart=on-failure
PIDFile=/apps/zabbix_agent/pid/zabbix_agentd.pid                #与agent 配置文件保持一致
KillMode=control-group
ExecStart=/apps/zabbix_agent/sbin/zabbix_agentd -c $CONFFILE     #编译路径下的执行命令
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target

各监控脚本

root@WEB-1:/usr/local/src# ll zabbix_agentd.conf.d/*
-rw-r--r-- 1 root root  790 May  4 13:18 zabbix_agentd.conf.d/cus.conf
-rwxr-xr-x 1 root root  388 May  4 13:26 zabbix_agentd.conf.d/linux_tcp_status.sh*
-rwxr-xr-x 1 root root  335 May  4 11:42 zabbix_agentd.conf.d/memcache_monitor.sh*
-rwxr-xr-x 1 root root  731 May  4 11:42 zabbix_agentd.conf.d/mysql_monitor.sh*
-rwxr-xr-x 1 root root 1272 May  4 13:25 zabbix_agentd.conf.d/nginx_status1.sh*
-rwxr-xr-x 1 root root 2047 May  4 11:42 zabbix_agentd.conf.d/nginx_status.sh*
-rwxr-xr-x 1 root root  563 May  4 11:42 zabbix_agentd.conf.d/redis_monitor1.sh*
-rwxr-xr-x 1 root root  481 May  4 11:42 zabbix_agentd.conf.d/redis_monitor.sh*
TCP 状态监控
root@WEB-1:/usr/local/src# cat zabbix_agentd.conf.d/linux_tcp_status.sh 
#!/bin/bash
#
# Edited on 20200501 by likai.tech
#
tcp_conn_status(){
	 TCP_STAT=$1
	 ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt 
	 TCP_NUM=$(grep "$TCP_STAT" /tmp/tcp_conn.txt | cut -d ' ' -f2)
	 if [ -z $TCP_NUM ];then 
		TCP_NUM=0
	 fi
	echo $TCP_NUM 
}

main(){ 
	case $1 in 
		tcp_status)
			 tcp_conn_status $2; 
		 	 ;; 
	esac 
}

main $1 $2
memcache 状态监控
root@WEB-1:/usr/local/src# cat zabbix_agentd.conf.d/memcache_monitor.sh 
#!/bin/bash
# 
# Edited on 20200501 by likai.tech
#
memcached_status(){
	 M_PORT=$1
	 M_COMMAND=$2
	 echo -e "stats\nquit" | ncat 127.0.0.1 "$M_PORT" | grep -w "STAT $M_COMMAND" | awk '{print $3}' 
#ubuntu使用ncat, 安装nmap 
}
main(){ 
	 case $1 in
		 memcached_status) 
			memcached_status $2 $3 
				;; 
	 esac 
}

main $1 $2 $3
nginx 状态监控

脚本一:

root@WEB-1:/usr/local/src# cat zabbix_agentd.conf.d/nginx_status.sh 
#!/bin/bash
# 
# Edited on 20200501 by likai.tech
#

nginx_status_fun(){ #函数内容 
	NGINX_PORT=$1 #端口,函数的第一个参数是脚本的第二个参数,即脚本的第二个参数是段端口号 
	NGINX_COMMAND=$2 #命令,函数的第二个参数是脚本的第三个参数,即脚本的第三个参数是命令 
	nginx_active(){ #获取nginx_active数量,以下相同,这是开启了nginx状态但是只能从本机看到 
		/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}' 
} 
	nginx_reading(){ #获取nginx_reading状态的数量 
		/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}' 
} 
	nginx_writing(){
		/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}' 
} 
	nginx_waiting(){ 
		/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}' 
} 
	nginx_accepts(){ 
		/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
} 
	nginx_handled(){ 
		/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}' 
} 
	nginx_requests(){ 
		/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}' 
} 
	case $NGINX_COMMAND in 
		active) 
			nginx_active; 
			;; 
		reading) 
			nginx_reading; 
			;; 
		writing) 
			nginx_writing; 
			;; 
		waiting) 
			nginx_waiting; 
			;; 
		accepts) 
			nginx_accepts; 
			;; 
		handled) 
			nginx_handled; 
			;; 
		requests) 
			nginx_requests; 
	esac 
}

main(){ #主函数内容 
	case $1 in #分支结构,用于判断用户的输入而进行响应的操作 
		nginx_status) #当输入nginx_status就调用nginx_status_fun,并传递第二和第三个参数 
			nginx_status_fun $2 $3; 
			;; 
		*) #其他的输入打印帮助信息 
			echo $"Usage: $0 {nginx_status + PORT + key}" 
	esac #分支结束符 
}

main $1 $2 $3

方法二:

root@WEB-1:/usr/local/src# cat zabbix_agentd.conf.d/nginx_status1.sh 
#!/bin/bash
# 
# Edited on 20200501 by likai.tech

if [[ $# -eq 0 ]]; then
    echo "Usage: `basename $0` get_nginx_status.sh STATS"
fi

save_status(){
   /usr/bin/curl http://172.20.32.105/nginx_status 2> /dev/null > /tmp/nginx_status.log
}

get_status(){
case $1 in
    active)
        active_conns=`/bin/cat /tmp/nginx_status.log | grep -i "active" | awk '{print $3}'`;
        echo $active_conns;
;;
    accepts)
        accepts_conns=`/bin/cat /tmp/nginx_status.log | grep  "^ [0-9]" | awk '{print $1}'`;
        echo $accepts_conns;
;;
    handled)
        handled_conns=`/bin/cat /tmp/nginx_status.log | grep  "^ [0-9]" | awk '{print $2}'`;
        echo $handled_conns;
;;
    requests)
        requests_conns=`/bin/cat /tmp/nginx_status.log | grep  "^ [0-9]" | awk '{print $3}'`;
        echo $requests_conns;
;;
    reading)
        reading_conns=`/bin/cat /tmp/nginx_status.log | tail -n1 | awk '{print $2}'`;
        echo $reading_conns;
;;
    writing)
        writing_conns=`/bin/cat /tmp/nginx_status.log | tail -n1 | awk '{print $4}'`;
        echo $writing_conns;
;;
    waiting)
        waiting_conns=`/bin/cat /tmp/nginx_status.log | tail -n1 | awk '{print $6}'`;
        echo $waiting_conns;
esac
}

main(){
    save_status
    get_status $1
}

main $1
Redis 状态监控

方法一:

root@WEB-1:/usr/local/src# cat zabbix_agentd.conf.d/redis_monitor.sh 
#!/bin/bash
# 
# Edited on 20200501 by likai.tech
#
redis_status(){
       	R_PORT=$1 
	R_COMMAND=$2 
	(echo -en "INFO \r\n";sleep 1;) | ncat 127.0.0.1 "$R_PORT" > /tmp/redis_"$R_PORT".tmp 
	REDIS_STAT_VALUE=$(grep ""$R_COMMAND":" /tmp/redis_"$R_PORT".tmp | cut -d':' -f2)
	echo $REDIS_STAT_VALUE 
}

help(){ 
	echo "${0} + redis_status + PORT + COMMAND" 
}

main(){ 
	case $1 in 
		redis_status)
		       	redis_status $2 $3 
				;; 
		*) 
			help
				;; 
	esac 
}

main $1 $2 $3

方法二:

root@WEB-1:/usr/local/src# cat zabbix_agentd.conf.d/redis_monitor1.sh 
#!/bin/bash
#
# Edited on 20200501 by likai.tech
#

get_redis_status(){
echo -en "INFO \r\n" | ncat 127.0.0.1 $1 | grep -w "$2" | awk -F: '{print $2}'
}

main(){
        # install ncat
    cat /etc/issue | grep -iq "ubuntu"
    [[ $? -ne 0 ]] && yum install nmap-ncat -y &> /dev/null || apt install nmap-ncat -y &> /dev/null

        # prompt usage
    if [[ $# -eq 0 ]]; then
        echo "`basename $0` redis_status <PORT> <STATUS>"
    fi

        # do the f* thing
    if [[ $1 = "redis_status" ]]; then
        get_redis_status $2 $3
    fi
}

main $1 $2 $3
数据库主从监控
root@WEB-1:/usr/local/src# cat zabbix_agentd.conf.d/mysql_monitor.sh 
#!/bin/bash
#
# Edited on 20200503 by likai.tech
#

Seconds_Behind_Master(){
	NUM=`mysql -uroot -hlocalhost -e "show slave status\G;" | grep "Seconds_Behind_Master:" | awk -F: '{print $2}'`
	echo $NUM
}

master_slave_check(){
	NUM1=`mysql -uroot -hlocalhost -e "show slave status\G;" | grep "Slave_IO_Running" | awk -F: '{print $2}' | sed 's/^[ \t]*//g'`
#echo $NUM1
	NUM2=`mysql -uroot -hlocalhost -e "show slave status\G;" | grep "Slave_SQL_Running:" | awk -F: '{print $2}' | sed 's/^[ \t]*//g'`
#echo $NUM2
if test $NUM1 == "Yes" && test $NUM2 == "Yes";then
	echo 50
else
	echo 100 
fi
}

main(){
	case $1 in
	Seconds_Behind_Master)
		Seconds_Behind_Master;
		;;
	master_slave_check)
		master_slave_check;
		;;
	esac
}

main $1

批量部署到不同主机

通过 ssh 使用脚本批量部署

将 zabbix agent 源码和编译安装脚本推送到远程主机,批量部署 zabbix agent

打包部署需要的 zabbix 源码和配置文件及监控脚本
root@WEB-1:/usr/local/src# ll
total 16848
drwxr-xr-x  3 root root     4096 May  4 14:51 ./
drwxr-xr-x 10 root root     4096 May  4 13:17 ../
-rwxr-xr-x  1 root root     1816 May  4 14:22 compile_install_zabbix.sh*
-rw-r--r--  1 root root 17215217 Apr 29 13:41 zabbix-4.0.20.tar.gz
-rw-r--r--  1 root root    13773 May  4 13:17 zabbix_agentd.conf
drwxr-xr-x  2 root root     4096 May  4 13:35 zabbix_agentd.conf.d/
-rw-r--r--  1 root root      472 May  4 12:01 zabbix-agent.service
root@WEB-1:/usr/local/src# tar -czf zabbix_agent_deploy.tar.gz ./*
root@WEB-1:/usr/local/src# ll zabbix_agent_deploy.tar.gz 
-rw-r--r-- 1 root root 17140366 May  4 14:52 zabbix_agent_deploy.tar.gz
编写一键部署脚本

该脚本接收一个参数:$1,$1为主机 IP 列表,每个 IP 为一行的文本文件。主机列表文件和 zabbix agent 部署打包文件与该脚本在同一目录,直接运行该脚本,会首先分发公钥给对端主机,然后将 zabbix agent 部署文件发送到对端,再分别解压安装。

root@WEB-1:/usr/local/src# vim deploy_zabbix_agent_cmd.sh
root@WEB-1:/usr/local/src# cat deploy_zabbix_agent_cmd.sh
#!/bin/bash
#
HOSTS="$1"

DEPLOY_TAR="zabbix_agent_deploy.tar.gz"
ZABBIX_COMPILE_SCRIPT="compile_install_zabbix.sh"
CMD1="cd /usr/local/src && tar xf zabbix_agent_deploy.tar.gz"
CMD2="bash /usr/local/src/compile_install_zabbix.sh"

apt-get install expect -y

if [[ ! -f /root/.ssh/id_rsa ]]; then
    ssh-keygen -P "" -f "/root/.ssh/id_rsa"
fi

userpwd="ubantu"
while read ipaddr;do
expect <<EOF
set timeout 100
spawn ssh-copy-id $ipaddr
expect {
"yes/no" {send "yes\n"; exp_continue}
"password" {send "$userpwd\n"}
}
expect eof
EOF
scp ${DEPLOY_TAR} ${ipaddr}:/usr/local/src
scp /etc/apt/sources.list ${ipaddr}:/etc/apt/sources.list
ssh -n "${ipaddr}" "${CMD1}"
ssh -n "${ipaddr}" "${CMD2}"
done < ${HOSTS}
部署测试
root@WEB-1:/usr/local/src# cat hosts.txt 
172.20.32.107
172.20.32.108
172.20.32.109
172.20.32.110

root@WEB-1:/usr/local/src# bash deploy_zabbix_agent_cmd.sh hosts.txt
各主机查看 zabbix agent 是否跑起来
root@WEB-2:~# ip addr show eth0 | grep -w inet
    inet 172.20.32.107/16 brd 172.20.255.255 scope global eth0
root@WEB-2:~# lsof -i:10050
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zabbix_ag 10690 zabbix    4u  IPv4  36884      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 10691 zabbix    4u  IPv4  36884      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 10692 zabbix    4u  IPv4  36884      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 10693 zabbix    4u  IPv4  36884      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 10694 zabbix    4u  IPv4  36884      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 10695 zabbix    4u  IPv4  36884      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 10696 zabbix    4u  IPv4  36884      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 10697 zabbix    4u  IPv4  36884      0t0  TCP *:zabbix-agent (LISTEN)


root@WEB-3:~# ip addr show eth0 | grep -w inet
    inet 172.20.32.108/16 brd 172.20.255.255 scope global eth0
root@WEB-3:~# lsof -i:10050
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zabbix_ag 11993 zabbix    4u  IPv4  41079      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11999 zabbix    4u  IPv4  41079      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12000 zabbix    4u  IPv4  41079      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12001 zabbix    4u  IPv4  41079      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12002 zabbix    4u  IPv4  41079      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12003 zabbix    4u  IPv4  41079      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12004 zabbix    4u  IPv4  41079      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12005 zabbix    4u  IPv4  41079      0t0  TCP *:zabbix-agent (LISTEN)

root@WEB-4:~# ip addr show eth0 | grep -w inet
    inet 172.20.32.109/16 brd 172.20.255.255 scope global eth0
root@WEB-4:~# lsof -i:10050
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zabbix_ag 11085 zabbix    4u  IPv4  37858      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11086 zabbix    4u  IPv4  37858      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11087 zabbix    4u  IPv4  37858      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11088 zabbix    4u  IPv4  37858      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11089 zabbix    4u  IPv4  37858      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11090 zabbix    4u  IPv4  37858      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11091 zabbix    4u  IPv4  37858      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11092 zabbix    4u  IPv4  37858      0t0  TCP *:zabbix-agent (LISTEN)

root@WEB-5:~# ip addr show eth0 | grep -w inet
    inet 172.20.32.110/16 brd 172.20.255.255 scope global eth0
root@WEB-5:~# lsof -i:10050
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zabbix_ag 11089 zabbix    4u  IPv4  37834      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11100 zabbix    4u  IPv4  37834      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11101 zabbix    4u  IPv4  37834      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11102 zabbix    4u  IPv4  37834      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11103 zabbix    4u  IPv4  37834      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11104 zabbix    4u  IPv4  37834      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11105 zabbix    4u  IPv4  37834      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11106 zabbix    4u  IPv4  37834      0t0  TCP *:zabbix-agent (LISTEN)

使用 ansible 批量部署

使用 ansible 将安装脚本和 zabbix 源码及配置文件等推送到远程主机,再通过 ansible 运行该编译脚本,批量部署 zabbix agent
这里把环境初始化一下,用172.20.32.107主机Ansible-server做控制端服务器

这些为部署的机器
172.20.32.108
172.20.32.109
172.20.32.110

1.将打包好的部署文件上传到 ansible 控制端:172.20.32.107

root@WEB-1:/usr/local/src# scp zabbix_agent_deploy.tar.gz 172.20.32.107:/usr/local/src

2.添加主机到 ansible 主机列表并测试是否可达

root@Ansible-server:/usr/local/src# apt update
root@Ansible-server:/usr/local/src# apt install software-properties-common
root@Ansible-server:/usr/local/src# apt-add-repository --yes --update ppa:ansible/ansible

root@Ansible-server:/usr/local/src# apt install ansible -y

root@Ansible-server:/usr/local/src# ssh-keygen
root@Ansible-server:/usr/local/src# ssh-copy-id 172.20.32.108
root@Ansible-server:/usr/local/src# ssh-copy-id 172.20.32.109
root@Ansible-server:/usr/local/src# ssh-copy-id 172.20.32.110

在ansible配置文件中添加部署的主机

# 添加主机
root@Ansible-server:/usr/local/src# vim /etc/ansible/hosts
[zabbix_agent]
172.20.32.108
172.20.32.109
172.20.32.110

# 测试是否可达
root@Ansible-server:/usr/local/src# ansible zabbix_agent -m ping
172.20.32.109 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    }, 
    "changed": false, 
    "ping": "pong"
}
172.20.32.108 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    }, 
    "changed": false, 
    "ping": "pong"
}
172.20.32.110 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    }, 
    "changed": false, 
    "ping": "pong"
}

3.编写 playbook

root@Ansible-server:/usr/local/src# vim deploy_zabbix_agent.yaml
root@Ansible-server:/usr/local/src# cat deploy_zabbix_agent.yaml
---
- hosts: zabbix_agent
  remote_user: root
  tasks:
    - name: unarchive zabbix_agent_deploy.tar.gz
      unarchive: src=/usr/local/src/zabbix_agent_deploy.tar.gz dest=/usr/local/src
    - name: run script to install and deploy zabbix agent
      shell: chdir=/usr/local/src ./compile_install_zabbix.sh

4.测试 playbook

root@Ansible-server:/usr/local/src# ansible-playbook -C deploy_zabbix_agent.yaml 

PLAY [zabbix_agent] *********************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************
ok: [172.20.32.109]
ok: [172.20.32.108]
ok: [172.20.32.110]

TASK [unarchive zabbix_agent_deploy.tar.gz] *********************************************************************************************
skipping: [172.20.32.108]
skipping: [172.20.32.110]
skipping: [172.20.32.109]

TASK [run script to install and deploy zabbix agent] ************************************************************************************
skipping: [172.20.32.109]
skipping: [172.20.32.110]
skipping: [172.20.32.108]

PLAY RECAP ******************************************************************************************************************************
172.20.32.108              : ok=1    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
172.20.32.109              : ok=1    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
172.20.32.110              : ok=1    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0

5.部署

root@Ansible-server:/usr/local/src# ansible-playbook  deploy_zabbix_agent.yaml 

PLAY [zabbix_agent] *********************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************
ok: [172.20.32.109]
ok: [172.20.32.108]
ok: [172.20.32.110]

TASK [unarchive zabbix_agent_deploy.tar.gz] *********************************************************************************************
ok: [172.20.32.110]
ok: [172.20.32.109]
ok: [172.20.32.108]

TASK [run script to install and deploy zabbix agent] ************************************************************************************
changed: [172.20.32.110]
changed: [172.20.32.108]
changed: [172.20.32.109]

PLAY RECAP ******************************************************************************************************************************
172.20.32.108              : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.20.32.109              : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.20.32.110              : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

root@Ansible-server:/usr/local/src# echo $?
0

6.查看 zabbix agent 在各主机是否以及跑起来

root@WEB-3:/usr/local/src# ip addr show eth0 | grep  -w inet
    inet 172.20.32.108/16 brd 172.20.255.255 scope global eth0
root@WEB-3:/usr/local/src# lsof -i:10050
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zabbix_ag 12162 zabbix    4u  IPv4  50738      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12163 zabbix    4u  IPv4  50738      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12164 zabbix    4u  IPv4  50738      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12165 zabbix    4u  IPv4  50738      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12166 zabbix    4u  IPv4  50738      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12167 zabbix    4u  IPv4  50738      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12168 zabbix    4u  IPv4  50738      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12169 zabbix    4u  IPv4  50738      0t0  TCP *:zabbix-agent (LISTEN)
root@WEB-3:/usr/local/src# systemctl status zabbix-agent.service
● zabbix-agent.service - Zabbix Agent
   Loaded: loaded (/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-05-04 20:19:09 CST; 13min ago
  Process: 12160 ExecStart=/apps/zabbix_agent/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
 Main PID: 12162 (zabbix_agentd)
    Tasks: 8 (limit: 1006)
   CGroup: /system.slice/zabbix-agent.service
······

root@WEB-4:/usr/local/src# ip addr show eth0 | grep  -w inet
    inet 172.20.32.109/16 brd 172.20.255.255 scope global eth0
root@WEB-4:/usr/local/src# 
root@WEB-4:/usr/local/src# lsof -i:10050
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zabbix_ag 12008 zabbix    4u  IPv4  50092      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12009 zabbix    4u  IPv4  50092      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12010 zabbix    4u  IPv4  50092      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12011 zabbix    4u  IPv4  50092      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12012 zabbix    4u  IPv4  50092      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12013 zabbix    4u  IPv4  50092      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12014 zabbix    4u  IPv4  50092      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 12015 zabbix    4u  IPv4  50092      0t0  TCP *:zabbix-agent (LISTEN)
root@WEB-4:/usr/local/src# systemctl status zabbix-agent.service
● zabbix-agent.service - Zabbix Agent
   Loaded: loaded (/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-05-04 20:19:09 CST; 13min ago
  Process: 12006 ExecStart=/apps/zabbix_agent/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
 Main PID: 12008 (zabbix_agentd)
    Tasks: 8 (limit: 1006)
   CGroup: /system.slice/zabbix-agent.service
······

root@WEB-5:/usr/local/src# ip addr show eth0 | grep  -w inet
    inet 172.20.32.110/16 brd 172.20.255.255 scope global eth0
root@WEB-5:/usr/local/src# lsof -i:10050
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zabbix_ag 11866 zabbix    4u  IPv4  48812      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11867 zabbix    4u  IPv4  48812      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11868 zabbix    4u  IPv4  48812      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11869 zabbix    4u  IPv4  48812      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11870 zabbix    4u  IPv4  48812      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11871 zabbix    4u  IPv4  48812      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11872 zabbix    4u  IPv4  48812      0t0  TCP *:zabbix-agent (LISTEN)
zabbix_ag 11873 zabbix    4u  IPv4  48812      0t0  TCP *:zabbix-agent (LISTEN)
root@WEB-5:/usr/local/src# systemctl status zabbix-agent.service

lines 1--1...skipping...
● zabbix-agent.service - Zabbix Agent
   Loaded: loaded (/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-05-04 20:19:09 CST; 13min ago
  Process: 11864 ExecStart=/apps/zabbix_agent/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
 Main PID: 11866 (zabbix_agentd)
    Tasks: 8 (limit: 1006)
   CGroup: /system.slice/zabbix-agent.service
······