Python 自动化运维(4)--Zabbix

基础设施监控

  • 基础设施监控
    • 服务器温度、风扇转速 ipmitool命令
    • 存储监控(df,fdisk,iotop)
    • cpu (lscpu, uptime, top, htop, glances)
    • 内存情况 (free)
    • 网络(iftop)
  • 应用监控
    • mysql redis
    • nginx
    • php-fpm
    • python
  • 安全监控
    • nginx+lua编要给WAF通过kibana可以图形化站式不同的攻击类型统计
    • 用户登录数,passwd文件变化,本地所有文件改动
  • 网络监控
    • 端口,IDC带宽网络流量,网络流入流出速率,网络入/出流量,网络使用率,SMTP, POP3

完善理想的监控系统特点

  • 监控系统能够自定义监控内容,自己通过脚本采集所需的数据
  • 数据存入到数据库,日后对该数据进行分析计算
  • 监控系统可以简易,快速的部署到服务器
  • 数据可视化只管清晰

异常警告通知

  • 可以定义复杂度告警逻辑,做到监控项之间的关联警告,例如程序之间的依赖检测,而不是之单独检测某个指标
  • 警告可以确认响应,让运维组内的人知道已经有人处理警告问题
  • 报警方式可以字定义,如短信,邮件,以及微信,钉钉等
  • 告警内容可以字定义,能够写入一些简单的饭呢西,便于运维人员只管了解数据,否则还得去服务器查看
  • 报警后,可以预处理一些任务,如自我修复,重启,采集数据

协同工作

  • 监控系统有强大的API,提供给研发同学调用或其他系统调用
  • 监控数据开发性,数据结构主流,便于分析
  • 监控可视化可以建议的插件使用,而非复杂的JS文件

zabbix优点

  • 支持自定义监控脚本,提供需要输出的值即可
  • zabbix存储的数据库表结构稍有复杂但是逻辑清晰
  • zabbix存在模板概念,可以方便的将一组监控进行部署
  • 每一个item就是监控项,可以看到历史记录,且web界面友好
  • zabbix有强大的Trigger(触发器)定义规则,可以定义复杂的报警逻辑
  • zabbix提供了ack报警确认机制
  • zabbix支持邮件,短信,微信等告警
  • zabbix在触发告警后,可以远程执行系统命令
  • zabbix有原生的php绘图模块

zabbix5.0 安装

5.0版本要求php版本最低7.2.0,对php扩展组件版本也有要求,具体参见【官方文档】

  • 准备机器,环境初始化
1
2
3
4
5
6
ifconfig eth0 |awk 'NR==2{print $2}' # 输出IP,如果没有制表符,则第二列不好输出
## 关闭防火墙
systemctl disable --now firewalld
getenforce # 查看是否关闭
iptables -L # 查看流量是否允许过来
free -m # 内存大点,至少两个G, 4G最好
  • 获取zabbix的下载源
1
2
3
4
5
6
7
8
9
apt install rpm
rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm # 获得镜像源
ls /etc/yum.repos.d/ # 可以查看到zabbix.repo文件
## 修改zabbix.repo的镜像源为阿里的
sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo

[zabbix-frontend]
...
enabled=1 # 0改为1, 官方文档给的
  • 清空缓存,安装zabbix server和 agent
1
2
3
4
yum clean all 
yum makecache

yum install zabbix-server-mysql zabbix-agent2 -y
  • 安装software collections, 便于后续安装高版本的php, yum默认安装5.4过低。SCL(Software Colletions) 可以让你在同一个操作系统上安装和使用多个版本的软件,而不会影响系统的安装包。软件包会安装在/opt/rh目录下。为了避免系统广泛冲突, /opt/rh包安装在目录中。例如,这允许你在centOS 7安装python3.5,而不会删除或干扰/etc/opt/rh/软件包的所有配置文件都存储在目录中,SCL包提供了定义使用所包含应用程序所需的环境变量的shell脚本。
1
yum install centos-release-scl -y
  • 安装前端环境
1
yum install zabbix-web-mysql-scl zabbix-apache-conf-scl -y
  • 安装zabbix所需的数据库
1
yum install mariadb-server -y
  • 配置数据库,设置开机启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
systemctl enable --now mariadb
## 初始化数据库
systemctl status mariadb # 先查看状态
netstat -tunlp # 查看3306端口
mysql_secure_installation # 初始化

Enter current password for root (enter for none):
OK, successfully used password, moving on...
Set root password? [Y/n] y
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

#################
mysql -uroot -p1234 #成功登录
  • 添加数据库用户,以及zabbix所需的数据库信息
1
2
3
4
create database zabbix character set utf8 collate utf8_bin; # 创建数据库
create user zabbix@localhost identified by '1234'; # 创建用户
grant all privileges on zabbix.* to zabbix@localhost; # 授权zabbix数据库下的所有表给zabbix这个用户
flush privileges; # 刷新
  • 使用zabbix-mysql命令导入数据库信息
1
2
3
4
5
6
7
8
9
ls /usr/share/doc/zabbix-server-mysql*/create.sql.gz # 先查看以下
/usr/share/doc/zabbix-server-mysql-5.0.22/create.sql.gz
## mysql -u用户名 -p 数据库名
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

mysql -uzabbix -p1234 # 登录查看
show databases;
use zabbix;
show tables; # 可以查看很多表
  • 修改zabbix server配置文件,修改数据库密码
1
2
3
4
5
6
7
8
9
10
vi /etc/zabbix/zabbix_server.conf
### Option: DBPassword
# Database password.
# Comment this line if no password is used.
#
# Mandatory: no
# Default:
DBPassword=1234
################
grep '^DBPass' /etc/zabbix/zabbix_server.conf # 查看是否修改成功
  • 修改php配置文件
1
2
vi /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
php_value[date.timezone] = Asia/Shanghai # 修改时区,取消注释
  • 启动zabbix相关服务器
1
2
systemctl restart zabbix-server zabbix-agent2 httpd rh-php72-php-fpm
systemctl enable zabbix-server zabbix-agent2 httpd rh-php72-php-fpm
  • 登录访问web
    • 网址: ip/zabbix
    • 用户:Admin
    • 密码:zabbix

zabbix客户端部署

zabbix5.0版本

agent2新版本采用golang语言开发,性能更高

由于是go语言开发,部署很方便,与之前的程序部署形式不一样

agent2 默认10050端口,客户端的端口。两个版本不能共存

  • 旧版本客户端,zabbix-agent
  • go语言新版本, zabbix-agent2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
################# centos
getenforce # 查看防火墙是否关闭

# 1. 时间同步
yum install ntpdate -y
ntpdate -u ntp.aliyun.com
# 2. 时区统一
mv /etc/localtime{,.bak}
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 3. 安装zabbix agent2,
rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm # 获得镜像源
sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo #修改zabbix.repo的镜像源为阿里的
yum install zabbix-agent2 -y # 安装agent2

# 4. 查看配置文件和启动命令
vi /etc/zabbix/zabbix_agent2.conf
ls -l /usr/sbin/zabbix_agent2

# 5. 启动客户端
systemctl enable --now zabbix-agent2
netstat -tnlp |grep zabbix # 查看端口

# 修改配置文件
hostnamectl set-hostname agent1 # 修改主机名
grep -Ev '^#|^$' /etc/zabbix/zabbix_agent2.conf # 查看过滤掉注释和空行的配置文件
cat /var/run/zabbix/zabbix_agent2.pid # 查看进程号
ps -ef |grep zabbix # 看进程号是否一致
vi /etc/zabbix/zabbix_agent2.conf
PidFile=/var/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=127.0.0.1 # 192.168.0.8
ServerActive=127.0.0.1 # 192.168.0.8
Hostname=agent1 # zbx-agent01
Include=/etc/zabbix/zabbix_agent2.d/*.conf
ControlSocket=/tmp/agent.sock

# 7. 重启agent2
systemctl restart zabbix-agent2

#################### ubuntu
sudo ufw status

验证 zabbix-agent2的连通性

1
2
3
# 1. 在服务端上通过命令主动获取数据
yum install zabbix-get -y # 可以主动去客户端拿数据
zabbix_get -s '192.168.0.13' -p 10050 -k 'agent.ping'

zabbix-server web 乱码问题

1
2
yum install wqy-microhei-fonts -y
\cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf

自定义监控内容

例1 自定义监控服务器登录人数,限制登陆人数不超过三个

命令行方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
##################### 客户端操作
# 1. 明确要执行的linux命令
who | wc -l
# 2. 手动创建zabbix的配置文件,用于定义key
/etc/zabbix/zabbix_agent2.conf
# 3. 创建配置文件,内容如下
cd /etc/zabbix/zabbix_agentd.d/
vi getusernum.conf
UserParameter=login.user,who|wc -l
# 重启
systemctl restart zabbix-agent2
systemctl status zabbix-agent2

######################## 服务端操作
# 检查
zabbix_get -s '192.168.0.13' -p 10050 -k 'login.user' # 可以看到返回值

web页面添加zabbix-server的自定义监控模板

  1. 创建模板 : 名称Template Login User Number
  2. 创建应用集
  3. 创建监控项,自定义item,具体想监控的内容
  4. 创建触发器,当监控获取到值的时候,进行触发器比较、判断,决定是否报警
  5. 创建图像
  6. 将具体的主机和该模板连接,关联

邮件报警

全网监控方案

自动快速添加主机,思路

  • 克隆监控模板
  • 自动注册和自动发现
  • 使用zabbix的api接口,利用curl语言,或者开发自己的变成脚本如python等
1
curl -i -X POST -H 'Content-Type:application/json' -d'{"jsonrpc":"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"auth":null,"id":0}' "http://119.255.249.177/zabbix/api_jsonrpc.php"

监控实施方案

  • 硬件监控

  • 应用服务监控

  • rsync服务监控

    • 监控服务器的873端口是否存活
    • 有关端口的监控,使用zabbix自带的key net.tcp.port[,873]
    • 进行数据推拉,检测效果
  • 监控NFC服务是否正常

    • 通过key检测111端口 net.tcp.port[,111]
    • showmount -e ip | wc -l
  • 监控mysql数据库是否正常

    • 通过端口 net.tcp.port[,3306]
    • zabbix自带mysql监控模板,直接添加主板和mysql的主机关联即可
  • web 服务监控

    • net.tcp.port[,80]
    • zabbix也提供了web服务器的监控模板

监控服务的具体方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 端口检测的命令, 结合grep查看端口是否存活
netstat
ss
lsof
## 例如:
netstat -tunlp|grep httpd
zabbix_get -s '127.0.0.1' -p 10050 -k 'net.tcp.port[,80]'
pkill httpd # 关闭进程,再查看

# 查询进程信息
ps

# 通过客户端连接
## 1. curl 查询web服务器
## 2. mysql,用mysql语句连接验证
## 3. 缓存数据库服务,数据读写验证

自动发现(被动)与自动注册(主动)主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1. 准备一台机器,安装好agent2
systemctl is-active zabbix-agent2 # 检查是否安装好
# 2. 配置host解析
ip zabbix_server_name
ip zabbix_agent_name
###### 自动发现模式【配置-自动发现,然后通过动作选项加入主机】
【略】
###### 自动注册模式
# 3. 修改配置文件
grep -Ev '^#|^$' /etc/zabbix/zabbix_agent2.conf

PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix-agent/zabbix_agentd.log
LogFileSize=0
Server=119.255.249.177
ServerActive=119.255.249.177
Hostname=gan
HostnameItem=system.hostname # 多设置的一项
Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf
# 4. 验证连通性
telnet 119.254.169.244 10050
zabbix_get -s '119.254.169.244' -p 10050 -k 'agent.ping'
# 配置-动作-创建动作-修改条件-操作添加主机-添加主机群主-添加链接到模板

分布式监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 环境准备
119.255.243.31 zabbix-proxy
119.254.173.203 zabbix-agent2
# 关闭防火墙
iptables -L
getenforce
systemctl stop zabbix-agent2
netstat -tunlp
# 自动发现与自动注册功能关闭
# zabbix-server 已经安装无需变动
# 准备好客户端机器,agent2机器
# 配置代理服务器,并且部署数据库,用于存储agent2发来的数据,最终发给zabbix-server

# ubuntu16 不支持zabbix5.0
# wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+bionic_all.deb
# sudo dpkg -i zabbix-release_5.0-1+bionic_all.deb
# sudo sed -i.bak 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/apt/sources.list.d/zabbix.list
# apt update
# apt upgrade

sudo apt install zabbix-proxy-mysql zabbix-get -y # get可能安装不上,就不安装了
apt-get install mariadb-server python-pymysql
service mysql restart
vi /etc/mysql/my.cnf
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

mysql_secure_installation # 加强MariaDB的安全设置:
create database zabbix_proxy character set utf8 collate utf8_bin;
create user zabbix@localhost identified by '1234';
grant all privileges on zabbix_proxy.* to zabbix@localhost; # 授权zabbix数据库下的所有表给zabbix这个用户
grant all on zabbix_proxy.* to 'zabbix'@'localhost' identified by 'zabbix' with grant option; # 如果报错用该命令
flush privileges; # 刷新

# 导入数据
dpkg -L zabbix-proxy-mysql # 查看安装过程中数据库的位置
/usr/share/zabbix-proxy-mysql/schema.sql.gz
zcat /usr/share/zabbix-proxy-mysql/schema.sql.gz | mysql -uzabbix -p zabbix_proxy

# 修改配置文件
vi /etc/zabbix/zabbix_proxy.conf
sed -i.ori '162a DBPassword=zabbix' /etc/zabbix/zabbix_proxy.conf # 修改162行,并做了.ori的备份文件
sed -i 's#Server=127.0.0.1#Server=119.255.249.177#' /etc/zabbix/zabbix_proxy.conf
sed -i 's#Hostname=Zabbix proxy#Hostname=ryu#' /etc/zabbix/zabbix_proxy.conf

# 检查代理服务器配置文件
grep '^[a-Z]' /etc/zabbix/zabbix_proxy.conf
Server=119.255.249.177
Hostname=ryu # 代理服务器名
LogFile=/var/log/zabbix-proxy/zabbix_proxy.log
PidFile=/var/run/zabbix/zabbix_proxy.pid
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=zabbix
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
Include=/etc/zabbix/zabbix_proxy.conf.d/*.conf

# 启动
service zabbix-proxy status

# 在服务端添加代理服务器

参考:https://blog.csdn.net/weixin_62466637/article/details/123269890

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
## 设置zabbix的下载源,安装zabbix-proxy
rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm

cd /etc/yum.repos.d
sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo

yum install -y zabbix-proxy-mysql zabbix-get
## 安装 zabbix 所需的数据库
yum install -y mariadb-server mariadb

systemctl enable --now mariadb

mysql_secure_installation #初始化数据库,并设置密码,如 abc123

## 添加数据库用户,以及 zabbix 所需的数据库信息
mysql -u root -p

CREATE DATABASE zabbix_proxy character set utf8 collate utf8_bin;
create user zabbix@localhost identified by '1234';
grant all privileges on zabbix_proxy.* to zabbix@localhost;
flush privileges;


## 导入数据库信息
rpm -ql zabbix-proxy-mysql #查询 sql 文件的位置

zcat /usr/share/doc/zabbix-proxy-mysql-5.0.24/schema.sql.gz | mysql -uroot -p zabbix_proxy

## 修改 zabbix-proxy 配置文件
vim /etc/zabbix/zabbix_proxy.conf
Server=192.168.80.20 #30行,指定 zabbix 服务端的 IP 地址
Hostname=zbx-proxy #49行,指定当前 zabbix 代理服务器的主机名
DBPassword=zabbix #196行,指定当前数据库 zabbix 用户的密码

## 启动 zabbix-proxy
systemctl start zabbix-proxy
systemctl enable zabbix-proxy


ubuntu 完整安装zabbix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 1. 安装zabbix 库

wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb

dpkg -i zabbix-release_5.0-1+focal_all.deb

apt update

# 2. 安装 zabbix-server, frontend, agent
apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-agent

1.查看安装的所有软件

dpkg -l

例如:dpkg -l | grep ftp

2.查看软件安装的路径

dpkg -L | grep ftp

也可以用 whereis ftp

3.查看软件版本

aptitude show

# 3. 初始化 数据库
# mysql -uroot -p
password
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by 'Ghxw_0603';
mysql> grant all privileges on zabbix.* to zabbix@localhost
grant all privileges on zabbix.* to'zabbix'@'%' identified by 'Ghxw_0603';
mysql> quit;

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

ls /usr/share/doc/zabbix-server-mysql*/create.sql.gz # 先查看以下
/usr/share/doc/zabbix-server-mysql-5.0.22/create.sql.gz
## mysql -u用户名 -p 数据库名


# 4. 修改配置文件/etc/zabbix/zabbix_server.conf
DBPassword=password
# 4. 修改配置文件/etc/zabbix/apache.conf
php_value date.timezone Asia/ShangHai
# 4. 修改 apache 端口 /etc/apache2/ports.conf
Listen 8088
sudo /etc/init.d/apache2 restart

# 5. 重启
systemctl restart zabbix-server zabbix-agent apache2
systemctl enable zabbix-server zabbix-agent apache2

# 6. ubuntu 20 语言设置
locales -a # 查看本地语言,没有zh-*语言包
dpkg-reconfigure locales # 拉到最后,空格选择zh-*, enter 确认,重启生效,同时可以选择默认语言

apt install ttf-wqy-microhei ttf-wqy-zenhei xfonts-intl-chinese # 重启后中文地方乱码,需要安装字体支持中文

yum install wqy-microhei-fonts -y
\cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf