一、监控软件选型
1、Cacti
Cacti是一套基于PHP,mysql,snmp,RRD tools开发的检测图形分析工具。Cacti是使用轮询的方式由 主服务器向设备发送数据请求来获取设备上转台数据信息。如果设备不断的增多,轮询就非常耗时,监控平台 最重要的东西就是实时性,如果一个监控的数据不具备实时性,那么这个监控就毫无意义,cacti因为轮询消 耗时间过长,导致无法获取设备的最新状态,所以cacti在大规模的监控场景,能力有限。cacti在早期的时 候不支持数据异常报警。
2、Nagios
Nagios是一款开源的免费网络监控报警服务,能监控windows,linux,unix等主机状态和主机信息。而且 nagios可以根据监控获得的数据第一时间进行报警。nagios扩展性非常好,支持数万台服务器或者上千台网 络设备的监控。nagios无法将多个相同应用及的数据整合起来,也不能监控到集群中特殊节点的迁移和恢复。
3、Ganglia
目前用于hadoop平台的监控。主要是用来监控系统性能,如:cpu 、mem、硬盘利用率, I/O负载、网络流量情况等,通过曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源,提高系统整体性能起到重要作用。
4、Zabbix
zabbix是一个基于web界面的提供分布式系统监控以及网络监控功能的企业级开源解决方案。zabbix能监 控各种网络参数,保证服务器系统的安全运行,并且能够提供灵活的通知报警机制让系统管理员能快速的发现 问题,定位问题,解决问题。
zabbix除了支持主动模式之外还支持被动模式。所谓的主动还是被动针对的是agent,agent向zabbix的 server发送数据,就表示是主动模式,agent被动的等待server来提取数据,就是被动模式。
zabbix支持分布式的架构,可以采用zabbix proxy的方式来实现监控平台的轻松扩容,可以简单的实现 多数据中心多云平台监控。你想要扩容,搭建zabbix proxy即可。
zabbix支持多种报警,短信(SMS),邮件,语音,微软的team,企业微信,钉钉….
zabbix有非常漂亮的web界面(相对的),但是又不仅仅只是显示监控的数据,还可以通过web对监控内容 进行调整和配置,还支持多用户访问,以及外部身份认证与的集成。
zabbix是免费的。是开源的,是对公众可以任意使用的。虽然zabbix是开源的免费的,但是如果运维人员 的水平不够可能也没办法发挥zabbix的全部功能,一般对于开源监控平台来说,如果想玩到高级的程度,必 须要具备开发的知识。这个知识针对中小型的公司,需要运维人员对监控平台进行维护和问题发现以及问题处 理,对开发人员要求动态实时的定制需要监控的内容。所以说商机就来了,有很多公司提供zabbix的技术支 持,zabbix社区就是这些众多提供商业支持的最大的一家公司。
5、上述监控工具的区别
nagios的图形也不好看,虽然可以安装图形插件,但是也不好看。nagios如果需要图形,也可以和cacti配 合使用。
cacti虽然监控效率低下,但是图形比nagios好看。如果采用nagios和zabbix对网络节点进行监 控,那么他们因为是并发的监控,所以对cpu的要求很高(其实也不是特别高),是高是低取决于你设置的监 控项的数量,以及监控数据提取周期。
zabbix相比于nagios在功能上和性能上都强大一些,zabbix的图形 比nagios要好看(相对的)。
zabbix支持分部署。zabbi支持web配置,配置简单,zabbix支持自动发现 (我们一般会使用xml文件批量导入代替自动发现)。
二、Zabbix简介
是一个高度集成的网络监控解决方案,可以提供企业级的开源分布式监控解决方案,由一个国外的团队持续维护更新,软件可以自由下载使用,运作团队靠提供收费的技术支持赢利。
zabbix是一个基于Web界面的,提供分布式系统监控以及网络监视功能的企业级的开源解决方案。
zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
zabbix主要由2部分构成zabbix server和zabbix agent,可选组建zabbix proxy。
zabbix server可以通过SNMP,zabbix agent,fping端口监视等方法对远程服务器或网络状态完成监视,数据收集等功能。同时支持Linux以及Unix平台,Windows平台只能安装客户端。
zabbix 功能:
-
具备常见的商业监控软件所具备的功能(主机的性能监控、网络设备性能监控、数据库、性能监控、FTP 等通用协议监控、多种告警方式、详细的报表图表绘制);
-
支持自动发现网络设备和服务器(可以通过配置自动发现服务器规则来实现);
-
支持自动发现(low discovery)key 实现动态监控项的批量监控(需写脚本);
-
支持分布式,能集中展示、管理分布式的监控点;
-
扩展性强,server 提供通用接口(api 功能),可以自己开发完善各类监控(根据相关接口编写程序实现)编写插件容易,可以自定义监控项,报警级别的设置;
-
数据收集;
-
可用和性能检测;
-
支持snmp(包括trapping and polling),IPMI,JMX,SSH,TELNET;
-
自定义的检测;
-
自定义收集数据的频率;
-
服务器/代理和客户端模式;
-
灵活的触发器;
-
可以定义非常灵活的问题阈值,称为触发器,从后端数据库的参考值;
-
高可定制的报警;
-
发送通知,可定制的报警升级,收件人,媒体类型;
-
通知可以使用宏变量有用的变量;
-
自动操作包括远程命令;
-
实时的绘图功能;
-
监控项实时的将数据绘制在图形上面 WEB 监控能力 ZABBIX 可以模拟鼠标点击了一个网站,并检查返回值和响应时间;
Api 功能:
应用api功能,可以方便的和其他系统结合,包括手机客户端的使用。
更多功能请查看:
zabbix版本:
- Zabbix 3.0 Manual
- Zabbix 2.4 Manual
- Zabbix 2.2 Manual
- Zabbix 2.0 Manual
下载地址: 本次采用yum安装,安装zabbix3.0.使用Centos7
zabbix优缺点:
优点:
- 开源,无软件成本投入;
- 自动发现服务器和网络设备,并套用模板监控;
- 分布式的监控体系和集中式的web管理,对大型监控扩展有很好的支持;
- 支持多种协议设备监控;
- 可以针对报警默认进行固定操作,降低人为操作失误风险以及人员成本;
- Api 的支持,方便与其他系统结合;
缺点:
- 需在被监控主机上安装agent,所有数据都存在数据库里,产生的数据据很大,瓶颈主要在数据库;
三、Zabbix安装部署
1、Zabbix架构
Zabbix 通过C/S 模式采集数据,通过B/S模式在web 端展示和配置。
被监控端:主机通过安装agent 方式采集数据,网络设备通过SNMP 方式采集数据。
Server 端:通过收集SNMP 和agent 发送的数据,写入数据库(MySQL,ORACLE 等),再通过php+apache 在web 前端展示。
1)名词解析
zabbix-server:zabbix的控制中心,收集数据,写入数据;
zabbix-agent:部署在被监控端的一个程序,用于收集本机信息给服务端;
host:服务器;
item:监控项,例如监控cpu平均负载就是一个监控项,每隔一段时间获取一个值反馈到服务端;
trigger:触发器,一些逻辑规则的组合,他有三个值,正常,异常,未知。当监控项获取的值达到设定的阈值的时候,就会触发;
action:当trigger符合某个值的时候,就会触发操作,比如发送邮件;
2)zabbix 运行条件
Server:Zabbix Server 需运行在LAMP(Linux+Apache+Mysql+PHP)环境下(或者LNMP),对硬件要求低。
Agent:目前已有的agent 基本支持市面常见的OS,包含Linux、HPUX、Solaris、Sun、 windows
SNMP:支持各类常见的网络设备 SNMP(Simple Network Management Protocol,简单网络管理协议。
3)监控类型
硬件监控适用于物理机、远程管理卡(iDRAC),IPMI(只能平台管理接口)
ipmitools:,MegaCli(查看Raid磁盘) 系统监控: 监控cpt:lscpu、uptime、top、vmstat 1 、mpstat 1、htop;
- 监控内存: free -m;
- 监控硬盘: df -h、iotop;
- 监控网络: iftop、netstat、ss;
- 应用服务监控: nfs、MySQL、nginx、apache、php、rsync;
更详细的监控类型可以参考:
4)引入zabbix
所有监控范畴,都可以整合到Zabbix中:
- 硬件监控:Zabbix、IPMI、lnterface;
- 系统监控:Zabbix、Agent、Interface;
- Java监控:Zabbix、JMX、lnterface;
- 网络设备监控:Zabbix、SNMP、lnterface;
- 应用服务监控:Zabbix、Agent、UserParameter;
- MySQL数据库监控:percona-monitoring-plulgins;
- URL监控:Zabbix Web监控;
5)zabbix进程
zabbix_agentd:客户端守护进程,此进程收集客户端数据,例如cpu负载、内存、硬盘使用情况等。
zabbix_get:zabbix工具,单独使用的命令,通常在server或者proxy端执行获取远程客户端信息的命令。通常用户排错。例如在server端获取不到客户端的内存数据,我们可以使用zabbix_get获取客户端的内容的方式来做故障排查。
zabbix_sender:zabbix工具,用于发送数据给server或者proxy,通常用于耗时比较长的检查。很多检查非常耗时间,导致zabbix超时。于是我们在脚本执行完毕之后,使用sender主动提交数据。
zabbix_server:zabbix服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway的数据最终都是提交到server。
备注:当然不是数据都是主动提交给zabbix_server,也有的是server主动去取数据。
zabbix_proxy:zabbix代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到server里。为什么要用代理?代理是做什么的?卖个关子,请继续关注运维生存时间zabbix教程系列。
zabbix_java_gateway:zabbix2.0之后引入的一个功能。顾名思义:Java网关,类似agentd,但是只用于Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy。
2、centos安装部署 zabbix-5.0
5.0和之前3.4相差不大,首页相比之前更加的美化。
1. 在选择版本和机器型号,可以手动下载
2. 安装zabbix可用源和替换加速器。
rpm -Uvh https://repo.zabbix.com/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 yum clean all && yum makecache
3. 安装组件
yum -y install zabbix-server-mysql zabbix-agent
4. 安装管理器
yum -y install yum-utils``yum-config-manager --enable rhel-server-rhscl-7-rpms
5. 修改开启验证
vim /etc/yum.repos.d/zabbix.repo [zabbix-frontend] ... enabled=1 ...
6. 安装nginx和mysql依赖包
yum install centos-release-scl -y yum -y install zabbix-web-mysql-scl zabbix-nginx-conf-scl yum -y install mariadb-server``systemctl enable --now mariadb
7. 创建用户
mysql -uroot -p create database zabbix character set utf8 collate utf8_bin; create user zabbix@localhost identified by 'password'; grant all privileges on zabbix.* to zabbix@localhost; quit;
8. 引入初始架构和数据,系统将提示您输入新创建的密码
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
9. 为Zabbix服务器配置数据库,编辑配置文件
vim /etc/zabbix/zabbix_server.conf DBPassword=password
10. 为Zabbix前端配置PHP,编辑配置文件
vim /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf listen 80; server_name 1.1.1.1;
11. 添加和打开注释
vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf, add nginx to listen.acl_users directive listen.acl_users = apache,nginx php_value[date.timezone] = Europe/Riga
12. 启动Zabbix服务器和代理进程 启动Zabbix服务器和代理进程,并为它们的设置开机自启:
systemctl restart zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm systemctl enable zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm
13. 默认密码 Admin zabbix
3、zabbix分布式代理proxy部署
zabbix proxy可以代替zabbix server检索客户端的数据,然后把数据汇报给zabbix server,并且在一定程度上分担了zabbix server的压力.zabbix proxy可以非常简便的实现了集中式、分布式监控。
应用场景
- 不同网段,无法直接监控
- 上千台机器,分布式
proxy收集到数据之后,首先将数据缓存在本地,然后在一定得时间之后传递给zabbix server。
zabbix proxy是一个数据收集器,它不计算触发器、不处理事件、不发送报警。
1)环境
- 服务端 192.168.1.100
- 代理端 192.168.1.20 10.10.10.20
- 客户端 10.10.10.30
服务端可以连接代理端,但无法连接客户端。
2)代理端配置
配置数据库:
这里使用mysql数据库,自行安装数据库。
登陆数据库后:
create database zabbix_proxy character set utf8; GRANT ALL PRIVILEGES ON zabbix_proxy.* TO 'zabbix'@'localhost' IDENTIFIED BY '123456'; flush PRIVILEGES;
安装代理:
yum -y install gcc gcc-c++ libcurl-devel libevent-devel net-snmp-devel wget https://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/3.4.6/zabbix-3.4.6.tar.gz/download tar -xf zabbix-3.4.6.tar.gz cd zabbix-3.4.6 ./configure --prefix=/usr/local/zabbix_proxy --enable-proxy --enable-agent --with-mysql --with-net-snmp --with-libcurl make make install
导入数据:
mysql -u zabbix -p 123456 zabbix_proxy < database/mysql/schema.sql
配置:
找到下面那些去修改,有的是注释,有的则不是:
vim /usr/local/zabbix_proxy/etc/zabbix_proxy.conf Server=192.168.1.100 #服务端的ip,用来提交数据 ServerPort=10051 #代理监听的端口 Hostname=Zabbix proxy #proxy的hostname,很重要,要记住 DBHost=localhost #数据库,使用本地,也可以使用ip,本地的用sock链接 DBSocket=/tmp/mysql.sock #本地链接时修改 DBName=zabbix_proxy #数据库名称 DBUser=zabbix #用户 DBPassword=zabbix #密码 DBPort=3306 #数据库端口 HeartbeatFrequency=60 #心跳线(具体作用网了,看配置文件吧,这个默认就是60) ConfigFrequency=60 #这个是往服务端发送数据时间,这里设置一分钟,当客户端出现问题,要一分钟后才能获得消息,可以修改
vim /usr/local/zabbix/etc/zabbix_agentd.conf Server=192.168.1.100 ServerActive=192.168.1.100
/usr/local/zabbix/sbin/zabbix_proxy /usr/local/zabbix/sbin/zabbix_agentd
修改后启动:
netstat -unltp | grep :10050 netstat -unltp | grep :10051
查看是否监听端口。
到服务端添加一台主机,ip为192.168.1.20,相当于添加一个客户端。
3)客户端配置
在客户端机器上:
yum -y install zabbix-agent
添加代理ip:
vim /etc/zabbix/zabbix_agentd.conf Server=10.10.10.20 ServerActive=10.10.10.20
systemctl start zabbix-agent netstat -unltp | grep :10050
查看是否监听端口。
4)服务端配置
点击创建:
代理名称是创建那个,用于区分不同代理,选择主动式,代理主动提交数据。
到:
ip选择代理所能接触到的ip,在最下面选择代理,并且添加模板:
4、Centos7快速搭建zabbix 4.4
环境准备:
Linux 7.7.1908 nginx 1.16.1 zabbix-server 4.4 zabbix-agent 4.4 mysql 5.7.29 php 5.4.16
1. 包下载
wget https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm
2. 关闭防火墙及selinux
systemctl stop firewalld && systemctl disable firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/'/etc/selinux/config
1)zabbix安装配置
1. 安装Zabbix服务器、前端、代理
rpm -i https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent -y
2. 配置Zabbix-server
mv /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.bak vim /etc/zabbix/zabbix_server.conf LogFile=/var/log/zabbix/zabbix_server.log LogFileSize=0 PidFile=/var/run/zabbix/zabbix_server.pid SocketDir=/var/run/zabbix DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=zabbix DBPort=3306 SNMPTrapperFile=/var/log/snmptrap/snmptrap.log CacheSize=1024M Timeout=4 AlertScriptsPath=/usr/lib/zabbix/alertscripts ExternalScripts=/usr/lib/zabbix/externalscripts LogSlowQueries=3000
3. 配置zabbix-agent
mv /etc/zabbix/zabbix_agent.conf /etc/zabbix/zabbix_agent.conf.bak vim /etc/zabbix/zabbix_agentd.conf PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server= ListenPort=10050 ServerActive= Hostname= Include=/etc/zabbix/zabbix_agentd.d/
2)数据库安装配置
1. 安装数据库
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm yum localinstall mysql57-community-release-el7-8.noarch.rpm -y
2. 检查mysql源是否安装成功
yum repolist enabled | grep mysql.*-community.* yum install mysql-community-server -y
3. 启动MySQL服务
systemctl start mysqld
4. 登录数据库
grep 'temporary password' /var/log/mysqld.log mysql -uroot -p
修改密码,Lenvoo@123是你的新密码:
mysql> SET PASSWORD = PASSWORD('Lenovo@123');
如何解决ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 呢?
set global validate_password_policy=0; #再修改密码的长度 set global validate_password_length=1; #再次执行修改密码就可以了 ALTER USER 'root'@'localhost' IDENTIFIED BY 'Lenovo@123'; #允许root远程登陆* GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Lenovo@123' WITH GRANT OPTION;
5. 创建zabbix数据库和用户
mysql –uroot –p mysql> create database zabbix character set utf8; Query OK, 1 row affected (0.00 sec) mysql> grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'zabbix'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
6. 导入模板数据
方法1:
source /usr/share/doc/zabbix-server-mysql-4.4.1/create/schema.sql source /usr/share/doc/zabbix-server-mysql-4.4.1/create/images.sql source /usr/share/doc/zabbix-server-mysql-4.4.1/create/data.sql
方法2:
zcat /usr/share/docc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
3)nginx安装配置
1. 安装nginx
yum install nginx -y
2. 配置nginx
vim /etc/nginx/conf.d/default.conf ... location / { root /usr/share/zabbix; index index.php; } ... location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/zabbix$fastcgi_script_name; include fastcgi_params; } ...
3. 修改zabbix前端文件权限
chown nginx:nginx /usr/share/zabbix/* chmod -R 755 /usr/share/zabbix/*
4. 启动nginx
systemctl restart nginx
5. PHP安装配置
yum install php-fpm php-gd php-mbstring php-bcmath php-gd php-xmlwriter php-xmlreader -y
6. 修改配置文件
sed -i s#max_execution_time = 30#max_execution_time = 600#g /etc/php.ini sed -i s#max_input_time = 60#max_input_time = 600#g /etc/php.ini sed -i s#memory_limit = 128M#memory_limit = 256M#g /etc/php.ini sed -i s#post_max_size = 8M#post_max_size = 32M#g /etc/php.ini sed -i s#upload_max_filesize = 2M#upload_max_filesize = 16M#g /etc/php.ini sed -i s/;date.timezone =/date.timezone = Asia/Shanghai/g /etc/php.ini
7. 启动php-fpm
systemctl start php-fpm
8. 启动所有服务
systemctl start zabbix-server systemctl start zabbix-agent systemctl start nginx systemctl start mysqld systemctl start php-fpm
9. 设置开机启动项
systemctl enable zabbix-server zabbix-agent mysqld nginx php-fpm
10. 检查端口
[root@zabbix-server]# netstat -pntl tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 5118/php-fpm: maste tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5046/nginx: master tcp6 0 0 :::10050 :::* LISTEN 5577/zabbix_agentd tcp6 0 0 :::10051 :::* LISTEN 4821/zabbix_server tcp6 0 0 :::3306 :::* LISTEN 1703/mysqld
11.连接到新安装的Zabbix前端:
5、Centos7快速搭建Zabbix3.4
zabbix-server主要分为2部分:
- zabbix程序 程序根据客户端的监控项,从客户端获取数据并写入到数据库,再根据触发器/动作等配置进行操作。
- 展示页面 使用php编写,php脚本从数据库获得信息,用httpd或者nginx等网页服务器展示出来。
根据上述说明,zabbix需要部署在lamp或者lnmp上面,对于php页面来说,用apache好一些。
1)环境
[zabbix-server] 主机名 = host-1 系统 = centos-7.3 地址 = 1.1.1.1 软件 = httpd-2.4 80 mariadb-5.5 3306 php-fpm-5.4 9000 zabbix-server-3.4 10051 [zabbix-agent] 主机名 = host-2 系统 = centos-7.3 地址 = 1.1.1.2 软件 = zabbix-agent-3.4 10050
2)配置
配置服务端程序:
操作服务器(host-1)
安装依赖包:
yum -y install gcc gcc-c++ libevent-devel php-bcmath php-gd php-xml php-mbstring
创建账号,为安全起见禁止登录:
groupadd zabbix useradd -g zabbix -s /sbin/nologin zabbix
下载源码包:
wget https://shell-auto-install.oss-cn-zhangjiakou.aliyuncs.com/package/zabbix-3.4.1.tar.gz tar -xf zabbix-3.4.1.tar.gz cd zabbix-3.4.1
选择参数,当前只开启了服务端,其余编译参数请看 ‘附录’:
./configure --prefix=/usr/local/zabbix --enable-server --with-mysql
6. 编译安装
make install
7. 将php脚本复制到html目录下
cp -r frontends/php/* /var/www/html/
8. 添加所有权限到php脚本,当然这种方式比较危险,具体在zabbix前端页面会说明对哪些脚本要权限,逐个改
chmod -R 777 /var/www/html
9. 登陆mariadb并创建zabbix用户,当前mariadb无密码
MariaDB [(none)]> create database zabbixdb character set utf8; MariaDB [(none)]>grant all on zabbixdb.* to zabbixuser@"localhost" identified by "123456"; MariaDB [(none)]>quit
10. 按顺序导入zabbix自带的数据库
mysql -uzabbixuser -p123456 zabbixdb < database/mysql/schema.sql mysql -uzabbixuser -p123456 zabbixdb < database/mysql/images.sql mysql -uzabbixuser -p123456 zabbixdb < database/mysql/data.sql
11. 修改php参数,符合zabbix要求
vim /etc/php.ini post_max_size = 16M max_execution_time = 300 max_input_time = 300 date.timezone = Asia/Shanghai
12. 重启服务
systemctl restart httpd php-fpm
3)配置服务端网页
操作服务器(host-1)
1.访问
2. LDAP是特殊配置,不用管
3. 数据库:zabbixdb 账号:zabbixuser 密码:123456
4. 地址和端口都默认,Name可以不写或者随便写
5. 确定信息后下一步即可
6. 若遇到这一步,是因为zabbix对/var/www/html/conf/没有权限或者没写写进去。需要手动将文件下载,然后传入到服务器的/var/www/html/conf/zabbix.conf.php中刷新即可
7. 登录,设置为中文。管理员:admin 密码:zabbix
更改为中文后,update更新:
最下面或提示zabbix-server未启动,下面将启动zabbix服务端:
4)启动zabbix-server
操作服务器(host-1)
1. 复制并修改启动脚本,将安装目录替换为设置目录
cp misc/init.d/fedora/core/zabbix_server /etc/init.d/ chmod +x /etc/init.d/zabbix_server vim /etc/init.d/zabbix_server BASEDIR=/usr/local/zabbix
2. 修改配置文件,填写数据库信息,前端页面是告诉php脚本从哪个数据库获得信息展示,这里告诉后端程序将收集的信息写入哪个数据库
vim /usr/local/zabbix/etc/zabbix_server.conf DBName=zabbixdb #数据库名 DBUser=zabbixuser #数据库用户名 DBPassword=123456 #数据库用户密码
3. 启动并检查端口是否正常,因为很多时候显示启动但并没有真正启动
/etc/init.d/zabbix_server start netstat -utnalp | grep :10051
4. 查看前端页面,会发现正常了
5)配置客户端
操作服务器(host-2)
1. zabbix客户端可以有版本小差异,服务端3.4版本,客户端3.2版本也可以
wget https://shell-auto-install.oss-cn-zhangjiakou.aliyuncs.com/package/zabbix-agent-3.4.1-1.el7.x86_64.rpm
2. 安装
yum -y install zabbix-agent-3.4.1-1.el7.x86_64.rpm
3. 清空配置后,编写配置,其它参数后面安装文档再加
> /etc/zabbix/zabbix_agentd.conf
4. 当前配置是被动与主动模式都开启,方便后期调节
vim /etc/zabbix/zabbix_agentd.conf #指定pid文件位置 PidFile=/var/run/zabbix/zabbix_agentd.pid #指定日志文件位置 LogFile=/var/log/zabbix/zabbix_agentd.log #设置为被动模式,将开启端口 StartAgents=3 #当前的主机名,要写正确,否则服务端会不识别 Hostname=host-2 #服务端的地址,用逗号(,)可以隔开写多个 Server=1.1.1.1 #服务端的地址,用逗号(,)可以隔开写多个 ServerActive=1.1.1.1 #自定义的脚本超时时间, Timeout=8 #允许自定义脚本 UnsafeUserParameters=1 #加载其它配置文件 Include=/etc/zabbix/zabbix_agentd.d/*.conf
5. 启动效验
systemctl start zabbix-agent systemctl enable zabbix-agent netstat -unltp | grep 10050
6)测试
操作服务器(host-1)
1. 添加
2. 配置主机信息
3. 添加模板,连接模板后,主机将被模板所带的监控项监控
4. 一般选择Template OS Linux,先点击添加,再添加,不然模板连接不上
5. 等一分钟,ZBX灯亮
7)附录
编译参数:
1. 第一行是添加这个参数,需要安装的yum包,第二行是参数名
net-snmap-devel --with-net-snmp libcurl-devel curl-devel --with-libcurl libxml2-devel --with-libxml2 OpenIPMI-devel --with-openipmi unixODBC-devel --with-unixodbc
导入其余数据库:
1. postgresql导入
psql -U username psql> create database zabbix; psql > q cd database/postgresql psql -U username zabbix < database/postgresql/schema.sql psql -U username zabbix < database/postgresql/images.sql psql -U username zabbix < database/postgresql/data.sql
2. oracle导入
sqlplus zabbix/password@host/ORCL sqlplus>@database/oracle/schema.sql sqlplus>@database/oracle/images.sql sqlplus>@database/oracle/data.sql
四、Zabbix配置管理
1、zabbix批量修改主机名
通过zabbix开放的api进行批量操作,默认主机名是IP地址,尤其是自动发现的时候批量添加,如果挨个手动改会很累,这里配置批量加入。
新建文件ips.txt:
主机名 IP 主机名 IP 主机名 IP
批量更新主机名:
#!/usr/bin/python3 # _*_ coding:utf-8 _*_ import json import requests #zabbix服务器的IP地址 zabbix_ip = "127.0.0.1" #zabbix的用户名 zabbix_user = "Admin" #zabbix的密码 zabbix_pass = "123456" #zabbix api接口地址 url = "http://" + zabbix_ip + ":8000/api_jsonrpc.php" #zabbix api定义的访问头部信息 post_header = {'Content-Type': 'application/json'} # 调用zabbix api需要身份令牌auth def get_auth(): post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": zabbix_user, "password": zabbix_pass }, "id": "1" } ret = requests.post(url, data=json.dumps(post_data), headers=post_header) zabbix_ret = json.loads(ret.text) print(zabbix_ret) if 'result' not in zabbix_ret: print('login error') else: auth = zabbix_ret.get('result') return auth # 以IP信息获取主机id def get_hostid(): hostid_get = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": "extend", "filter": { "host": [ host_ip ] } }, "auth": Token, "id": 2, } res2 = requests.post(url, data=json.dumps(hostid_get), headers=post_header) res3 = res2.json() #print(res3) res4 = res3['result'] try: host_id = res4[0]['hostid'] return host_id except: print("zabbix中不存在,跳过") return "不行" # 以主机ID来修改主机名 def update_hostname(): hostname_update = { "jsonrpc": "2.0", "method": "host.update", "params": { "hostid": host_id, "name": host_name }, "auth": Token, "id": 3 } res10 = requests.post(url, data=json.dumps(hostname_update), headers=post_header) res11 = res10.json() #print(res11) if __name__ == '__main__': ''' ips.txt里的文件内容: 主机名1 ip1 主机名2 ip2 主机名3 ip3 ''' with open("ips.txt", "r", encoding="utf8") as f: for line in f: line = line.split(" ") host_name = line[0] host_ip = line[1].strip() #print(host_name) #print(host_ip) Token = get_auth() #print(Token) host_id = get_hostid() if host_id == "不行": continue #print(host_id) update_hostname() print(host_name,host_ip,"已添加完成")
2、Zabbix常用监控项详解
zabbix自带很多模板,包含非常多的监控项可以满足系统层面的大部分要求。
模板有版本要求,有的zabbix-server是4.4版本,但客户端是3.2版本,可能会导致不支持此项监控,具体可以查看主机-》监控项,尽量让客户端和服务端版本一致。
以下是收集的zabbix-5.0上[Template OS Linux by Zabbix agent]模板的监控项,都是根据内容手工翻译的。推荐频率属于比较稳定的,具体根据需求配置。对于机器多的,可以让部分不重要(不搭配触发器)的监控项1h采集一次,减缓压力。
一天 1d 一小时 1h 一分钟 1m 1秒 1s。
基础监控:
归类 | 名称 | 键值 | 推荐频率 |
---|---|---|---|
客户端 | zabbix客户端名称 | agent.hostname | 1h |
客户端是否ping通 | agent.ping | 1m | |
客户端版本 | agent.version | 1h | |
客户端是否可用 | zabbix[host,agent,available] | 1m | |
网络(ddl) | 网卡类型 | vfs.file.contents[“/sys/class/net/{#IFNAME}/type”] | 1h |
运行状态 | vfs.file.contents[“/sys/class/net/{#IFNAME}/operstate”] | 1m | |
网卡出接口每秒报文被丢弃数 | net.if.out[“{#IFNAME}”,dropped] | 3m | |
网卡进接口每秒报文被丢弃数 | net.if.in[“{#IFNAME}”,dropped] | 3m | |
网卡出接口每秒流量bps | net.if.out[“{#IFNAME}”] | 3m | |
网卡进接口每秒流量bps | net.if.in[“{#IFNAME}”] | 3m | |
网卡出接口每秒错误数据包数 | net.if.out[“{#IFNAME}”,errors] | 3m | |
网卡进接口每秒错误数据包数 | net.if.in[“{#IFNAME}”,errors] | 3m | |
内存 | 系统中总共swap | system.swap.size[,total] | 1h |
系统可用swap | system.swap.size[,free] | 1m | |
系统可用swap百分比 | system.swap.size[,pfree] | 1m | |
系统总共内存 | vm.memory.size[total] | 1h | |
系统中可用内存 | vm.memory.size[available] | 1m | |
系统可用内存百分比 | vm.memory.size[pavailable] | 1m | |
系统中已用内存百分比 | |||
系统信息 | 系统主机名 | system.hostname | 1h |
系统本地时间 | system.localtime | 1h | |
操作系统架构 | system.sw.arch | 1h | |
系统版本信息 | system.sw.os | 1h | |
系统安装包信息 | system.sw.packages | 1h | |
系统详细信息 | system.uname | 1h | |
系统运行持续时间 | system.uptime | 1h | |
系统开机时间 | system.boottime | 1h | |
系统配置的最大文件描述符数 | kernel.maxfiles | 1h | |
系统配置的最大进程数 | kernel.maxproc | 1h | |
系统中总共进程数 | proc.num | 1m | |
系统中正在运行的进程数 | proc.num[,,run] | 1m | |
登陆用户数 | system.users.num | 10m | |
系统中/etc/passwd文件的md5值 | vfs.file.cksum[/etc/passwd] | 15m | |
磁盘(ddl) | 可用inode百分比 | vfs.fs.inode[{#FSNAME},pfree] | 1m |
磁盘总共空间 | vfs.fs.size[{#FSNAME},total] | 1m | |
磁盘已用空间 | vfs.fs.size[{#FSNAME},used] | 1m | |
磁盘已用空间百分比 | vfs.fs.size[{#FSNAME},pused] | 1m | |
cpu | 系统cpu的1分钟负载 | system.cpu.load[all,avg1] | 1m |
系统cpu的5分钟负载 | system.cpu.load[all,avg5] | 1m | |
系统cpu的15分钟内负载 | system.cpu.load[all,avg15] | 1m | |
系统cpu核心数 | system.cpu.num | 1h | |
系统cpu每秒中断数 | system.cpu.intr | 1m | |
系统cpu的每秒上下文切换数 | system.cpu.switches | 1m | |
系统cpu用户空间使用百分比 | system.cpu.util[,user] | 1m | |
系统cpu的io操作使用百分比 | system.cpu.util[,iowait] | 1m | |
系统cpu的硬中断使用百分比 | system.cpu.util[,interrupt] | 1m | |
系统cpu的空闲时间占用百分比 | system.cpu.util[,idle] | 1m | |
系统cpu的软中断使用百分比 | system.cpu.util[,softirq] | 1m | |
系统cpu系统空间使用百分比 | system.cpu.util[,system] | 1m | |
系统cpu虚拟化使用百分比 | system.cpu.util[,steal] | 1m | |
系统cpu进程优先级变更使用的百分比 | system.cpu.util[,nice] | 1m |
3、zabbix上的宏(macro)介绍
Zabbix支持许多在多种情况下使用的宏。宏是一个变量,由如下特殊语法标识:MACRO
有效地使用宏可以节省时间,并使Zabbix变地更加高效。
在一个的典型用途中,宏可以用于模板中。因此,模板的触发器可能命名为“{HOST.NAME}的mysql{#MYSQLPORT} 端口已宕掉,请注意查看!”。
当这个模板应用在主机( 飞龙在天roledb-192.168.1.100)时,并且当触发器展示在监控页面上时,触发器的名称将解析为“飞龙在天roledb-192.168.1.100的mysql3306 端口已宕掉,请注意查看!”。
1)宏的优先级
1. 主机宏(HOST)–优先级最高 直接在主机上进行设置
2. 主机模板定义的宏–优先级次之。,如果有多个模板,那么按照模板越靠前那么宏的优先级越高(Template) 在模板上进行设置
3. 全局宏(Global)–优先级最低
2)宏的使用实例
1. 模板中使用
zabbix-5.0中Template Module Linux memory by Zabbix agent模板自带的宏有如下:
原本是大于90持续5分钟报警,现在用变量表示了,好处是可以定义90这个数字做变量然后在模板中多处使用,以后改对应宏,相应判断就都变了。
2. 主机中使用 当我们在监控主机时,不同的主机可能有不同的参数(比如不同的密码、端口),这时就需要针对单台主机进行宏变量设置。因为主机上的宏优先级最高。
3)支持的宏
4、zabbix硬件性能需求
1)硬件需求
无非就是cpu、内存、硬盘之类的
1. CPU 由你的zabbix数据库使用情况来做决定,如果你监控的项目越多,那你的cpu要越好。具体多好,下面有个表格
2. 内存与硬盘 最基本的需求:128MB内存、256MB硬盘,当然这样的机器这年头应该找不到了吧,尤其要说明硬盘的问题,你的监控项越多、历史记录保留时间的越久数据库将会越大。我所知道的100来台服务器,做基本的cpu、内存、硬盘、网卡流量等监控,长年累月下来大概60GB左右。
3. 其他硬件 如果你觉得有必要的话,你再准备一个GSM短信猫吧,不过很少人用,基本上都使用email或者飞信报警.
4. 硬件需求表
如上,P2的CPU、256MB内存已经可以监控20个主机。AMD 3200+/2G内存可以监控500个主机(05年大学的时候,中低端主流cpu,这都快10年了,尤其可见zabbix对服务器的硬件配置要求有多低),现在的服务器一般都比上面最高配还来得高,所以我武断的认为,大家手头的服务器都有能力监控1w+以上的服务器,我再武断的认为手头上有1w+服务器的公司能有多少。
2)操作系统
支持如下平台,平台之多让人刮目相看,但是window只能跑客户端 Linux IBM AIX FreeBSD NetBSD OpenBSD HP-UX Mac OS X Solaris Windows: 2000, Server 2003, XP, Vista, Server 2008, 7, 8, Server 2012 (只能跑Zabbix agent)
3)数据库硬盘
100台服务器,每台服务器有30个监控项,每个监控项60秒刷新一次,需要多大的硬盘呢? 众所周知,zabbix基本都是通过web配置,这些配置数据也是存放到数据库里的,但是它对硬盘容量的要求基本可以忽略不计,zabbix对硬盘的决定性因素有4个,如下:
1. 每秒处理的数据量 这个问题不说,大家也明白。这边的每秒只是一个平均值,例如我有3000个监控项,每60秒刷新一次,那么平均每秒有50(3000/60)个数据要处理。就是说每秒有50条数据要插入MySQL
2. 历史记录保存时间 zabbix对每个监控项的值都要记录下来,这些记录一般保留几周到几个月,具体看你的配置了。每个值都需要暂用硬盘空间。假如一个数据你要保留30天,而且每秒有50个值要保留,那我们一共有129,600,000(30天24小时3600秒)50个值,一条记录多大,由你的数据库引擎和你存储的数据类型来决定(浮点型,整形,字符型等等),一般来说一条记录需要占用50个字节(一个大概值),在这个案例中129,600,000个记录大约需要(12960000050字节)6.5G的硬盘空间
3. 趋势数据保存时间 什么是趋势数据呢?当你查看一周或者一月的图表,图表上看到的MAX/MIN/AVG/COUNT都是取自趋势数据,趋势数据一小时获取一次,一般情况下,趋势数据一条记录大概占用128字节,如果我们想保存5年趋势数据,3000个监控线需要2.4GB(3000个24小时356天*128字节)每年,5年一共16.8G
4. 事件记录保存时间 报警、警告、恢复等等事情,一个事件大概占用130个字节,一般情况下不会太多,除非运维做的太糟糕,或者运维要求太严格,把阀值调的很低。假如这个运维今年本命年,既没拜佛有没烧香,更别说给服务器贴灵符,于是这一年每秒钟就有一个事件发生,那么事件这一年占用的数据空间为:1年365天24小时3600秒130字节大概为4.1G空间。
5. 数据库空间计算公式 zabbix配置:固定大小,一般<10MB 历史数据:天数*(监控项总数/刷新频率)24小时3600秒50字节 趋势数据:天数(监控项总数/3600)24小时3600秒128字节 事件数据:天数事件个数(大概值)24小时3600秒*130字节
6. 最后 看到这里,大家都心里有数据了,数据库硬盘空间=配置文件大小+历史记录+趋势记录+事件记录。虽然这个硬盘会不停的增长,但是总有一天会停止增长,空间一直保持不变,zabbix会定时清理。
5、zabbix-server 服务端配置详解
# This is a configuration file for Zabbix server daemon # To get more information about Zabbix, visit http://www.zabbix.com ############ GENERAL PARAMETERS ################# #监听的端口 # # Mandatory: no # Range: 1024-32767 # ListenPort=10051 #在连接其它服务器时,使用的本机ip地址 # # Mandatory: no # SourceIP= #日志的类型 # # Mandatory: no # LogType=file #存放日志的位置,不设置,则使用syslog # # Mandatory: no # Default: LogFile=/tmp/zabbix_server.log #单个最大日志文件大小,超过则启动新文件 #设置为0则不启动新文件,单位MB # # Mandatory: no # Range: 0-1024 # LogFileSize=1 #定义打印的日志登记。 #0:打印日志 #1:打印重要的错误日志 #2:打印错误信息 #3:打印应该信息 #4:打印调试信息 # # Mandatory: no # Range: 0-5 # DebugLevel=3 #pid文件位置 # # Mandatory: no # PidFile=/tmp/zabbix_server.pid #socket所在目录 # # Mandatory: no # SocketDir=/tmp #数据库实例的位置,如果设置为localhost,端口会使用mysql端口 #为空则用PostgreSQL的端口 # # Mandatory: no # DBHost=localhost #数据库名字。对于sqlite3,要填写数据库文件位置,而数据库用户密码不需要 # # Mandatory: yes DBName=zabbix #仅用于IBM DB2 # # Mandatory: no # DBSchema= #数据库实例用户名,对sqlite无效 # # Mandatory: no # Default: DBUser=zabbix #数据库实例密码,对sqlite无效 # # Mandatory: no # DBPassword= #mysql的socket文件路径 # # Mandatory: no # DBSocket=/tmp/mysql.sock #mysql端口 # # Mandatory: no # Range: 1024-65535 # DBPort=3306 ############ ADVANCED PARAMETERS ################ #pollers进程数,zabbix-server的工作进程 # # Mandatory: no # Range: 0-1000 # StartPollers=5 #IPMI pollers进程数 # # Mandatory: no # Range: 0-1000 # StartIPMIPollers=0 #预处理程序启动数目 # # Mandatory: no # Range: 1-1000 # StartPreprocessors=3 #检查unrechable hosts(包括IPMI)的进程数 # # Mandatory: no # Range: 0-1000 # StartPollersUnreachable=1 #trappers进程数。 #trappers接收其它hosts用zabbix_sender、active_agents、active proxies和child nodes发送的数据 #至少要一个trapper进程来前端显示zabbix-server是可用的 # # Mandatory: no # Range: 0-1000 # StartTrappers=5 #用于discover的discoverer的进程数 # # Mandatory: no # Range: 0-1000 # StartPingers=1 #未知 # # Mandatory: no # Range: 0-250 # StartDiscoverers=1 #用于http检查的进程数 # # Mandatory: no # Range: 0-1000 # StartHTTPPollers=1 #timers的进程数。 #用于处理基于时间的triggers中的function和maintainence功能 #只有第一个timer进程处理maintainence时间 # # Mandatory: no # Range: 1-1000 # StartTimers=1 #未知 # # Mandatory: no # Range: 0-100 # StartEscalators=1 #未知 # # Mandatory: no # Range: 0-100 # Default: # StartAlerters=3 #zabbix java getway使用的ip或者hostname #当java pollers启动时有效 # # Mandatory: no # JavaGateway= #java geteway使用的端口 # # Mandatory: no # Range: 1024-32767 # JavaGatewayPort=10052 #java pollers的进程数 # # Mandatory: no # Range: 0-1000 # StartJavaPollers=0 #vmware pollers的进程数 # # Mandatory: no # Range: 0-250 # StartVMwareCollectors=0 #zabbix从vmware获取监控值的频率,单位是秒 # # Mandatory: no # Range: 10-86400 # VMwareFrequency=60 #暂无 # # Mandatory: no # Range: 10-86400 # VMwarePerfFrequency=60 #vmware的缓存,存储vmware数据的共享内存大小。 #只有当vmware collectors启动时生效 # # Mandatory: no # Range: 256K-2G # VMwareCacheSize=8M #暂无 # Mandatory: no # Range: 1-300 # VMwareTimeout=10 #snmp设备在将数据发送到server前会将snmp数据存在文件中。 #必须和再zabbix_trap_receiver.pl或者snmptt配置文件中的配置相同。 # # Mandatory: no # SNMPTrapperFile=/tmp/zabbix_traps.tmp #暂无 # # Mandatory: no # Range: 0-1 # StartSNMPTrapper=0 #trappers监听的ip,用逗号分隔ip列表 # # Mandatory: no # ListenIP=0.0.0.0 #暂无 # # Mandatory: no # Range: 0-24 # HousekeepingFrequency=1 #在zabbix数据库中有一个housekeeper表,其中记录了housekeeper要执行的任务 #在一次执行housekeep的过程中,最多删除这里定义的数量,为0则无限制 #sqlite3会忽略这个参数 # # Mandatory: no # Range: 0-1000000 # MaxHousekeeperDelete=5000 #存储host、item和trigger数据的存储空间 # # Mandatory: no # Range: 128K-8G # CacheSize=8M #将配置信息同步到内存中的频率 # # Mandatory: no # Range: 1-3600 # Default: # CacheUpdateFrequency=60 #将数据同步到数据库的DBsyncers进程数 # # Mandatory: no # Range: 1-100 # StartDBSyncers=4 #存储history数据的内存大小 # # Mandatory: no # Range: 128K-2G # HistoryCacheSize=16M #暂无 # # Mandatory: no # Range: 128K-2G # HistoryIndexCacheSize=4M #存储trends数据的内存大小 # # Mandatory: no # Range: 128K-2G # Default: # TrendCacheSize=4M #history数据缓存在内存中的内存大小。 #设置为0,则不缓存 # # Mandatory: no # Range: 0,128K-64G # ValueCacheSize=8M #zabbix等待agent,snmo设备或自定义脚本的执行时间 # # Mandatory: no # Range: 1-30 Timeout=4 #trapper处理新数据的超时时间 # # Mandatory: no # Range: 1-300 # TrapperTimeout=300 #当一个host保持unreachable状态后多久将其标记为unreachable状态 # # Mandatory: no # Range: 1-3600 # UnreachablePeriod=45 #当host为unavailable状态时,检查host的availability的频率 # # Mandatory: no # Range: 1-3600 # UnavailableDelay=60 #当host为unreachable状态时,检查host的availability的频率 # # Mandatory: no # Range: 1-3600 # UnreachableDelay=15 #自定义报警脚本的位置 # # Mandatory: no # AlertScriptsPath=${datadir}/zabbix/alertscripts #自定义监控脚本的位置 # # Mandatory: no # ExternalScripts=${datadir}/zabbix/externalscripts #fping的位置,fping可执行文件的owner要设置为root,并且设置suid # # Mandatory: no # FpingLocation=/usr/sbin/fping #同花顺那个,如果fping可以处理ipv6,那么可以留空 # # Mandatory: no # Fping6Location=/usr/sbin/fping6 #使用ssh检查和action所需要的ssh公钥,私钥位置 # # Mandatory: no # SSHKeyLocation= #记录查询zabbix数据的慢查询,单位毫秒。 #只有当debuglevel设置为3/4时才会生效。 #设置为0,则不记录慢查询。 # # Mandatory: no # Range: 1-3600000 LogSlowQueries=3000 #临时文件目录 # # Mandatory: no # TmpDir=/tmp #被动proxy的poller进程数 # # Mandatory: no # Range: 0-250 # StartProxyPollers=1 #zabbix-server 将配置信息同步到proxy的频率 #支队被动的proxy生效 # # Mandatory: no # Range: 1-3600*24*7 # ProxyConfigFrequency=3600 #zabbix-server 请求proxy历史数据的频率 #支队被动的proxy生效 # Mandatory: no # Range: 1-3600 # ProxyDataFrequency=1 #是否允许server以root身份运行 #0不允许,1允许 #不允许则使用zabbix用户运行 # # Mandatory: no # AllowRoot=0 #使用哪个用户运行 # # Mandatory: no # Default: # User=zabbix #指定存放了设置自定义监控项的文件位置 # # Mandatory: no # Include= # Include=/usr/local/etc/zabbix_server.general.conf # Include=/usr/local/etc/zabbix_server.conf.d/ # Include=/usr/local/etc/zabbix_server.conf.d/*.conf #暂无 # # Mandatory: no # SSLCertLocation=${datadir}/zabbix/ssl/certs #暂无 # # Mandatory: no # SSLKeyLocation=${datadir}/zabbix/ssl/keys #暂无 # # Mandatory: no # SSLCALocation= ####### LOADABLE MODULES ####### #loadable组件位置 # # Mandatory: no # LoadModulePath=${libdir}/modules #需要server载入的loadable组件,格式为LoadModule=<module.so> # # Mandatory: no # LoadModule= ####### TLS-RELATED PARAMETERS ####### #未知 # # Mandatory: no # TLSCAFile= #未知 # Mandatory: no # TLSCRLFile= #未知 # # Mandatory: no # TLSCertFile= #暂无 # # Mandatory: no # TLSKeyFile=
6、Zabbix部署中出现的问题合集
1) [服务端],报错:error: Unable to use libevent
编译安装zabbix-3.4.1或以上 ./confgure的时候出现以下错误:
configure: error: Unable to use libevent (libevent check failed)
解答:
需要devel包进行编译:
yum install libevent-devel
即可。
2)[服务端],有mailx12-4,报OpenSSL错误解决方法
更新补丁:
wget http://www.linuxfromscratch.org/patches/blfs/7.6/mailx-12.4-openssl_1.0.0_build_fix-1.patch patch -Np1 -i mailx-12.4-openssl_1.0.0_build_fix-1.patch
3)[服务端],报错configure: error: Unable to use libpcre (libpcre check failed)
解决方法:
yum -y install pcre* libpcre*
4)[服务端],WEB页面php参数部分修改后不刷新
需要重启php-fpm和web服务器,比如nginx或者httpd。
如果还不行,可以编写phpinfo文件vim var/www/html/phpinfo.php
<?php phpinfo(); ?>
访问
查看修改的参数是否对应,如果不对应,则证明php-fpm没有读取/etc/php.ini,一般源码安装的php-fpm会这样。
那就find查找php.ini,去看它读取的是哪个。修改那个。
5)[服务端]web界面错误,无法访问数据库
下载配置文件并将其置于conf /中将Zabbix PHP文件复制到的Web服务器HTML文档子目录中。
提供Web服务器用户对conf /目录具有写入权限,配置文件将被自动保存,并且可以立即进入下一步。
7、zabbix使用中出现的问题合集
1)[客户端]重启 libcurl.so.4: cannot open shared obje
问题:yum安装客户端,重启zabbix-agent客户端
/usr/sbin/zabbix_agentd: error while loading shared libraries: libcurl.so.4: cannot open shared obje
解答:
看 /etc/zabbix/zabbix_agentd.conf是否存在,因为zabbix服务识别不到配置文件才会报错。
看看/etc/zabbix下面是不是有备份或者类似名字的配置文件,修改为zabbix_agentd.conf,这样服务就可以识别了。修改后重启客户端。
2)[客户端]日志出现(Not all processes could be identified)
场景:一般是自定义监控项时,脚本里使用了netstat这个命令。
权限问题,zabbix_agentd是zabbix用户启动的,默认不能执行netstat -p等命令,导致从服务器取到的自动发现脚本为空。
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
解决方法 :
chmod +s /bin/netstat
chmod +s 是为了方便普通用户执行一些特权命令,SUID/SGID程序允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。
3)zabbix升级,再重启服务端后网页上出现Database error
报错:
Database error –The frontend does not match Zabbix database. Current database version (mandatory/optional): 3040000/3040000. Required mandatory version: 3020000. Contact your system administrator.
解答:
未完成。
4)重启客户端或者服务端出现 [2332]: user zabbix does not exist
重启zabbix客户端或服务端。
如下:
zabbix_agentd [2332]: user zabbix does not exist zabbix_agentd [2332]: Cannot run as root!
解答:
创建一个zabbix用户,如果存在zabbix用户还是依然这个错误,则su – zabbix 再启动。
用zabbix这个用户去重启,如果重启还不行,切换回root后再重启,一般就ok了。
5)将编译后的zabbix相关配置文件和东西放到新机器,启动失败
将zabbix配置文件整体放到新机器的目录下,启动失败。
解答:
还没知道,不过还原可以。
待定。
6)zabbix无法启动,启动显示正确,但是没有端口号
解答:
关闭selinux即可。
或者配置selinux策略(LAMP环境):
setsebool -P httpd_can_connect_zabbix on setsebool -P httpd_can_network_connect_db on
导入module注:若没有audit2allow模板,请安装selinux-policy* setroubleshoot
yum -y install selinux-policy* setroubleshoot cat /var/log/audit/audit.log | grep zabbix_server | grep denied | audit2allow -M zabbix-server_setrlimit
生成:
modulesemodule -i zabbix-server_setrlimit.pp semodule -i zabbix-server_setrlimit.pp
7)自定义的脚本服务端和客户端获得值不一致
前情提要:
自定义zabbix脚本监控mysql,出现在客户端用
zabbix_agentd -t slave_status[Slave_IO_Running]
获得值为0,是正确的
但在服务端用
/usr/local/zabbix/bin/zabbix_get -s 192.168.1.14 -k slave_status[Slave_IO_Running]
获得却为1。
原因:
这是因为在服务端执行时用的当前终端,和脚本执行的一样,而在服务端获取是独立的终端。
例如上述脚本需要调用mysql这个命令,但mysql是源码安装的,做了环境变量。那在客户端执行时没问题的,因为加载了当前的环境变量。
如果是服务端执行,会报错mysql not found,没有mysql这个命令。因为脚本是对mysql -e “xxx”方式获得的值进行if判断,为真则echo 0,为假则echo 1。没有mysql命令自然返回1了。
因为服务端不加载/etc/profile这种环境变量,他不登录服务器。
解决办法:
可以再脚本中写绝对路径来避免此类错误。也可以用ln -s
对命令做一个软连接,连接到/usr/local/bin/下面。
8)自定义监控项取不到数据,报错Received value [sudo:sorry,you must have a tty to run sudoi]
报错信息:
zabbix_agentd -t slave_status[Slave_IO_Running] Received value [sudo:sorry,you must have a tty to run sudoi]is not suitable for value type [Numeric(unsigend)]
原因:
导致这问题的原因是 sudo默认需要在 tty终端里才能正确被调用,而用的脚本,才会出现这个问题。
解决:
我们可以通过修改 /etc/sudoers配置文件来解决这个问题:
vi /etc/sudoers #Defaults requiretty #注释掉此行
9)自定义监控项,检测报错ZBX_NOTSUPPORTED: Unsupported item key.
报错信息:
原因:
Zabbix Agent默认的超时时间是3秒。往往我们自定义的Item由于各种原因返回时间会比较长(比如监控mysql,可能4秒后脚本才运行完毕)。所以建议统一修改一个适合自己实际的值。
解决:
vim /etc/zabbix/zabbix_agent.conf Timeout=8
10)命令行可以取值,在图形显示不支持键值,看不到值
报错:
自定义的脚本如下:
a是mysql从和主同步时,从慢同步多少秒。
b是上一个a值
只有当上一值大于600,最新值大于600,才会输出a,也就是该报警了、
这样做防止主执行一个大的事物,导致从瞬间sbm高涨,然后又降低了。
只有上一个值和当前值都很高,才判定有问题。
a=mysql同步慢多少秒 b=`cat /tmp/sbm.tmp` if [[ $a -ge 600 ]] && [[ $b -ge 600 ]];then echo $a else echo 0 fi echo "$a" >> /tmp/sbm.tmp
结果发现值是灰色的,但用 zabbix_agentd -t 键值 来测试没有问题。
原因:
zabbix自定义的脚本不能有输出或者写入文件等操作。
解决:
将最后输出那行删除就行了。
11)zabbix启动客户端报错libpcre.so.1找不到
报错如下:
/usr/local/zabbix-agent/sbin/zabbix_agentd: error while loading shared libraries: libpcre.so.1: cannot open shared object file
find / -name libpcre.so*
#里面这个1应该是之前链接不行的 或者删除 再链接 ln -s /usr/lib64/libpcre.so.0 /usr/lib64/libpcre.so.1 vim /etc/ld.so.conf /usr/lib64/libpcre.so.1 ldconfig
在配置文件加上,再去启动服务:
/etc/init.d/zabbix_agentd start
8、zabbix 性能优化
zabbix默认的配置即使机器128核心,256内存,只能抗住10-20台的监控,如果再多就需要修改配置了。
server端配置文件添加如下:
StartPollers=160 StartPollersUnreacheable=80 StartTrappers=20 StartPingers=100 StartDiscoverers=120 Cachesize=1024M startDBSyncers=16 HistoryCacheSize=1024M TrendCacheSize=1024M HIstoryTextCacheSize-512M
1)数据库
如果数据库和zabbix在一台机器,可以使用socket连接,速度会提高。
数据库zabbix来说,选择InnoDB引擎,效率是其它引擎的1.5倍。
对history类型的(history、history_uint等)大表进行拆分操作,关闭housekeeper禁止自动定期清除历史记录数据,因为对于数据库特别是对于InnoDB引擎大数据删除貌似很蛋疼。
可以对数据库配置文件调优,因为都要提交到数据库中,当机器很多时,数据库压力会很大。
如果还是太多,可以考虑将mysql单独一台,并设置读写分离,可以用中间件实现。
2)服务端配置
关闭服务端的housekeep:
housekeep是清理历史的机制,配置文件中,默认是每小时启动一次,然后清除监控项设置之外的多余历史记录。比如mysql监控项默认保存90天,他会清除90天以外的,这会导致经常去清理,有时会报错:Zabbix housekeeper processes more than 75% busy
2种方法:
A:编辑server端的配置文件,修改或添加如下2行,一天清理一次,并每次清理最多500行。
HousekeepingFrequency=24 zabbix执行Housekeeping的频率,单位为hours MaxHousekeeperDelete=500 每次最多删除历史数据的行
B:关闭housekeep,并手动清理日志
2.2版本以下,server端配置文件添加:
DisableHousekeeping=1 设置为1
2.2以上,到web界面修改:
"Administration" -> "General" ,选择"Housekeeping" ,确保history和trends栏的"Enable internal housekeeping"的对勾去掉。
调整监控项:
很多监控项都是无用的或者目前用不到的,像redis监控模板中的调阅/发布监控项应该去掉。
监控项的类型最好使用数字,尽量避免使用字符。字符在数据库中的存储空间使用较大,在设置trigger时也相对麻烦,并且zabbix本身处理数字的效率要相对高。如果业务需要字符类型的监控项,可以适当的降低数据采集的时间间隔以提高处理效率。
Trigger中,正则表达式函数last(),nodata()的速度最快,min()、max()、avg()的速度最慢。在使用过程中,尽量选择速度较快的函数。配置Trigger时,也应注意使用正确的逻辑,错误的逻辑可能导致数据库查询较慢的现象。
item监控性默认大部分都是保留90d(天)或者1w(周)的历史数据,趋势图数据保留365天。
其实有趋势图数据即可,历史数据保留7天足够了,采集频率,像磁盘,文件大小等很久才变化的,采集频率可以加大,以达到缓解压力和节省空间的作用。
如果主机数量太多,采用代理:
如果主机数量太多,可以考虑分机房,分业务,分组的方式来用代理中转。zabbix_proxy可以代替服务端收集数据和监控,但是监控结果还是发送到服务端汇总,代理是没有web界面的。
如果机器太多,可以用主动模式,当前所有默认都是被动模式的,客户端启动10051端口,服务端需要去10051取数据。
- 减少 history 保存时间
- 减少 item 获取间隔时间
- 减少不必要的监控项
9、Zabbix监控 服务级别
当前的监控均为监控单独的应用状态,对于一组应用提供的功能,zabbix也可以监控。
例如某个论坛服务有4台机器。对于论坛这个服务来说,只有网页服务和数据服务都没问题,它才能正常工作。
而对于网页服务/数据服务来说,只要其中一台数据库没问题,它才能正常工作。
1. 配置 -> 服务
2. 有一个root,这是所有的父节点,点击添加子节点即可。
3. 状态计算算法,任何一个节点有问题就报警,触发器则是报警
10、Zabbix正则表达式
在zabbix中,正则表达式经常使用的地方应该就是LLD,比如,你发现的网卡或磁盘有一大堆,但是有一些不是你想要的。比较典型的比如lo(回环地址),VLAN、Tunnel、InLoopBack0、NULL0等交换机网口,这时,你就可以通过正则表达式进行过滤掉。
1. 点击 基础配置
2. 选择正则表达式
3. 新建正则表达式
4. 测试
正则表达式写好以后,可以直接在线进行测试。
例子:交换机接口过滤掉不需要的端口
例子:磁盘自动发现时过滤盘符
磁盘自动发现时,我只需要:
hda|hdb|sda|sdb|sdc|sdd|sde|sdf|sdg|sdh|xvda|xvdb|vda|vdb|vdc|cciss/c0d0p[1-9]
这些开头的盘符。
例子:mysql屏蔽端口
比如在mysql多实例发现的过程中,我用3308来进行测试,而3306和3307则为线上正常使用的实例,这时,我就可以屏蔽3308实例就行。
操作如下:
1. 写正则
2.在Host上应用
注意:引用正则表达式的时候,需要使用 @ + 正则表达式名。
表达式类型
1. 字符串已包含(Character string included) – 匹配子字符串
2. 字符串未包含(Character string not included) – 匹配除了子字符串之外的任何字符串
3. 结果为真(Result is TRUE) – 匹配正则表达式
4. 结果为假(Result is FALSE) – 不匹配正则表达式
11、zabbix显示中文报警
1)安装时指定
在创建数据库是指定utf8,如果没有指定:
mysql>create database zabbixdb character set utf8;
2)安装时未指定,手工配置
修改配置文件:
1. 修改数据库字符集,安装数据库要指定utf8,如果没指定修改配置文件
vim /etc/my.cnf.d/client.cnf [client] #client字段下增加 default-character-set=utf8
vim /etc/my.cnf.d/server.cnf [mysqld] #下面增加 character_set_server = utf8
2. 重启
systemctl restart mariadb
3. 进入数据库
mysql mysql>status;
4. 有如下显示即可
Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8
3)修改数据库
1. 再挨个修改数据库,表,字段的字符编码,将zabbixdb数据库导出
mysqldump -uzabbixuser -p123456 zabbixdb > zabbixdb.sql
2. 批量用sed修改导出文件的字符编码
cp zabbixdb.sql bak.sql sed -i 's/latin1/utf8/g' zabbixdb.sql
3. 直接导入修改后文件
mysql -uzabbixuser -p123456 zabbixdb < zabbixdb.sql
4. 数据库字符集修改查询,用于效验
mysql> show variables like 'character_set_database';
12、zabbix配置自动发现
在主机较多的时候,配置主机自动发现并加入监控可以代替手动的添加主机,减轻工作量,自动发现由服务端主动发起,Zabbix Server开启发现进程,定时扫描局域网中IP服务器、设备。
可以根据需要,在对主机安装系统的时候就安装配置并启动zabbix-agent服务,这样的话只要主机系统安装完成,便会自动加入监控。
图形配置:
1. 配置自动发现
2. 配置完自动发现后,还需要配置自动连接到哪个模板,哪个组。
3. 如果自定义的网络段大的话New condition中的HostIP还可以精确IP范围,到此网络自动发现添加完成。
验证结果,查看主机列表有几台agent服务器被监控。
4.查看添加按规则之后的主机列表。
多了两台主机证明规则生效了。
13、zabbix配置主机自动注册
自动注册是客户端主动去访问服务端的10051端口,将自身信息发送过去,从而登记到zabbix上。
1. 修改配置文件
vim /etc/zabbix/zabbix_agentd.conf ServerActive=172.16.1.61 #填写server端ip # Hostname=Zabbix server #注释掉 HostnameItem=system.hostname #添加如下
2. 配置 >> 动作 >> 事件源(自动注册) >> 创建动作
3. 创建动作,添加名称即可
4. 条件中也无需修改
5. 在动作中添加动作
添加主机、添加到主机群组、链接到模板。
6. 添加完动作后,等待就行了
注意:重启客户端可以加速发现。但是在生产环境中勿用。
14、Zabbix客户端 主/被模式
Zabbix的监控分为主动和被动,这2个都是针对客户端说的。当客户端为被动模式(默认)时,将开启10050端口,由服务端定期从客户端获取数据。当客户端为主动模式时,客户端将不用开启端口,由客户端主动向服务端提交数据。
被动模式由服务端主动取数据,在监控的数量达到一个量级的时候,会导致服务端很卡,并且需要服务端可以访问客户端的10050端口,如果不在一个网段,那客户端需要公网地址。
好处是支持所有监控项。
主动模式由客户端主动提交数据,将大大减少服务器的负载,并且不需要客户端和服务端在一个网段,客户端只要能访问服务端即可。
坏处是不支持某些监控项,目前测试 自动发现模板 时也没法使用(不排除我操作错误)。
1)安装客户端
yum安装
1. 下rpm包,服务端是3.4版本,客户端是3.2或者3.0版本都可以,只要版本差距不大即可,不过最好还是对应版本的客户端。
wget repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
2. 安装客户端
yum -y install zabbix-release-3.2-1.el7.noarch.rpm
3. 说明
配置文件:
/etc/zabbix/zabbix-agentd.conf
日志:
/var/log/zabbix/zabbix-agentd.log
启动:
systemctl start zabbix-agent
源码安装
空,这个不推荐,太麻烦了。
2)配置为被动模式(默认)
默认的监控项模板都是被动模式的,所以修改配置文件并套用模板即可。
1. 修改配置文件
#指定pid文件位置 PidFile=/var/run/zabbix/zabbix_agentd.pid #指定日志文件位置 LogFile=/var/log/zabbix/zabbix_agentd.log #设置为被动模式,将开启端口 StartAgents=3 #当前的主机名,要写正确,否则服务端会不识别 Hostname=DEV-TEST #服务端的地址,用逗号(,)可以隔开写多个 Server=192.168.1.100 #自定义的脚本超时时间, Timeout=8 #允许自定义脚本 UnsafeUserParameters=1 #加载其它配置文件 Include=/etc/zabbix/zabbix_agentd.d/*.conf
3)配置为主动模式
需要修改配置文件和模板,将监控项改为主动模式。
1. 修改配置文件
#指定pid文件位置 PidFile=/var/run/zabbix/zabbix_agentd.pid #指定日志文件位置 LogFile=/var/log/zabbix/zabbix_agentd.log #设置为主动模式,将关闭被动模式,不监听端口 StartAgents=0 #当前的主机名,要写正确,否则服务端会不识别 Hostname=DEV-TEST #服务端的地址,用逗号(,)可以隔开写多个 ServerActive=192.168.1.100 #自定义的脚本超时时间, Timeout=8 #允许自定义脚本 UnsafeUserParameters=1 #加载其它配置文件 Include=/etc/zabbix/zabbix_agentd.d/*.conf
2. 在服务端网页上调整模板的监控项
配置 -> 模板 -> Template OS Linux -> 拉到最下面 -> 全克隆(防止修改失败,回滚)。
3. 找到复制的模板 -> 链接模板 -> 取消链接(一会批量修改监控项,需要先取消链接) -> 更新。
4. 点击监控项 -> 全选 -> 批量更新
5. 勾选类型 -> 将方式变为[客户端主动式]
6. 配置 -> 主机 -> 模板 -> 取消链接 -> 更换为新的模板 -> 更新
7. 到检测 -> 最新数据 -> 查看被模板的主机,是否有数据
综合配置:
这样主动和被动都开启,监控项根据情况进行设置。
#指定pid文件位置 PidFile=/var/run/zabbix/zabbix_agentd.pid #指定日志文件位置 LogFile=/var/log/zabbix/zabbix_agentd.log #设置为被动模式,将开启端口 StartAgents=3 #当前的主机名,要写正确,否则服务端会不识别 Hostname=web2 #服务端的地址,用逗号(,)可以隔开写多个 Server=10.10.10.137 #服务端的地址,用逗号(,)可以隔开写多个 ServerActive=10.10.10.137 #自定义的脚本超时时间, Timeout=8 #允许自定义脚本 UnsafeUserParameters=1 #加载其它配置文件 Include=/etc/zabbix/zabbix_agentd.d/*.conf
15、zabbix_get安装和使用
1. 安装
rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm yum install zabbix-get.x86_64
2. 使用
zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]" -s 客户端的IP -p 客户端端口,默认10050 -k 监控项的key
五、Zabbix API
zabbix的api可以查看,API的参数等等一直都是变化不大,5.0版本的zabbix用3.4的API也可以直接使用。
调用的时候用requests来往zabbix的api的url里传入json字符串,在正常使用前先传入账号密码用user.login参数来登陆zabbix,成功后会返回一个token的值(可以print来看看),后续的操作直接填入这个token的变量即可。
1、认证基本函数
#/use/bin/python3 import json, requests #zabbix服务器的IP地址 zabbix_ip = "172.16.1.1" #zabbix的用户名 zabbix_user = "Admin" #zabbix的密码 zabbix_pass = "zabbix" #zabbix api接口地址 url = "http://" + zabbix_ip + ":8000/api_jsonrpc.php" #zabbix api定义的访问头部信息 post_header = {'Content-Type': 'application/json'} #调用zabbix api需要身份令牌auth def get_auth(): post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": zabbix_user, "password": zabbix_pass }, "id": "1" } ret = requests.post(url, data=json.dumps(post_data), headers=post_header) zabbix_ret = json.loads(ret.text) if 'result' not in zabbix_ret: print('login error') else: return zabbix_ret.get('result') #传入zabbix上主机的ip地址,返回主机的id号 def get_hostid(host_ip): values = { "jsonrpc": "2.0", "method": "host.get", #指定方法 "params": { #参数列表 "output": "extend", #返回默认信息,这里可以加别的参数指定返回 "filter": { #根据ip查询 "host": [host_ip] } }, "auth": auth, #token "id": 2, #id号随意写数字 } #用post提交json字段,然后解析成字典输出 zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() print(zabbix_req) if __name__ == '__main__': auth = get_auth() #先传入token字符串到这个变量,后续调用变量即可 get_hostid("172.16.1.2") #调用后续的比如查id,添加监控项
2、主机组操作
1. 创建主机组
def create_hosts(): values = { "jsonrpc": "2.0", "method": "hostgroup.create", "params": { "name": "test1_group" #传入主机组名 }, "auth": auth, "id": 1 } #成功返回{'jsonrpc': '2.0', 'result': {'groupids': ['16']}, 'id': 1} #重复返回{'jsonrpc': '2.0', 'error': {'code': -32602, 'message': 'Invalid params.', 'data': 'Host group "test1_group" already exists.'}, 'id': 1}
2. 根据主机组名查询主机组id号
def get_groupid(): values = { "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": "extend", "filter": { "name": [ "test1_group", #传入主机组名 ] } }, "auth": auth, "id": 1 } #成功返回{'jsonrpc': '2.0', 'result': [{'groupid': '5', 'name': 'test1_group', 'internal': '1', 'flags': '0'}], 'id': 1} #查询不存在主机组名返回{'jsonrpc': '2.0', 'result': [], 'id': 1}
3. 查询所有主机组id号
def get_groupallid(): values = { "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": "extend" }, "auth": auth, "id": 1 } #成功返回{'jsonrpc': '2.0', 'result': [{'groupid': '1', 'name': 'test1_group', 'internal': '0', 'flags': '0'}, {'groupid': '2', 'name': 'Linux servers', 'internal': '0', 'flags': '0'}}
4. 删除主机组
def del_group(): values = { "jsonrpc": "2.0", "method": "hostgroup.delete", "params": ["17"], #删除多个可以传入列表 "auth": auth, "id": 1 } #成功返回{'jsonrpc': '2.0', 'result': {'groupids': ['17']}, 'id': 1} #删除组不存在返回{'jsonrpc': '2.0', 'error': {'code': -32500, 'message': 'Application error.', 'data': 'No permissions to referred object or it does not exist!'}, 'id': 1}
5. 修改主机组名
def rename_group(): values = { "jsonrpc": "2.0", "method": "hostgroup.update", "params": { "groupid": "17", #主机组id号 "name": "test2_group" #新名称 }, "auth":auth, "id": 1 } #成功返回{'jsonrpc': '2.0', 'result': {'groupids': ['17']}, 'id': 1}
6. 加主机组加入模板和主机
def add_host_group(): values = { "jsonrpc": "2.0", "method": "hostgroup.massadd", "params": { "groups": [ { "groupid": "5" #主机组id,可以添加单个或多个 }, { "groupid": "6" } ], "hosts": [ { "hostid": "30050" #主机id }, { "hostid": "30001" } ], "templates": [ { "templateid": "30050" #模板id,选填 }, { "templateid": "30001" } ] }, "auth": auth, "id": 1 }
7. 替换主机组中的所有主机
def update_host_group(): values = { "jsonrpc": "2.0", "method": "hostgroup.massupdate", "params": { "groups": [ { "groupid": "6" #主机组id } ], "hosts": [ { "hostid": "30050" #主机id } ] }, "auth": auth, "id": 1 }
8. 替换主机组中的所有模板
def update_temp_group(): values = { "jsonrpc": "2.0", "method": "hostgroup.massupdate", "params": { "groups": [ { "groupid": "6" #主机组id } ], "templates": [ { "templateid": "30050" #模板id } ] }, "auth": auth, "id": 1 }
9. 删除主机组中的主机
def del_host_group(): values = { "jsonrpc": "2.0", "method": "hostgroup.massremove", "params": { "groupids": [ "5" #主机组id ], "hostids": [ "30050", #主机id "30001" ] }, "auth": auth, "id": 1 }
10. 删除主机组中的模板
def del_temp_group(): values = { "jsonrpc": "2.0", "method": "hostgroup.massremove", "params": { "groups": [ { "groupid": "6" #主机组id } ], "templates": [ { "templateid": "30050" #模板id } ] }, "auth": auth, "id": 1 }
11. 根据主机id获取组信息
def post_hostid_group(): values = { "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": "extend", 'hostids':['10084','10264'] #主机id号 }, "auth": auth, "id": 1 } #成功返回[{"internal":"0","flags":"0","groupid":"19","name":"New Create Group"},{"internal":"0","flags":"0","groupid":"20","name":"New Group 02"}]
12. 只返回包含给定模板的主机组
def post_tempid_group(): values = { "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": "extend", 'templateids':['10266'] #模板id号 }, "auth": auth, "id": 1 } #成功返回[{"internal":"0","flags":"0","groupid":"19","name":"New Create Group"},{"internal":"0","flags":"0","groupid":"20","name":"New Group 02"}]
13. 返回属于主机组的所有主机
def post_groupid_host(): values = { "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": 'extend', "filter": { "groupid": '20' #主机组id }, "selectHosts": [ #加这个获取interfaceid的值,用于主机后续操作 "name", "hostid" ], }, "auth": auth, "id": 1 } #成功返回[{"hosts":[{"hostid":"10084","name":"Zabbix server"},{"hostid":"10264","name":"zabbix_agent_1.1.1.3"}],"internal":"0","flags":"0","groupid":"20","name":"New Group 02"}]
14. 返回属于主机组的所有模板
def post_groupid_temp(): values = { "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": 'extend', "filter": { "groupid": '19' #主机组id号 }, "selectTemplates": [ #获取interfaceid的值用于后续主机操作 "host", "templateid" ], }, "auth": auth, "id": 1 } #成功返回[{"templates":[{"host":"New Create Template","templateid":"10266"}],"internal":"0","flags":"0","groupid":"19","name":"New Create Group"}]
3、主机操作
1. 创建主机,并添加到”New Create Group”主机组中
def create_host(): values = { "jsonrpc": "2.0", "method": "host.create", "params": { "host": "test1", #主机名称 "interfaces": [ #为主机创建的接口 { "type": 1, "main": 1, "useip": 1, "ip": "172.16.1.2", #添加ip地址 "dns": "", "port": "10050" } ], "groups": [ #加入到主机组,必须指定 { "groupid": "17", } ], "templates": [ #链接到模板 { "templateid": "20045" } ], "inventory_mode": 0, #主机资产清单属性:把MAC地址设置到主机资产清单里 "inventory": { "macaddress_a": "01234", "macaddress_b": "56768" } }, "auth": auth, "id": 1 }
2. 获取主机id:根据主机名获取主机id
def get_hostid(): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": ['name','hostid'], #选择输出内容,列表形式 "filter": { "host": ["会员中心-1",] #指定主机名称 } }, "auth": auth, "id": 1 }
3. 根据主机id删除主机
def del_host(): values = { "jsonrpc": "2.0", "method": "host.delete", "params": ["2342"], #主机id号 "auth": auth, "id": 1 }
4. 禁用/启用 主机
def update_host_status(): values = { "jsonrpc": "2.0", "method": "host.update", "params": { "hostid": '10264', #主机id号 "status": 0 #0启用,1禁用 }, "auth": auth, "id": 1 }
5. 替换当前主机所属主机组
def update_host_group(): values = { "jsonrpc": "2.0", "method": "host.update", "params": { "hostid": '10264', #指定主机id号 "groups": ['19'] #加入主机组,可以列表写多个 }, "auth": auth, "id": 1 }
6. 在指定主机中替换当前链接的模板: 以前模板的 监控项等不会删除
def update_host_temp(): values = { "jsonrpc": "2.0", "method": "host.update", "params": { "hostid": '10264', #主机id号 "templates": ['10266'] #模板id号 }, "auth": auth, "id": 1 }
7. 在指定主机中删除指定模板链接并清除: 会清除这个模板的监控项等
def del_host_temp(): values = { "jsonrpc": "2.0", "method": "host.update", "params": { "hostid": '10264', #主机id "templates_clear": ['10266'] #模板id }, "auth": auth, "id": 1 }
8. 主机组添加到指定的主机中(原有的组机组不变)
def add_group_host(): values = { "jsonrpc": "2.0", "method": "host.massadd", "params": { "hosts": [ { "hostid": "10084" #主机id }, { "hostid": "10264" } ], "groups": [ { "groupid": '20', #主机组id }, ] }, "auth": auth, "id": 1 }
9. 模板添加到指定的主机中
def add_temp_host(): values = { "jsonrpc": "2.0", "method": "template.massadd", "params": { "templates": [ { "templateid": "123" #模板id }, ], "hosts": [ { "hostid": "2342" #主机id } ] }, "auth": auth, "id": 1 }
10. 为指定主机创建的主机接口: 如果创建主机时已经创建了默认接口,就不能再创建默认接口了
def add_host(): values = { "jsonrpc": "2.0", "method": "host.massadd", "params": { "hosts": [ { "hostid": "10264" #主机id }, ], "interfaces": [ { "type": 1, # 1 - agent; 2 - SNMP; 3 - IPMI; 4 - JMX. 接口类型 "main": 1, # 在主机上是否使用该接口作为默认值,一个主机仅能设置一个默认值(0不默认,1默认是) "useip": 1, # 是否应该通过IP进行连接,0:使用dns连接,1:使用此主机接口的主机IP地址进行连接 "ip": "172.16.1.1", # 接口使用的IP地址,如果通过DNS进行连接,则可以为空。 "dns": "", # 接口使用的DNS名称,如果通过IP建立连接,可以为空。 "port": "10050" # 接口使用的端口号 } ] }, "auth": auth, "id": 1 }
11. 从指定的主机中移除主机组
def rm_group_host(): values = { "jsonrpc": "2.0", "method": "host.massremove", "params": { "hostids": ["69665", "69666"], #主机id "groupids": "325" #主机组id }, "auth": auth, "id": 1 }
12. 删除指定主机中的模板
def rm_temp_hosts(): values = { "jsonrpc": "2.0", "method": "host.massremove", "params": { "hostids": ["69665", "69666"], #主机id "templateids": "325" #模板id }, "auth": auth, "id": 1 }
13. 从指定的主机中移除主机接口
def rm_interfaces_host(): values = { "jsonrpc": "2.0", "method": "host.massremove", "params": { "hosts":["10264", ], "interfaces": [ { "type": 1, # 1 - agent; 2 - SNMP; 3 - IPMI; 4 - JMX. 接口类型 "main": 1, # 在主机上是否使用该接口作为默认值,一个主机仅能设置一个默认值(0不默认,1默认是) "useip": 1, # 是否应该通过IP进行连接,0:使用dns连接,1:使用此主机接口的主机IP地址进行连接 "ip": "172.16.1.1", # 接口使用的IP地址,如果通过DNS进行连接,则可以为空。 "dns": "", # 接口使用的DNS名称,如果通过IP建立连接,可以为空。 "port": "10050" # 接口使用的端口号 } ] }, "auth": auth, "id": 1 }
14. 替换当前主机所属主机组
def update_group_host(): values = { "jsonrpc": "2.0", "method": "host.massupdate", "params": { "hosts": [ { "hostid": "10084" #主机id }, { "hostid": "10264" } ], "groups": [ { "groupid": '20', #主机组id }, ] }, "auth": auth, "id": 1 }
15. 仅仅是删除模板关联,模板中的应用集、监控项、触发器等还在主机中
def update_temp_host(): values = { "jsonrpc": "2.0", "method": "host.massupdate", "params": { "hosts": [ { "hostid": "10084" #主机id }, { "hostid": "10264" } ], "templates": [ { "templateid": '10050', #模板id }, ] }, "auth": auth, "id": 1 }
16. 删除模板关联关系,在指定主机中删除模板链接并清除(如:应用集、监控项)
def del_temp_host(): values = { "jsonrpc": "2.0", "method": "host.massupdate", "params": { "hosts": [ { "hostid": "10084" #主机id }, { "hostid": "10264" } ], "templates_clear": [ { "templateid": '10050', #模板id }, ] }, "auth": auth, "id": 1 }
17. 获取这个zabbix server监控的所有主机信息
def get_hostall(): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host" ], "selectInterfaces": [ "interfaceid", "ip" ] }, "id": 2, "auth": auth }
18. 仅返回指定主机组所属的主机
def get_group_host(): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host" ], 'groupids':['19'] #主机组id }, "id": 2, "auth": auth }
19. 仅返回含有指定应用集的主机
def get_app_host(): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host" ], 'applicationid':['1069'] #应用集id }, "id": 2, "auth": auth }
20. 仅返回指定主机ID的主机
def get_host(): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host" ], 'hostids':['10264'] #主机id }, "id": 2, "auth": auth }
21. 根据主机名/主机id 获取interfaceid
def get_interfaceid(): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": ['name','hostid',], "filter": { #"host": [hostname,], #根据主机名获取 'hostids':['10264'] #根据主机id获取 }, "selectInterfaces": [ #添加这个参数为了获取interfaceid的值 "interfaceid", "ip" ], }, "auth": auth, "id": 1 }
22. 仅返回含有指定监控项的主机
def get_item_host(): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": ['name','hostid',], "filter": { 'itemids':['10264'] #根据主机id获取 }, "selectInterfaces": [ # 添加这个参数为了获取interfaceid的值 "interfaceid", "ip" ], }, "auth": auth, "id": 1 }
23. 仅返回与指定模板链接的主机
def get_temp_host(): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": ['name','hostid',], "filter": { 'templateids':['10266'] #根据主机id获取 }, "selectInterfaces": [ # 添加这个参数为了获取interfaceid的值 "interfaceid", "ip" ], }, "auth": auth, "id": 1 }
24. 查询”主机”时返回更多关联信息:主机组、模板、应用集、监控项、触发器、interfaceid
def get_info_host(): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host" ], 'hostids':['10264'], "selectGroups": [ # 1.返回在groups属性中主机所属的主机组。 "name", "groupid" ], "selectParentTemplates": [ # 2.返回在parentTemplates属性中与主机关联的模板(主机关联的模板) "host", "templateid" ], "selectApplications": [ # 3.返回在applications属性中来自主机的应用集。 "applicationid", "name" ], "selectItems": [ # 4.返回在items属性中主机里的监控项 "key", "itemid", "interfaceid", ], "selectTriggers": [ # 5.返回在triggers属性中主机里的触发器 "description", "triggerid", ], "selectInterfaces": [ # 6.添加这个参数为了获取interfaceid的值 "interfaceid", "ip" ], }, "id": 2, "auth": auth }
4、模板
1. 新建模板:模板必须至少关联一个主机组
def create_temp(): values = { "jsonrpc": "2.0", "method": "template.create", "params": { "host": "test1_temp", #模板名 "groups": { "groupid": gid, #模板关联的主机组(必须要有) }, #"hosts": [{"hostid": "10084"},{"hostid": "10090"}] #模板关联的主机(可选) }, "auth": auth, "id": 1 }
2. 获取模板id:根据模板名称获取模板id
def get_tempid(): values = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": ["host","templateid"], "filter": { "host": ["test1_temp",] #传入模板名 } }, "auth": auth, "id": 1 }
3. 根据模板id删除模板
def del_temp(): values = { "jsonrpc": "2.0", "method": "template.delete", "params": ["23"], "auth": auth, "id": 1 }
4. 修改模板名称
def update_tempname(): values = { "jsonrpc": "2.0", "method": "template.update", "params": { "templateid": "23", #模板id "name": "temp2_name" #新模板名 }, "auth": auth, "id": 1 }
5. 给模板添加主机组
def add_temp_group(): values = { "jsonrpc": "2.0", "method": "template.massadd", "params": { "templates": [ { "templateid": "10266" #模板id } ], "groups": [ { "groupid": "20" #主机组id } ] }, "auth": auth, "id": 1 }
6. 链接到给定模板的模板
def add_temp_temp(): values = { "jsonrpc": "2.0", "method": "template.massadd", "params": { "templates": [ { "templateid": "10266" #模板id } ], "templates_link": [ { "templateid": "10093" #要链接的模板id } ] }, "auth": auth, "id": 1 }
7. 从模板中删除主机组
def rm_group_temp(): values = { "jsonrpc": "2.0", "method": "template.massremove", "params": { "templateids": ["10266"], #模板id "groupids": "20" #主机组id }, "auth": auth, "id": 1 }
8. 将模板从指定主机中删除:但是模板中的 应用集、监控项等还在
def rm_host_temp(): values = { "jsonrpc": "2.0", "method": "template.massremove", "params": { "templateids": ["10266"], #模板id "hostids": ["10264"] #主机id }, "auth": auth, "id": 1 }
9. 从给定的模板中取消链接和清除的模板: 删除了对应的应用集和监控项
def rm_temp_temp(): values = { "jsonrpc": "2.0", "method": "template.massremove", "params": { "templateids": ['10266'], #模板id "templateids_clear": ['10093'], #要清理的连接模板id }, "auth": auth, "id": 1 }
10. 取消与给定模板链接的模板:不会删除已关联的应用集、监控项等
def rm_templ_temp(): values = { "jsonrpc": "2.0", "method": "template.massremove", "params": { "templateids": ['10266'], #模板id "templateids_link": ['10093'], #要清理的连接模板id }, "auth": auth, "id": 1 }
11. 从给定的模板中取消链接并清除模板“10093”(删除已链接的 应用集、监控项等)
def update_templ_templates(): values = { "jsonrpc": "2.0", "method": "template.massupdate", "params": { "templates": [ { "templateid": "10266" #模板id }, ], "templates_clear": [ { "templateid": "10093" #要清理的连接模板id } ] }, "auth": auth, "id": 1 }
12. 主机组替换模板所属的当前主机组: 其他所有组机组都会取消关联
def update_group_temp(): values = { "jsonrpc": "2.0", "method": "template.massupdate", "params": { "templates": [ { "templateid": "10266" #模板id }, ], "groups": [ { "groupid": "20" #主机组id } ] }, "auth": auth, "id": 1 }
13. 去除这个模板链接的其他所有主机,只链接这一个主机
def update_host_temp(): values = { "jsonrpc": "2.0", "method": "template.massupdate", "params": { "templates": [ { "templateid": "10266" #模板id }, ], "hosts": [ { "hostid": "10264" #主机id } ] }, "auth": auth, "id": 1 }
14. 用于替换当前链接的模板的模板:链接的其他模板都会取消,但他们的应用集和监控项不会删除
def update_temp_temp(): values = { "jsonrpc": "2.0", "method": "template.massupdate", "params": { "templates": [ { "templateid": "10266" #模板id }, ], "templates_link": [ { "templateid": "10094" #要链接的模板id } ] }, "auth": auth, "id": 1 }
15. 根据模板名称检索获取信息
def get_temp(): values = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": ['host', 'templateid'], "filter": { "host": ["New Create Template"] #模板名 } }, "auth": auth, "id": 1 }
16. 根据模板id检索
def get_tempid_tempinfo(): values = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": ['host', 'templateid'], "templateids": ['10266'] #模板id }, "auth": auth, "id": 1 }
17. 查看主机组所关联的模板
def get_group_temp(auth): values = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": ['host', 'templateid'], "groupids": ['20'] #主机组名 }, "auth": auth, "id": 1 }
18. 查看主机关联的模板
def get_host_temp(): values = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": ['host', 'templateid'], "hostids": ['10264'] #主机id }, "auth": auth, "id": 1 }
19. 只返回包含指定监控项的模板
def get_item_temp(): values = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": ['host', 'templateid'], "itemids": ['28284'] #监控项id }, "auth": auth, "id": 1 }
20. 只返回包含指定触发器的模板
def get_trigger_temp(): values = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": ['host', 'templateid'], "triggerids": ['15567'] #触发器id }, "auth": auth, "id": 1 }
21. 返回templates属性中更多属性:主机组、主机、子模板
def get_temp(): values = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": ['host', 'templateid'], "templateids": ['10266'], "selectGroups": [ # 返回模板所属的主机组 "name", "groupid" ], "selectHosts": [ # 返回链接到模板的主机 "name", "hostid" ], "selectTemplates": [ # 返回templates属性中的子模板(那个模板链接了自己) "host", "templateid" ], }, "auth": auth, "id": 1 }
22. 查询时返回更多关联信息:主机组、主机、监控项、触发器、子模板、父模板
def get_more_tempinfo(): values = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": ['host', 'templateid'], "templateids": ['10266'], "selectGroups": [ #1.返回模板所属的主机组 "name", "groupid" ], "selectHosts": [ #2.返回链接到模板的主机 "name", "hostid" ], "selectItems": [ #3.返回模板中的监控项. "name", "key", "itemid", "interfaceid", ], "selectTriggers": [ #4.返回模板中的触发器 "description", "triggerid", ], "selectTemplates": [ #5.返回templates属性中的子模板(那个模板链接了自己) "host", "templateid" ], "selectParentTemplates": [ # 6.返回templates属性中的父模板(自己链接了哪些模板) "host", "templateid" ], }, "auth": auth, "id": 1 }
23. 导出模板,需要将输出写到文件里
def export_temp(): values = { "jsonrpc": "2.0", "method": "configuration.export", "params": { "options": { "templates": ["23"] #模板id }, "format": "xml" }, "auth": auth, "id": 1 }
24. 导入模板
def import_temp(): values ={ "jsonrpc": "2.0", "method": "configuration.import", "params": { "format": "xml", "rules": { "templates": { "createMissing": True, "updateExisting": True }, "applications": { "createMissing": True, "deleteMissing": True }, "items": { "createMissing": True, "updateExisting": True, "deleteMissing": True }, "triggers": { "createMissing": True, "updateExisting": True, "deleteMissing": True }, "groups": { "createMissing": True, }, "hosts": { "createMissing": True, "updateExisting": True }, }, "source": "模板文件xml读取后的内容" }, "auth": auth, "id": 1 } # 注:参数说明 # 1、createMissing:如果设置为true,没有就会创建新的 # 2、deleteMissing:如果设置为true,不在导入数据中的将会从数据库中被删除; # 3、updateExisting:如何设置为true,已有的将会被更新;
5、应用集
1. 创建应用集
def create_application(): values = { "jsonrpc": "2.0", "method": "application.create", "params": { "name": "test1_app", #应用名 "hostid": "232" #主机id }, "auth": auth, "id": 1 }
2. 获取指定主机所有应用集
def get_app(): values = { "jsonrpc": "2.0", "method": "application.get", "params": { "output": "extend", "hostids": "232", #主机id "sortfield": "name" }, "auth": auth, "id": 1 }
3. 根据应用集id进行删除
def del_app(au): values = { "jsonrpc": "2.0", "method": "application.delete", "params": ["232"], #应用集id "auth": auth, "id": 1 }
4. 修改应集名称
def update_appname(): values = { "jsonrpc": "2.0", "method": "application.update", "params": { "applicationid": "232", #应用集id "name": "test2_app" #新应用集名称 }, "auth": auth, "id": 1 }
5. 添加多个监控项到指定的应用集
def add_item_app(): values = { "jsonrpc": "2.0", "method": "application.massadd", "params": { "applications": [ { "applicationid": "1118" #应用集id }, ], "items": [ { "itemid": "28439" #监控项id }, ] }, "auth": auth, "id": 1 }
6. 只返回指定ID的应用集
def get_app(): values = { "jsonrpc": "2.0", "method": "application.get", "params": { "output": "extend", "applicationids": ['1118'], #应用集id "sortfield": "name" }, "auth": auth, "id": 1 }
7. 只返回指定主机组所属主机的应用集
def get_group_app(): values = { "jsonrpc": "2.0", "method": "application.get", "params": { "output": "extend", "groupids": ['19',], #主机组id "sortfield": "name" }, "auth": auth, "id": 1 }
8. 只返回指定主机所属的应用集
def get_host_app(): values = { "jsonrpc": "2.0", "method": "application.get", "params": { "output": "extend", "hostids": ['10264',], #主机id "sortfield": "name" }, "auth": auth, "id": 1 }
9. 只返回指定模板的应用集
def get_temp_app(): values = { "jsonrpc": "2.0", "method": "application.get", "params": { "output": "extend", "templateids": ['10266',], #模板id "sortfield": "name" }, "auth": auth, "id": 1 }
10. 查询”应用集”时返回更多关联信息:主机、监控项
def get_appinfo(): values = { "jsonrpc": "2.0", "method": "application.get", "params": { "output": "extend", "applicationids": ['1118'], #模板id "sortfield": "name", "selectHost": [ #1.返回链接到模板的主机 "name", "hostid" ], "selectItems": [ #2.返回模板中的监控项. "name", "key", "itemid", "interfaceid", ], }, "auth": auth, "id": 1 }
6、监控项
1. 创建监控项
def create_item(): values = { "jsonrpc": "2.0", "method": "item.create", "params": { "name": "监控本机80端口", #监控项名称 "key_": "net.tcp.listen[80]", #键值 "hostid": "232", #主机id "interfaceid": "72", #主机interfaceid "applications": ["23"], #应用集id(可选) "type": 0, "value_type": 3, "delay": "60s" #采集频率 }, "auth": auth, "id": 1 }
2. 根据主机和键值key匹配监控项id
def get_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "hostids": "23", #主机id "search": { "key": "net.tcp.listen[80]" #键值必须和agent的key值相同 }, "sortfield": "name" }, "auth": auth, "id": 1 }
3. 删除监控项:更具监控项id
def del_item(): values = { "jsonrpc": "2.0", "method": "item.delete", "params": ["232"], #监控项id "auth": auth, "id": 1 }
4. 禁用/启用指定监控项
def update_item(): values = { "jsonrpc": "2.0", "method": "item.update", "params": { "itemid": "43", # 监控项id "status": 0 #0禁用,1启用 }, "auth": auth, "id": 1 }
5. 只返回具有给定ID的监控项
def get_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "itemids": ['28284'], # 监控项id }, "auth": auth, "id": 1 }
6. 只返回属于给定组的监控项
def get_group_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "groupids": ['19'], #主机组id }, "auth": auth, "id": 1 }
7. 仅返回属于给定模板的监控项
def get_temp_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "templateids": ['10266'], #模板id }, "auth": auth, "id": 1 }
8. 仅返回属于给定主机的监控项
def get_host_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "hostids": ['10264'], #主机id }, "auth": auth, "id": 1 }
9. 仅返回属于给定应用程序的监控项
def get_app_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "applicationids": ['1118'], #应用集id }, "auth": auth, "id": 1 }
10. 仅返回在给定触发器中使用的监控项
def get_trigger_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "triggerids": ['15601'], #触发器id }, "auth": auth, "id": 1 }
11. 仅返回属于具有主机组名称的监控项
def get_groupname_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "group": 'New Create Group', #主机组名称 }, "auth": auth, "id": 1 }
12. 仅返回属于具有主机名称的监控项
def get_hostname_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "host": 'zabbixagent_1.1.1.3', #主机名 }, "auth": auth, "id": 1 }
13. 仅返回属于具有应用集名称的监控项
def get_appname_item(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "application": 'app02', #应用集名称 }, "auth": auth, "id": 1 }
14. 查询”监控项”时返回更多关联信息:主机、应用程序、触发器
def get_iteminfo(): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['key','itemid'], "itemids": ['28284'], "selectHosts": [ # 1.返回应用这个监控项的所有主机 "host", "hostid", ], "selectApplications": [ # 2.返回该项所属的应用程序 "name", "applicationid", ], "selectTriggers": [ # 3.返回这个监控项包含的触发器 "description", "triggerid", ], }, "auth": auth, "id": 1 }
7、触发器
1. 创建 一个/多个 触发器
def create_trigger(): values = { "jsonrpc": "2.0", "method": "trigger.create", "params": { "description": "机器的80端口", #触发器名称 "expression": "{172.16.1.2:net.tcp.listen[80].last()}=0", #最后的结果为0则报警 "priority": 4 #(0:未分类; 1:信息; 2:警告; 3:一般严重 ...) }, "auth": auth, "id": 4 }
2. 检索触发器:这里只返回指定主机所属的触发器信息多个以列表形式返回
def get_trigger(): values = { "jsonrpc": "2.0", "method": "trigger.get", "params": { "hostids": "23", #主机id "output": "extend", "selectFunctions": "extend" }, "auth": auth, "id": 1 }
3. ERER删除触发器
def del_trigger(): values = { "jsonrpc": "2.0", "method": "trigger.delete", "params": ["43"], #触发器id "auth": auth, "id": 1 }
4. 禁用/开启触发器
def update_trigger(auth,triggerid): values ={ "jsonrpc": "2.0", "method": "trigger.update", "params": { "triggerid": "34", #触发器id "status": 0 #0启用,1禁用 }, "auth": auth, "id": 1 }
5. 只返回指定ID的触发器
def get_trigger(): values = { "jsonrpc": "2.0", "method": "trigger.get", "params": { "triggerids": ['15567'], #触发器id "output": ['triggerid','expression','description',], "selectFunctions": "extend", #显示functions这个字典中的内容 }, "auth": auth, "id": 1 }
6. 根据过滤信息返回
def get_trigger(): values = { "jsonrpc": "2.0", "method": "trigger.get", "params": { "templateids": ['10266'], #模板id #"groupids": ['19'], #主机组id #"applicationids": ['1111'], #应用集id进行过滤 #"itemids": ['28439'], #监控项id #"hostids": ['10264'], #主机id #"group":'New Create Group', #根据主机组名 #"host":'zabbix_agent_1.1.1.3', #根据主机名 "output": ['triggerid','expression','description',], }, "auth": auth, "id": 1 }
7. 查询时返回更多关联信息:主机组、主机、监控项
def get_triggerinfo(): values = { "jsonrpc": "2.0", "method": "trigger.get", "params": { "triggerids": ['15567'], #触发器id "output": ['triggerid','expression','description',], "selectGroups": [ # 1.返回模板所属的主机组 "name", "groupid" ], "selectHosts": [ # 2.返回链接到模板的主机 "name", "hostid" ], "selectItems": [ # 3.返回模板中的监控项. "name", "key", "itemid", "interfaceid", ], }, "auth": auth, "id": 1 }
8、监控信息
1. 获取所有触发器中报警信息,如果不报警则不会获取到
def trigger_get_alarm(): values = { "jsonrpc": "2.0", "method": "trigger.get", "params": { "output": [ "host", "description", "triggerid", "eventid", "templateids" ], "selectGroups": [ "name" ], "selectHosts": [ "name", "host" ], "selectItems": [ "name", "lastvalue", "units" ], "filter": { "value": 1 }, "monitored": 1, "selectLastEvent": "extend", "expandComment": 1, "expandDescription": 1, "sortfield": "priority", "sortorder": "DESC", "withLastEventUnacknowledged": 1 }, "auth": auth, "id": 1 } # 获取的报警信息如下 ''' [{ "description": "User_Login", # 这里是报警信息的具体内容 "items": [{ "itemid": "28439", "units": "", "lastvalue": "59", "name": "login_user" }], "lastEvent": { "eventid": "73", "objectid": "15601", "clock": "1528266869", "object": "0", "acknowledged": "0", "value": "1", "source": "0", "ns": "387320307" }, "triggerid": "15601", "hosts": [{ "host": "zabbix_agent_1.1.1.3", "hostid": "10264", "name": "zabbix_agent_1.1.1.3" }], "groups": [{ "groupid": "19", "name": "New Create Group" }, { "groupid": "20", "name": "New Group 02" }] }] '''
2. 只返回给定监控项的历史记录
def get_historys_item(): values = { "jsonrpc": "2.0", "method": "history.get", "params": { "output": "extend", "history": 3, # 要返回的历史对象类型 # 0 - numeric float;数字浮点数;1 - character;字符 ;2 - log; 日志;3 - numeric unsigned; 数字符号;4 - text.文本 "itemids": ["28439"], #监控项id "sortfield": "clock", "sortorder": "DESC", "limit": 2 #显示两条数据 }, "auth": auth, "id": 1 } #返回的数据 ''' [{ "itemid": "28439", "ns": "244866385", "value": "4", "clock": "1528274369" }, { "itemid": "28439", "ns": "197647992", "value": "4", "clock": "1528274339" }] '''
3. 只返回给定主机的历史记录
def get_historys_host(): values = { "jsonrpc": "2.0", "method": "history.get", "params": { "output": "extend", "history": 3, # 要返回的历史对象类型 # 0 - numeric float;数字浮点数;1 - character;字符 ;2 - log; 日志;3 - numeric unsigned; 数字符号;4 - text.文本 "hostids": "10264", #主机id "sortfield": "clock", "sortorder": "DESC", "limit": 2 # 显示两条数据 }, "auth": auth, "id": 1 } #返回的信息 ''' [{ "itemid": "28439", "ns": "244866385", "value": "4", "clock": "1528274369" }, { "itemid": "28439", "ns": "197647992", "value": "4", "clock": "1528274339" }] '''
六、Zabbix使用案例
1、zabbix通过api监控阿里云RDS
监控阿里云的RDS可以写脚本去用mysql命令登陆获取,也可以用API获取(API还按次数收费,前100万次免费)。
主要用到方法进行监控项数据查询
通过监控项链接,找到对应产品文档:
主要是填入这2个值,一个确定产品,一个确定监控项,再通过Dimensions参数查询指定实例的信息:
安装核心sdk和云监控、RDS的sdk:
pip3 install aliyun-python-sdk-core pip3 install aliyun-python-sdk-cms pip3 install aliyun-python-sdk-rds
1)脚本
1. 根据api获取rds的实例列表,生成json格式的内容
auto_rds.sh:
#!/usr/bin/python3 import json from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkrds.request.v20140815.DescribeDBInstancesRequest import DescribeDBInstancesRequest #秘钥 aliyun_user_ak = 'xxxxxxxxxxxxxxxxx' aliyun_user_sk = 'xxxxxxxxxxxxxxxxxxxxxxxxx' region_id = 'cn-beijing' client = AcsClient(ak=aliyun_user_ak, secret=aliyun_user_sk, region_id=region_id, timeout=300) rds_list = [] request = DescribeDBInstancesRequest() request.set_accept_format('json') request.set_InstanceNetworkType("VPC") request.set_VpcId("vpc-2ze0w06g138ax9rh7aj2e") response = client.do_action_with_exception(request) rds_info = json.loads(response) for i in range(len(rds_info["Items"]["DBInstance"])): rds_id = rds_info["Items"]["DBInstance"][i]["DBInstanceId"] rds_list += [{'{#RDSID}':rds_id}] print(json.dumps({'data':rds_list},sort_keys=True,indent=4,separators=(',',':')))
2. 根据api传入RDS的id和键值来获取信息
测试:
./rds_info.py rm-2zem2w8dlem15e49s ConnectionUsage
rds_info.py:
#!/usr/bin/python3 import datetime, json, sys, ast from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkcms.request.v20190101.DescribeMetricLastRequest import DescribeMetricLastRequest #秘钥 aliyun_user_ak = 'xxxxxxxxxxxxxxxxxxxxxxx' aliyun_user_sk = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx' region_id = 'cn-beijing' client = AcsClient(ak=aliyun_user_ak, secret=aliyun_user_sk, region_id=region_id, timeout=300) nowtime = datetime.datetime.now() stmp_time = nowtime - datetime.timedelta(minutes=4) etmp_time = nowtime - datetime.timedelta(minutes=3) start_time = stmp_time.strftime('%Y-%m-%d %H:%M:%S') #开始时间 end_time = etmp_time.strftime('%Y-%m-%d %H:%M:%S') #结束时 request = DescribeMetricLastRequest() request.set_accept_format('json') request.set_MetricName(sys.argv[2]) request.set_Period("60") request.set_StartTime(start_time) request.set_EndTime(end_time) request.set_Dimensions("[{"instanceId":%s}]" %(sys.argv[1])) request.set_Namespace("acs_rds_dashboard") response = client.do_action_with_exception(request) item_info = json.loads(response) item_str = item_info["Datapoints"] item_str = item_str.lstrip('[') #字符串去掉两边[] item_str = item_str.rstrip(']') item_dict = json.loads(item_str) #item_dict = ast.literal_eval(item_str) if item_info["Code"] == "200": print(item_dict["Average"]) else: print(item_info)
2)zabbix配置
修改配置文件,添加脚本位置:
vim /etc/zabbix/zabbix_agentd.d/userparams.conf #rds-api UserParameter=auto_rds,/usr/bin/python3 /etc/zabbix/script/rdsapi/auto_rds.py UserParameter=rds_info[*],/usr/bin/python3 /etc/zabbix/script/rdsapi/rds-info.py $1 $2
重启:
service zabbix-agent restart
3)网页配置
1. 修改配置文件重启服务
vim /etc/zabbix/zabbix_agentd.d/userparams.conf UserParameter=auto_rds,/usr/bin/python3 /etc/zabbix/script/rdsapi/auto_rds.py UserParameter=rds_info[*],/usr/bin/python3 /etc/zabbix/script/rdsapi/rds-info.py $1 $2
2. 通过客户端命令来查看是否可以获取到值
zabbix_agentd -t rds_info[rm-2ze2g49593rz06j8s,CpuUsage]
3. 添加自动发现规则
4. 监控项原型,{#RDSID}是json里定义的,rds_info[{#RDSID},MySQL_IbufUseRatio],类型浮点数。
5. 添加触发器
6. 将模板套用在有脚本在的那台机器上即可
2、批量添加监听端口
因为要监控每台机器启动的进程,机器太多又不想挨个手动加,所以有2种方式。可以采用自动发现进程脚本,然后lld方式批量加,但这样监控项只会写80端口监控,报警的时候也只会端口关闭。
使用第二种方式,根据客户端返回的信息,通过zabbix的api来批量添加端口监控就可以增加相关名称了。
可以用ansible下发agent脚本,然后开启服务端,再批量用ansible执行客户端脚本来达到批量操作。
1)服务端
需要python3,zabbix-net-server.py:
#!/usr/bin/python3 import socket, sys, time import json import requests #当前master监听 host = "172.16.5.4" port = 4312 #自定义监控项所在的应用集名称 zabbix_app = "netstat" #禁止的监控的服务列表,比如sshd,master,ntpd deny_server = ["sshd", "hblog", "zabbix_agentd", "master", "staragent-core", "DragoonAgent", "filebeat", "agent"] deny_port = ["32000"] #触发器告警级别,(0:未分类; 1:信息; 2:警告; 3:一般严重 ...) trigger_pri = 4 #zabbix服务器的IP地址 zabbix_ip = "172.16.1.46" #zabbix的用户名 zabbix_user = "Admin" #zabbix的密码 zabbix_pass = "123456" #zabbix api接口地址 url = "http://" + zabbix_ip + ":8000/api_jsonrpc.php" #zabbix api定义的访问头部信息 post_header = {'Content-Type': 'application/json'} #调用zabbix api需要身份令牌auth def get_auth(): post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": zabbix_user, "password": zabbix_pass }, "id": "1" } ret = requests.post(url, data=json.dumps(post_data), headers=post_header) zabbix_ret = json.loads(ret.text) if 'result' not in zabbix_ret: print('login error') else: return zabbix_ret.get('result') #用于给api提交并提交 def post_info(values, id_name): zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() try: req_error = zabbix_req['error']['data'] #如果获取不到就说明成功了,则返回信息 except: req_info = zabbix_req['result'][id_name] return req_info #以IP信息获取主机id def get_hostid(auth, host_ip): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": "extend", "filter": { "host": [host_ip] } }, "auth": auth, "id": 2, } zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() zabbix_req = zabbix_req['result'] try: host_id = zabbix_req[0]['hostid'] return host_id except: return 1 #根据主机id获取监控项,这块的条件没用,后面还是要写循环匹配 def get_interfaces(auth, host_id): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": ['name','hostid',], "filter": { 'hostids':[host_id] #根据主机id获取 }, "selectInterfaces": [ # 添加这个参数为了获取interfaceid的值 "interfaceid", "ip" ], }, "auth": auth, "id": 1 } zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() zabbix_req = zabbix_req['result'] for i in range(len(zabbix_req)): if zabbix_req[i]['hostid'] == host_id: return zabbix_req[i]['interfaces'][0]['interfaceid'] #根据主机id和interfaceid定位,传入端口号来添加监控端口,成功返回监控项id def post_item(auth, host_id, host_interfaceid, server_name, host_port, app_id): item_name = server_name + "的" + host_port + "端口-gd" item_key = 'check_net[' + host_port + ']' values = { "jsonrpc": "2.0", "method": "item.create", "params": { "name": item_name, "key_": item_key, "hostid": host_id, "interfaceid": host_interfaceid, "applications": [app_id], "type": 0, "value_type": 3, "delay": "60s" }, "auth": auth, "id": 1 } zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() print(zabbix_req) return zabbix_req['result']['itemids'][0] #根据主机ip来定位,传入端口号和服务名来添加触发器,成功返回触发器id def post_trigger(auth, host_ip, server_name, host_port): description = server_name + "的" + host_port + "端口关闭" expression = '{' + host_ip + ':check_net[' + host_port + '].sum(#5)}=5' values = { "jsonrpc": "2.0", "method": "trigger.create", "params": { "description": description, "expression": expression, "priority": trigger_pri }, "auth": auth, "id": 4 } return post_info(values, 'triggerids') #创建主机的应用集,成功返回应用集id def post_app(auth, zabbix_app, host_id): values = { "jsonrpc": "2.0", "method": "application.create", "params": { "name": zabbix_app, "hostid": host_id }, "auth": auth, "id": 1 } return post_info(values, 'applicationids') #根据host_id返回应用集列表, def get_appid(auth, zabbix_app, host_id): values = { "jsonrpc": "2.0", "method": "application.get", "params": { "output": "extend", "hostids": host_id, "sortfield": "name" }, "auth": auth, "id": 1 } zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() zabbix_req = zabbix_req['result'] for i in range(len(zabbix_req)): if zabbix_req[i]['name'] == zabbix_app: return zabbix_req[i]['applicationid'] #正式步骤 def post_all(host_ip, dict_info): print(host_ip + "开始添加监控项和对应触发器,并加入到应用集" + zabbix_app) #初始化链接,获得基本信息 auth = get_auth() host_id = get_hostid(auth, host_ip) host_interfaceid = get_interfaces(auth, host_id) #先创建应用集,如果已经存在则从循环里找出id app_id = post_app(auth, zabbix_app, host_id) if app_id is None: app_id = get_appid(auth, zabbix_app, host_id) for k,v in dict_info.items(): if v[1] in deny_server: continue else: if v[0] in deny_port: continue else: item_id = post_item(auth, host_id, host_interfaceid, v[1], v[0], app_id) trigger_id = post_trigger(auth, host_ip, v[1], v[0]) print(str(item_id)) if item_id: print("添加" + v[1] + "的" + v[0] + "端口监控完成") else: print("跳过" + v[1] + "的" + v[0] + "监控添加") print(" ") #持续监听端口,对客户端传入的数据进行监控项和触发器添加 def main(host, port): serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) serversocket.bind((host,port)) serversocket.listen(200) #最大连接数 while True: print('服务器启动,监听客户端链接') clientsocket,addr=serversocket.accept() host_ip = addr[0] data=clientsocket.recv(1024) dict_info = eval(data.decode('utf-8')) #变成字典 post_all(host_ip, dict_info) clientsocket.close() serversocket.closel() if __name__ == '__main__': main(host, port)
2)客户端
需要python2和net-tools包,zabbix-net-agent.py:
#!/usr/bin/python #coding=utf-8 #通过netstat -unltp命令收集监听端口,需要客户端安装net-tools #发送的字典结构:{'pid号',['端口号', '进程名']},pid号主要用于去重,因为一个进程可能监控多个端口 import json, commands, string import socket, sys #填写服务端地址和端口 host = "172.16.5.4" port = 4312 #常用端口列表,防止临时端口 eternal_port = ["80", "8080", "8005"] #返回当前机器 {'pid号',['端口号', '进程名']} def get_port(): prostr = commands.getstatusoutput('netstat -unltp') prostr = str(prostr) prolist = prostr.split('\n') #用两个才行 del prolist[0] del prolist[0] prolist = prolist[::-1] port_list = {} lock_pid = [] #用于锁定pid for info in prolist: port_info = info.split() if len(port_info) >= 7: tmp_port = port_info[3].split(':') tmp_port = tmp_port.pop() tmp_info = port_info[6].split('/') tmp_pid = tmp_info[0] try: tmp_name = tmp_info[1] except: continue if tmp_pid in lock_pid: #如果端口是常用端口组里,就跳过这个,只监控常用端口 continue if tmp_port in eternal_port: #如果在表里就把pid锁定了,加入到锁定数组里 lock_pid = lock_pid + [tmp_pid] port_list[tmp_pid] = [tmp_port, tmp_name] return port_list #向master程序提交信息 def post_port(host, port): s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) host=host port=port s.connect((host,port)) data = get_port() data = str(data) s.send(data.encode('utf-8')) s.close() if __name__ == "__main__": # post_port(host, port) print(get_port())
3)检测脚本
check_net.py:
#!/usr/bin/python #coding=utf-8 import json, commands, sys #返回当前机器 {'pid号',['端口号', '进程名']} def get_port(port): prostr = commands.getstatusoutput('netstat -unltp') prostr = str(prostr) prolist = prostr.split('\n') #用两个才行 del prolist[0] del prolist[0] port_list = [] for info in prolist: port_info = info.split() if len(port_info) >= 7: tmp_port = port_info[3].split(':') tmp_port = tmp_port.pop() port_list = port_list + [tmp_port] if port in port_list: print("0") else: print("1") if __name__ == "__main__": get_port(sys.argv[1])
4)清理脚本
如果添加后不想要了或者觉得有点问题,可以使用清理脚本批量清理掉。脚本根据Ip.txt逐行读取ip地址,查询这台机器拥有的id号,根据匹配[端口]结尾的监控项名字进行删除。
clear_item.py:
#!/usr/bin/python3 import json, re, requests #zabbix服务器的IP地址 zabbix_ip = "1.1.1.1" #zabbix的用户名 zabbix_user = "Admin" #zabbix的密码 zabbix_pass = "zabbix" #zabbix api接口地址 url = "http://" + zabbix_ip + ":8000/api_jsonrpc.php" #zabbix api定义的访问头部信息 post_header = {'Content-Type': 'application/json'} #调用zabbix api需要身份令牌auth def get_auth(): post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": zabbix_user, "password": zabbix_pass }, "id": "1" } ret = requests.post(url, data=json.dumps(post_data), headers=post_header) zabbix_ret = json.loads(ret.text) if 'result' not in zabbix_ret: print('login error') else: return zabbix_ret.get('result') #用于给api提交并提交 def post_info(values, id_name): zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() try: req_error = zabbix_req['error']['data'] #如果获取不到就说明成功了,则返回信息 except: req_info = zabbix_req['result'][id_name] return req_info #以IP信息获取主机id def get_hostid(auth, host_ip): values = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": "extend", "filter": { "host": [host_ip] } }, "auth": auth, "id": 2, } zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() zabbix_req = zabbix_req['result'] try: host_id = zabbix_req[0]['hostid'] return host_id except: return 1 def get_iteminfo(auth,host_id): values = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ['name','key','itemid'], "hostids": [host_id], }, "auth": auth, "id": 1 } zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() zabbix_req = zabbix_req['result'] NameRe = re.compile('端口-gd$') #做匹配 for i in range(len(zabbix_req)): if NameRe.search(zabbix_req[i]['name']): print(del_item(auth, zabbix_req[i]['itemid'])) def del_item(auth, item_id): values = { "jsonrpc": "2.0", "method": "item.delete", "params": [item_id], "auth": auth, "id": 1 } zabbix_req = requests.post(url, data=json.dumps(values), headers=post_header) zabbix_req = zabbix_req.json() return zabbix_req if __name__ == '__main__': for host_ip in open("ip.txt"): host_ip = host_ip.strip() auth = get_auth() host_id = get_hostid(auth, host_ip) get_iteminfo(auth, host_id)
3、zabbix聚合监控 整体使用率
通常用zabbix都是监控单台机器,但也有需求是查看整体的CPU、内存等使用率,来观测整体资源是否紧缺或者富裕。
1. 首先监控一台的cpu利用率
2. 获取到数据之后采用zabbix的汇总检查功能
3. 类型选择zabbix汇总,键值设置
grpavg[node101-170,system.cpu.util[0,user,avg5],last]
就是101-170机器的整体cpu利用率 grpavg 平均值 grpmax 最大值 grpmin 最低值 grpsum 价值总和。
例子1,主机组“MySQL服务器”的总磁盘空间。
grpsum [“ MySQL服务器”,“ vfs.fs.size [/,total]”,last]
例子2,主机组“MySQL服务器”的平均处理器负载。
grpavg [“ MySQL服务器”,“ system.cpu.load [,avg1]”,last]
例子3,主机组“ MySQL服务器”每秒平均5分钟的查询数量。
grpavg [“ MySQL服务器”,mysql.qps,avg,5m]
例子4,多个主机组中所有主机上的平均CPU负载。
grpavg [[“服务器A”,“服务器B”,“服务器C”],system.cpu.load,last]
4. 创建图形选择对应监控项
5. 就可以看到具体的数据了
6. 下面是内存使用率 也是先监控其中一台
7. 首先是总体内存
vm.memory.size[total]
8. 然后是用可用内存 也就是剩余内存
vm.memory.size[available]
9. 最后是用计算的方式获取百分比的值
100*(last(vm.memory.size[total])-last(vm.memory.size[available]))/last(vm.memory.size[total])
4、zabbix通过API监控RDS
阿里云的RDS自带的监控系统获取数据不怎么直观,想要通过API获取数据通过zabbix显示,因为网上资料缺乏和其他一些原因,获取API签名很困难,但使用阿里云的SDK可以完美避开获取签名的步骤。
阿里云SDK是什么?
SDK是阿里云为用户提供的开发工具,支持JAVA、PHP、C#等几种不同的语言,这里是用Python写的。在Python SDK里提供了一些模块,我们通过调用这些模块、传入一些必要的参数可以简单的实现数据的获取。
阿里云的sdk就是很多的库文件,这里我们只需要两个库文件,一个核心库sdk-core和rds库sdk-rds。
下载地址:
具体操作:
1. 进入sdk-rds所在的目录运行安装命令:
python setup.py install
若出现这个,是setuptools工具没安装,下载安装就可以:
import setuptools ImportError: No module named setuptools wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz tar -xvf setuptools-0.6c11.tar.gz cd setuptools-0.6c11 python setup.py build python setup.py install ls -l /usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg
2. 再次进入aliyun-python-sdk-rds目录,执行python setup.py install,同样进入aliyun-python-sdk-core,执行python setup.py install安装。
这时我们已经装好了阿里云sdk库环境
3. 在aliyun-python-sdk-rds/aliyunsdkrds/request/v20140815路径下有大量的sdk-rds api库文件,我们调用这里的库文件来查找其需要的参数的设置方法和发送请求。
调用阿里云的sdk分为三个步骤:
创建 AcsClient 实例并初始化;AcsClient即请求rds的实例,包括accesskeyid、accesskeysecret和regionid。
创建 API 请求并设置参数;这里的参数是除了公共参数之外所需要的所有参数,在阿里云文档上查看:
发起请求并打印返回。
4. 举个例子:
我想查看rds实例的资源使用情况。查看阿里云文档得知,其请求参数有两个:Action :DescribeResourceUsage和DBInstanceId:实例名。
我们进入aliyun-python-sdk-rds/aliyunsdkrds/request/v20140815下的DescribeResourceUsageRequest.py库查看DBInstanceId的设置方法为set_DBInstanceId。
于是我们创建请求并设置参数set_DBInstanceId:
request = DescribeResourceUsageRequest.DescribeResourceUsageRequest() request.set_DBInstanceId('rm-bpXXXXXXXX')
然后创建rds实例的AcsClient对象。
client = AcsClient( AcesskeyID, AcesskeySecret, regionid)
最后在通过do_action_with_exception发送请求:
client.do_action_with_exception(request)
完整代码如下:
#!/usr/bin/python #encoding=utf-8 from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkrds.request.v20140815 import DescribeResourceUsageRequest AcesskeyID = 'XXXXXXXXXXXXX' AcesskeySecret = 'XXXXXXXXXXXXXXXXXX' regionid = ‘XXXXXXXXXXX’ client = AcsClient( AcesskeySecret, regionid) request = DescribeResourceUsageRequest.DescribeResourceUsageRequest() request.set_DBInstanceId('rm-bp1XXXXXXXXXXXXX') response = client.do_action_with_exception(request) print response
5、zabbix监控web页面
有时候需要对网页进行访问,来方式服务还在,但网页访问超时等问题。
环境:
zabbix-3.4
yum包和编译参数:
libcurl-devel curl-devel –with-libcurl
1. 点开任意一个模板或者主机,有web场景这个选项
2. 客户端选择ie10,当然也可以是其它的
3. 选择步骤 -> 添加
4. URL就是访问的地址,也可以使用post提交参数,模拟登陆等等
5. 状态码为200则正常
6. 点击添加,添加上
7. 创建一个触发器,和普通触发器一样
8. 监控项选择如图所示的,当状态码不等于200时报警
过一会将nginx服务器关闭,可以看到报警提示。
6、zabbix监控日志文件
监控日志也是zabbix的一个很好的功能。像redis集群崩溃,会重组,但端口不会出问题,这就导致监控端口不会发现redis已经出现问题。
结构:
监控项筛选固定的内容进行记录,触发器对内容再次筛选或匹配,符合后进行告警。
环境:
zabbix-3.4.2。
1. 在客户端搭建一个httpd服务器
yum -y install httpd systemctl start httpd
2. 让zabbix客户端有权限查看,具体权限看情况设置
chmod -R 777 /var/log/httpd/
3. 自定义一个监控项,基于主机的
#被动模式不行 类型:主动式 #log[文件位置,筛选内容] 键值:log[/var/log/httpd/access_log,/admin.html] #日志格式 信息类型:日志 #y表示年,M表示月,d表示日,p和:表示占位符,h表示小时,m表示分钟,s表示秒。 日志时间格式:yyMMddphh:mm:ss
4. 浏览器访问
5. 检测 -> 最新数据 -> 异常访问admin
6. 触发器规则,我这里设置200报警,其实可以设置200正常,其它报警,规则可以再看看。
7. 访问 ,过一会再访问 ,看是否触发器会有提示。
8. 再访问正确地址,会发现报警取消了。
其它说明:
key:
首先要了解key log[ file ,<regexp>,<encoding>,<maxlines>,<mode>,<output>] file:文件名,写绝对路径 regexp:要匹配内容的正则表达式,或者直接写你要检索的内容也可以,例如我想检索带ERROR关键词的记录 encoding:编码相关,留空即可 maxlines:一次性最多提交多少行,这个参数覆盖配置文件 zabbxi_agentd.conf中的’MaxLinesPerSecond’,我们也可以留空 mode:默认是all,也可以是skip,skip会跳过老数据 output:输出给zabbix server的数据。可以是1、2一直9,1表示第一个正则表达式匹配出得内容,2表示第二个正则表达式匹配错的内容。
logrt:
logrt的file可以用正则表达式,防止日志切割。例如
access_*.log logrt[ file ,<regexp>,<encoding>,<maxlines>,<mode>,<output>]
注意说明
- zabbix server和zabbix agent 会追踪日志文件的大小和最后修改时间,并且分别记录到字节计数器和最新时间计数器中
- agent会从上次读取日志的地方开始读取日志
- 字节计数器和最新时间计数器的数据会被记录在zabbix数据库,并且发送给agent,这样能够保证agent从上次停止的地方开始读取
- 当日志文件大小小于字节计数器的数字时,字节计数器会变成0,从头开始读取文件,用于日志切割
- 所有符合配置的文件,都会被监控
- 一个目录下的多个文件如果修改时间相同,会按照字母顺序来读取
- 到每个update interval的时间时,agent会检查一次目录下的文件
- zabbix-agent每秒发送的日志数据,有一个日志行数的上限,这是为了防止网络和cpu负载过高,这个数字是zabbix_agent.conf中的MaxLinesPerSecond。
- 发送的日志量最多是agent设置的buffer size的50%,就算只有日志类监控(即没有其它类型的item),也是只有50%。同时,由于有maxlines,故需要将zabbix_agent.conf中的BufferSize设置为maxlines的2倍
- 当anget没有log类型的监控的时候,所有BufferSize都会为其它类型item服务。如果这时新建了日志文件类型的监控,会将BufferSize中最老的50%数据清空给日志文件item使用。
- 在logrt中,正在表达式只对文件名有效,对文件目录无效。
7、zabbix监控redis集群状态
监控项填写:
redis.cluster
触发器填写:
{B2C-SERVICE01:redis.cluster.last()}=1
应用:
应用于集群的创建服务器上。
注意:
因为这个ruby集群脚本需要调用ruby这个命令,ruby这个命令如果是环境变量的,需要用ln -s 将环境变量做个链接到/usr/bin/ruby。
因为服务端取值是不加载环境变量的。
1. 脚本
vim redis_cluster.sh
#!/bin/bash #redis集群状态监控 /ops/server/redis/src/redis-trib.rb check 127.0.0.1:7000 | grep "All 16384 slots covered" &> /dev/null [[ $? -eq 0 ]] && echo 0 || echo 1
2. 配置文件
vim redis_cluster.conf UserParameter=redis.cluster,/etc/zabbix/script/redis_cluster.sh
8、zabbix监控mysql主从状态
主要监控主从的状态、同步延迟补数,如果发生主从断开将会报警,这会非常有用。
注意:
如果mysql是源码安装,而且是环境变量的mysql命令,需要将脚本里mysql写成绝对路径。
1. 创建获取脚本
vim mysql-slave.sh #!/bin/bash #监控mysql从状态脚本 commnd() { /usr/local/mysql/bin/mysql -uroot -p'123456' -e "show slave statusG;" 2>/dev/null | grep -w $1 | awk -F': ' '{print $2}' } if [[ $1 == "Slave_IO_Running" ]];then a=`commnd Slave_IO_Running` [[ "$a" == "Yes" ]] && echo 0 || echo 1 elif [[ $1 == "Slave_SQL_Running" ]];then a=`commnd Slave_SQL_Running` [[ "$a" == "Yes" ]] && echo 0 || echo 1 elif [[ $1 == "Seconds_Behind_Master" ]];then a=`commnd Seconds_Behind_Master` b=`cat /tmp/sbm.tmp` if [[ $a -ge 600 ]] && [[ $b -ge 600 ]];then echo $a else echo 0 fi echo "$a" > /tmp/sbm.tmp elif [[ $1 == "Last_Errno" ]];then a=`commnd Last_Errno` [[ $a -eq 0 ]] && echo 0 || echo 1 elif [[ $1 == "Skip_Counter" ]];then a=`commnd Skip_Counter` [[ $a -eq 0 ]] && echo 0 || echo 1 else echo "Slave_IO_Running | Slave_SQL_Running | Seconds_Behind_Master | Last_Errno | Skip_Counter" fi
2. 修改配置文件
vim slave_info.conf UserParameter=slave_status[*],/etc/zabbix/script/mysql-slave.sh $1
3. 验证(zabbix_server端能取到值)
yum install zabbix_get -y zabbix_get -s 10.0.0.52 -k slave_status[Slave_IO_Running]
图形操作:
1. web界面创建监控项
2. web界面创建触发值
3. 依次创建监控项跟触发值
键值:
触发器:
为0则是正常的,Seconds_Behind_Master是延迟多少秒。超过600也就是10分钟会报警。
9、zabbix监控Centos网卡
zabbix默认模板没找到监控网卡的信息,这里的监控项是求出差值,每秒的流速。
zabbix-server 3.4.2版本。
监控项:
键值:net.if.in[网卡.bytes]
单位:bps
间隔:1s
添加2个动作,记录下一秒总量-上一秒总量,也就每秒的进出速率:
10、zabbix批量修改主机名
创建ips.txt:
主机名1 ip1 主机名2 ip2 主机名3 ip3
#!/usr/bin/python3 # _*_ coding:utf-8 _*_ import json import requests #zabbix服务器的IP地址 zabbix_ip = "127.0.0.1" #zabbix的用户名 zabbix_user = "Admin" #zabbix的密码 zabbix_pass = "123456" #zabbix api接口地址 url = "http://" + zabbix_ip + ":8000/api_jsonrpc.php" #zabbix api定义的访问头部信息 post_header = {'Content-Type': 'application/json'} # 调用zabbix api需要身份令牌auth def get_auth(): post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": zabbix_user, "password": zabbix_pass }, "id": "1" } ret = requests.post(url, data=json.dumps(post_data), headers=post_header) zabbix_ret = json.loads(ret.text) print(zabbix_ret) if 'result' not in zabbix_ret: print('login error') else: auth = zabbix_ret.get('result') return auth # 以IP信息获取主机id def get_hostid(): hostid_get = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": "extend", "filter": { "host": [ host_ip ] } }, "auth": Token, "id": 2, } res2 = requests.post(url, data=json.dumps(hostid_get), headers=post_header) res3 = res2.json() #print(res3) res4 = res3['result'] try: host_id = res4[0]['hostid'] return host_id except: print("zabbix中不存在,跳过") return "不行" # 以主机ID来修改主机名 def update_hostname(): hostname_update = { "jsonrpc": "2.0", "method": "host.update", "params": { "hostid": host_id, "name": host_name }, "auth": Token, "id": 3 } res10 = requests.post(url, data=json.dumps(hostname_update), headers=post_header) res11 = res10.json() #print(res11) if __name__ == '__main__': ''' ips.txt里的文件内容: 主机名1 ip1 主机名2 ip2 主机名3 ip3 ''' with open("ips.txt", "r", encoding="utf8") as f: for line in f: line = line.split(" ") host_name = line[0] host_ip = line[1].strip() #print(host_name) #print(host_ip) Token = get_auth() #print(Token) host_id = get_hostid() if host_id == "不行": continue #print(host_id) update_hostname() print(host_name,host_ip,"已添加完成")
11、zabbix监控zookeeper
创建获取脚本:
yum-y install nc vim zk_status.sh echo mntr | nc 127.0.0.1 2181 | grep "$1" |awk '{print $2}'
修改配置文件:
vim zk_status.conf UserParameter=zk_status[*],/etc/zabbix/script/zk_status.sh $1
12、zabbix自定义监控项和触发器
1)监控端口
触发器: 根据客户端的脚本获取值,当客户端的某项值达到要求后,将发出告警
监控项:根据客户端的脚本获取值,可设定采集值得间隔时间,将值保留记录下来,可形成曲线图
应用集:用来分类存放监控项,比如将监控80,8080等web服务的监控项放在WEB应用集中,将监控22,21等小服务的监控项放入SMALL应用集中。
模板:模板是一套定义好的监控项的合集,任何主机连接模板,则将模板中的监控项等等在主机上应用,但要修改这些监控项只能去模板中修改,并且修改后其他连接的主机也会跟着变动。
1. 创建模板,模板名称用来表示,这里监控端口,取名为Port,模板必须加入某群组,可单独创建群组来区分。
2. 创建应用集,应用集只用取名字即可
3. 创建监控项,名称用来区分监控的哪些值,可能是监控nginx的访问数量,也可能是mysql的读数量。
键值有2种,一种是点击选择使用系统自带值,另一种自定义脚本key。
这里选择net.tcp.listen[port],通过telnet来查找某主机是否监听某端口,[port]填写需要监控的端口号。
4. 创建触发器,{HOST.NAME}将获取主机名,用作报警显示。表达式点击添加,或复制其他自带触发器的值进行修改。
连接监控项,这个就是刚刚创建的监控项,其余不动。
5. 选择相应群组,从群组里找到刚建立的监控项。
6. Port是模板名,如果这里选择写主机名或主机ip,则会变成单个主机的监控项,而不是模板的。
2)监控服务
脚本:执行脚本获得值。
配置文件:允许自定义key,将key的键值和脚本获取值关联起来。
服务端测试: 服务端发送指令给客户端,客户端运行脚本获取值再返回给服务端。
1. 创建脚本,用于获取值
cd /etc/zabbix/script vim web_status.sh #!/bin/bash case $1 in Lian) netstat -anptu | grep 172.26.98.247:80 | wc -l ;; Ping) netstat -unltp | grep -w 80 &>/dev/null && echo 1 || echo 0 ;; *) echo "Lian | Ping" ;; esac
测试脚本 ./web_status.sh Ping
,看是否可以获得1。
2. 修改客户端配置文件,让他允许自定义key
vim /etc/zabbix/zabbix_agentd.conf Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf #加载其他配置文件 UnsafeUserParameters=1 #开启允许自定义 Key
systemctl restart zabbix-agent
3. 修改配置文件,设定键值的名字和脚本所在位置,这样配置文件才能知道这个键值需要执行哪个脚本获得。
web.ping是自定义的键值名字,后面是脚本路径:
vim /etc/zabbix/zabbix_agentd.d/web_status.conf UserParameter=web.ping,/etc/zabbix/script/web_status.sh Ping UserParameter=web.lian,/etc/zabbix/script/web_status.sh Lian
如果执行的是命令要用绝对路径,如下也能获取值,并不一定要用脚本。
UserParameter=web.shu,/bin/netstat -anptu | wc -l
4. 检测,客户端测试
zabbix_agentd -t web.ping #返回1则正确
服务端测试:
/ops/server/zabbix/bin/zabbix_get -s 192.168.1.1 -k web.ping #获得1则正确
5. 出现:
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
是因为脚本中用netstat 这个命令,但是客户端使用zabbix这个用户启动脚本,没有权限用这个命令。
客户端执行:
chmod +x /bin/netstat
即可。
网页操作:
键值是找不到的,手动写上,触发器的表达式也是连接这个监控项。
3)模板的导入和导出
导入:
导出:
选择模板拉倒最下面。
13、zabbix监控redis集群lld
自动发现模板需要2个脚本,
一个是自动发现脚本,可以是shell或者python等其他语言,脚本检测到端口号或其他信息,以json格式输出。
另一个是键值的脚本,可来自定义键值
模板通过自动使用自动发现脚本,获取到当前有哪些端口,再配合监控项来监控那些端口。以此达到套用模板后,自动监控当前的服务的作用。
客户端操作,添加或开启如下:
vim /etc/zabbix/zabbix_agentd.conf Include=/etc/zabbix/zabbix_agentd.d/*.conf Timeout=8 UnsafeUserParameters=1
修改配置文件后,重启:
systemctl restart zabbix-agent
创建脚本:
1. 安装依赖,用nc和telnet获取信息
yum -y install nc telnet
2. 客户端配置
当前用redis举例,其它都差不多。
编写自动发现脚本,可以py也可以shell:
cd /etc/zabbix/script vim auto_found.sh #!/bin/bash redis() { #获取端口并放到数组里 a=`netstat -unltp | grep redis | awk -F'[: /]+' '{print $5,$9}' | sort -n | uniq | awk '{print $1}'` b=0 port=() for i in `echo $a` do #因为redis集群会启动2个端口,比如7000,会启动17000端口,所以要去重,不然监控该重复了 echo $a | grep "1${i}" &> /dev/null [ $? -eq 0 ] && port[$b]=$i && let b++ done #以下为以JSON格式输出端口号 printf '{n' printf 't"data":[n' for key in ${!port[@]} do if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1` printf 't {n' printf "ttt"{#REDISPORT}":"${port[${key}]}"},n" else [[ "${key}" -eq "((${#port[@]}-1))" ]] socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1` printf 't {n' printf "ttt"{#REDISPORT}":"${port[${key}]}"}n" fi done printf 't ]n' printf '}n' } $1
找到netstat 并且给权限:
which netstat | chmod +s
执行,看是否是json格式的:
bash auto_found.sh redis
修改配置:
添加配置文件,第一个auto_found键值是获取端口号,第二个redis_status是根据根据端口号访问redis获取info信息:
vim /etc/zabbix/zabbix_agentd.conf.d/redis_status.conf UserParameter=auto_found[*],/bin/bash /etc/zabbix/script/auto_found.sh $1 UserParameter=redis_status[*],(/bin/echo info; sleep 1) | telnet 127.0.0.1 $1 2>&1 |grep $2|cut -d : -f2 | head -1
systemctl restart zabbix-agent
测试:
看是否返回和脚本结构一样的端口:
zabbix_agentd -t auto_found[redis]
7000是redis端口,后面是监控项:
zabbix_agentd -t redis_status[7000,used_cpu_sys]
服务端测试:
也是看返回是否和客户端一样:
usr/local/zabbix/bin/zabbix_get -s 192.168.1.91 -k auto_found[redis] usr/local/zabbix/bin/zabbix_get -s 192.168.1.91 -k redis_status[7000,used_cpu_sys]
服务端网页操作(附件有配置好的模板)
1. 选择自动发现规则—创建发现规则
2. 名字都可以,键值为自动发现的键值,更新间隔是60秒发现一次
3. 再点击监控项原型–创建监控项,名称的 {#REDISPORT} 为自动发现脚本输出得值,键值为监控键值,端口部分也是一样的变量名
4. 选择后套用到主机上,到最新数据中,查看redis是否获得值,是否监控到多个端口
14、ssl证书到期时间
1)server端操作
找一个安装有agent 的server 进行一下操作
1. 安装所需组件
yum install bc gcc gcc-c++ openssl -y
验证openssl:
[root@elk scripts]openssl version OpenSSL 1.0.2k-fips 26 Jan 2017
2. 验证脚本
#赋予权限 [root@bac scripts] chmod +x check_ssl.sh [root@elk scripts]./check_ssl.sh xxxx-xxxx.cn 565 #单位为天
3. zabbix 配置文件中添加配置
[root@elk scripts]cat /etc/zabbix/zabbix_agentd.conf |grep ssl UserParameter=check.ssl[*],/etc/zabbix/scripts/check_ssl.sh $1
4. 重启zabbix agent
systemctl restart zabbix-agent
2)web端操作
创建监控项:
1. 登录zabbix 创建新的监控项,名称随意填写
键值为你添加在配置文件中的 check.ssl[*] ***** 为你的域名。
更新间隔因为证书不需要做实时的检查 所以时间可以设置长一点。
2. 检查创建监控项是否生效
创建完成以后可以在检测—最新数据中查看监控项。
创建触发器:
1. 监控项有了接下来创建触发器
创建完毕 来测试下告警,把阈值调为600 天来测试下告警:
因为我们把更新间隔调的时间比较长 所以我们为了快速验证告警可以调小:
这个时候我们可以看到我们的告警信息。
到这SSL 证书监控告警已经完成。
3. 看到告警信息之后记得阈值调回来
3)脚本内容
#!/bin/sh host=$1 end_date=`openssl s_client -servername $host -host $host -port 443 -showcerts /dev/null | sed -n '/BEGIN CERTIFICATE/,/END CERT/p' | openssl x509 -text 2>/dev/null | sed -n 's/ *Not After : *//p'` if [ -n $end_date ] then end_date_seconds=date '+%s' --date $end_date now_seconds=date '+%s' echo ($end_date_seconds-$now_seconds)/24/3600 | bc fi
15、通过percona监控mysql
[zabbix-agent] 主机名 = host-1 系统 = centos-7.3 地址 = 1.1.1.1 软件 = percona-1.1.6
是zabbix的一个模板,相比于自带的监控更加详细。
1)程序安装
yum依赖:
yum -y install php php-mysql
安装插件:
yum -y install https://www.percona.com/downloads/percona-monitoring-plugins/1.1.6/percona-zabbix-templates-1.1.6-1.noarch.rpm
脚本:
/var/lib/zabbix/percona/scripts get_mysql_stats_wrapper.sh ss_get_mysql_stats.php
模板:
/var/lib/zabbix/percona/templates userparameter_percona_mysql.conf zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6.xml
修改脚本php,账号密码:
vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
如果监听本地的mysql则将localhost替换为127.0.0.1
vim /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
修改配置文件:
vim /usr/local/zabbix/etc/zabbix_agentd.conf #加载其它配置 Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf #开启允许自定义 Key UnsafeUserParameters=1
复制配置文件到加载目录:
cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /usr/local/zabbix/etc/zabbix_agentd.conf.d/
重启zabbix客户端:
/etc/init.d/zabbix_agentd restart
下载模板,自带的模板只支持zabbix-2版本,当前支持3:
wget http://jaminzhang.github.io/soft-conf/Zabbix/zbx_percona_mysql_template.xml
导出模板,需要lrzsz安装包:
sz zbx_percona_mysql_template.xml
2)图形配置
导入模板:
将刚刚下载的xml模板文件导入到服务器上:
点击导入,就会看见成功的字样了:
连接模板,需要点击添加后再更新:
查看数据,检测中-图形-选择主机-监控项:
16、使用自带模板监控mysql
1)客户端操作
1. 创建mysql用户获取信息(不要用root)
mysql -uroot -p mysql>grant usage on *.* to zabbix@localhost identified by 'zabbix_password'
2. 创建监控脚本key
vim /usr/local/zabbix/script/mysql_status.sh #!/bin/bash User='you_user' Password='you_password' Mysql='/usr/bin/mysql' Mysqladmin='/usr/bin/mysqladmin' command(){ #使用的sock登陆,如果没开启,那就删除socket这段 /usr/bin/mysql -u'zabbix' --socket=/ops/data/mysql/mysqld.sock -p'1qazxsw2!@' -e "show global status" 2>/dev/null | awk '$1 ~ /'"$1"'$/ {print $2}' } case $1 in Com_select) command $1 ;; Com_insert) command $1 ;; Com_update) command $1 ;; Com_delete) command $1 ;; Com_begin) command $1 ;; Com_commit) command $1 ;; Com_rollback) command $1 ;; Questions) command $1 ;; Slow_queries) command $1 ;; Bytes_received) command $1 ;; Bytes_sent) command $1 ;; Uptime) command $1 ;; Version) $Mysql -V | awk -F '[ ,]' '{print $6}' ;; Ping) $Mysqladmin -u'zabbix' --socket=/ops/data/mysql/mysqld.sock -p'1qazxsw2!@' ping 2>/dev/null |wc -l ;; *) echo "Usage: $0 { Com_select|Com_insert|Com_update|Com_delete|Com_begin|Com_commit|Com_rollback|Questions|Slow_queries|Bytes_received|Bytes_sent|Ping|Uptime|Version }" ;; esac
3. 测试脚本返回
mysql_status.sh Uptime
ping的返回1则是mysql在运行:
mysql_status.sh Ping
4. 修改配置文件
vim /usr/local/zabbix/etc/zabbix_agentd.conf Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf UnsafeUserParameters=1 #开启允许自定义 Key
5. 重启客户端
/etc/init.d/zabbix_agentd restart
6. 编写对应配置文件
vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/mysql_status.conf # Mysql_status UserParameter=mysql.status[*],/usr/local/zabbix/script/mysql_status.sh $1 UserParameter=mysql.ping,/usr/local/zabbix/script/mysql_status.sh Ping UserParameter=mysql.version,/usr/local/zabbix/script/mysql_status.sh Version
7. 测试,返回1正确
/usr/local/zabbix/sbin/zabbix_agentd -t mysql.ping
对于ubuntu机器,测试后出现没数据:
zabbix_agent -t mysql.ping mysql.ping [m|ZBX_NOTSUPPORTED] [Unsupported item key.]
那就直接跳过这一步,到服务端测试看是否可以获取到值。
2)服务端配置
1. 测试连通,返回1则ok
/usr/local/zabbix/bin/zabbix_get -s 192.168.1.10 -k mysql.ping
2. 效果
接下来把 Zabbix 自带的监控模板链接到主机即可。
过上一小会,就能看到效果了,version可能比较时间长点,因为模板里设的时间范围是3600秒,ping会误报一次Mysql Down,因为之前是没有值的。监控模板自带2张图,也可以自定义画图。
3)使用模板注意问题
zabbix有一个mysql监控的默认模板,但是其默认mysql账号验证信息在/var/lib/zabbix中,不正确,如果套用的话需要设置mysql。
1. 在zabbix-agent目录下/etc/zabbix/ 创建.my.cnf文件
vim /etc/zabbix/.my.cnf [client] user=zabbix password=zabbix
2. 然后查看 userparameter_mysql.conf 文件,看到类似HOME=/var/lib/zabbix的路径设置,把路径全都替换为 /etc/zabbix/,使用下面的命令
sed -i 's|/var/lib/zabbix|/etc/zabbix|g' /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
3. 修改完之后检查一下,然后重启agent
systemctl restart zabbix-agent
4. 在zabbix-server命令行测试下
zabbix_get -s 127.0.0.1 -p 10050 -k "mysql.status[Uptime]"
七、Zabbix企业级实战
1、zabbix的allinone手工安装
ip dessgn:
#ip地址是10.163.1.103/24(具备internet访问的centos8),采用最小化的安装,1G内存,1core的 cpu
zabbix allinone安装:
[root@eveng-home ~]# ssh 10.163.1.103 [root@localhost ~]# hostnamectl set-hostname zabbix-allinone [root@eveng-home ~]# ssh 10.163.1.103 [root@zabbix-allinone ~]# #我们选择国内的清华大学开源镜像站,作为我们的zabbix软件仓库 https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/8/x86_64/
清空旧的软件仓库:
[root@zabbix-allinone ~]# rm -rf /etc/yum.repos.d/*
设置新的软件仓库:
#我们在CentOS8里面需要设置BaseOS,AppStream,epel,zabbix #下面的这种命令如果在shell脚本里面就会以非交互式的方式创建指定内容的文件 [root@zabbix-allinone ~]# cat > /etc/yum.repos.d/repo.repo <<END [baseos] name=baseos baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/8/BaseOS/x86_64/os/ gpgcheck=0 [appstream] name=appstream baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/8/AppStream/x86_64/os/ gpgcheck=0 [epel] name=epel baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/ gpgcheck=0 [zabbix] name=zabbix baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/8/x86_64/ gpgcheck=0 END [root@zabbix-allinone ~]# yum repolist
zabbix-db的安装:
1.安装数据库 [root@zabbix-allinone ~]# yum -y install mariadb-server 2.启动数据库并设置下次开机启动 [root@zabbix-allinone ~]# systemctl enable mariadb --now 3.对数据库进行初始化设置(可选) 如果不做这个操作,你的数据库就是没有密码的,默认数据库会创建一个root的用户,而且这个root用户是 管理员且没有密码 [root@zabbix-allinone ~]# mysql_secure_installation Enter current password for root (enter for none): Set root password? [Y/n] y New password: 123456 Re-enter new password: 123456 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 4.测试连接 mysql是客户端命令,-u表示用户名,-p表示密码,-h表示数据库地址 [root@zabbix-allinone ~]# mysql -uroot -p123456 -hlocalhost MariaDB [(none)]> [root@zabbix-allinone ~]# mysql -uroot -p123456 -h10.163.1.103 MariaDB [(none)]> 5.创建一个zabbix的数据库并且设置一个专门的用户访问zabbix数据库的用户 [root@zabbix-allinone ~]# mysql -uroot -p123456 MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin; MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> use zabbix; MariaDB [zabbix]> show tables; MariaDB [zabbix]> exit 6.安装zabbix-server-mysql软件,将该软件提供的zabbix数据库模板导入新建的zabbix数据库 因为该软件提供了zabbix数据库的模板,里面包含了以后的表 [root@zabbix-allinone ~]# yum -y install zabbix-server-mysql 下面的文件就是zabbix数据库里面的模板文件 [root@zabbix-allinone ~]# ls /usr/share/doc/zabbix-server-mysql/create.sql.gz 7.将模板文件导入数据库 [root@zabbix-allinone ~]# zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -pzabbix zabbix #可以做个检查 [root@zabbix-allinone ~]# mysql -uzabbix -pzabbix -e "use zabbix;" -e "show tables;"
zabbix-server部署:
1.安装软件 由于我们之前安装了zabbix-server-mysql软件,所以我们的zabbix-server已经不需要额外安装别的软 件了。 2.修改/etc/zabbix/zabbix_server.conf配置文件 [root@zabbix-allinone ~]# egrep -v '^#|^$' /etc/zabbix/zabbix_server.conf LogFile=/var/log/zabbix/zabbix_server.log LogFileSize=0 PidFile=/var/run/zabbix/zabbix_server.pid SocketDir=/var/run/zabbix DBHost=10.163.1.103 DBName=zabbix DBUser=zabbix DBPassword=zabbix SNMPTrapperFile=/var/log/snmptrap/snmptrap.log Timeout=4 AlertScriptsPath=/usr/lib/zabbix/alertscripts ExternalScripts=/usr/lib/zabbix/externalscripts LogSlowQueries=3000 StatsAllowedIP=127.0.0.1 3.检查启动服务之前数据库的连接数量 [root@zabbix-allinone ~]# netstat -tunp | grep 3306 | grep -i esta | wc -l 0 4.关闭防火墙和selinux [root@zabbix-allinone ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config [root@zabbix-allinone ~]# setenforce 0 [root@zabbix-allinone ~]# systemctl disable firewalld --now 5.启动zabbix-server服务 [root@zabbix-allinone ~]# systemctl enable zabbix-server --now 6.检查数据库的连接数量 [root@zabbix-allinone ~]# netstat -tunp | grep 3306 | grep -i esta | wc -l 50
zabbix-web部署:
#我们选择lnmp的架构部署zabbix-web 1.软件安装 [root@zabbix-allinone ~]# yum -y install zabbix-web-mysql zabbix-nginx-conf 2.配置nginx的监听端口和监听地址 [root@zabbix-allinone ~]# rpm -qf /etc/nginx/conf.d/zabbix.conf zabbix-nginx-conf-5.0.3-1.el8.noarch [root@zabbix-allinone ~]# sed -i 's/^#.*listen.*/ listen 80;/' /etc/nginx/conf.d/zabbix.conf [root@zabbix-allinone ~]# sed -i 's/^#.*server_name.*/ server_name 10.163.1.103;/' /etc/nginx/conf.d/zabbix.conf 3.设置php的参数->时区 [root@zabbix-allinone ~]# rpm -qf /etc/php-fpm.d/zabbix.conf zabbix-web-5.0.3-1.el8.noarch [root@zabbix-allinone ~]# sed -i 's/; php_value[date.timezone] = Europe/Riga/php_value[date.timezone] = Asia/Shanghai/' /etc/php-fpm.d/zabbix.conf 4.启动nginx服务和php-fpm服务 [root@zabbix-allinone ~]# systemctl enable nginx php-fpm --now
访问zabbix-web来配置zabbix-web连接zabbix-db和zabbix-server:
上面的操作生成了/etc/zabbix/web/zabbix.conf.php配置文件。
将语言改成中文:
由于没有中文包,所以我们需要安装一下中文包 [root@zabbix-allinone ~]# yum -y install langpacks-zh_CN [root@zabbix-allinone ~]# yum -y install glibc-common 如果你已经安装过glibc-common,你重新安装即可 [root@zabbix-allinone ~]# yum -y reinstall glibc-common
查看日志:
[root@server zabbix]# ls /var/log/zabbix/zabbix_server.log [root@db mariadb]# ls /var/log/mariadb/mariadb.log [root@web ~]# ls /var/log/nginx/{access,error}.log /var/log/nginx/access.log /var/log/nginx/error.log [root@web ~]# ls /var/log/php-fpm/error.log
常见安装报错:
- zabbix数据库的用户是否正确授权。
- 防火墙和selinux是否关闭。
- mariadb数据库是否启动了。
- zabbix_server.conf中管理mariadb的配置是否正确 DBHost DBName DBUser DBPassword
- 关于zabbix-web几乎没有报错,检查你的配置文件是否符合规范,别有特殊字符在里面。
- 如果你访问zabbix-web去设置zabbix-web对zabbix-server和zabbix-db的连接,确保你的客户端 和zabbix-web的ip可达。如果ip不能直接的通过3层可达,可以通过ssh动态端口转发实在socks5的代理, 访问zabbix-web。
2、Zabbix的组件分离手工安装
ip design:
zabbix-server:10.163.1.103 zabbix-db:10.163.1.102 zabbix-web:10.163.1.117
zabbix组件分离安装:
基础配置:
[root@eveng-home ~]# ssh 10.163.1.103 [root@localhost ~]# hostnamectl set-hostname server [root@localhost ~]# exit [root@eveng-home ~]# ssh 10.163.1.103 [root@server ~]# [root@server ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config [root@server ~]# setenforce 0 [root@server ~]# systemctl disable firewalld --now [root@eveng-home ~]# ssh 10.163.1.102 [root@localhost ~]# hostnamectl set-hostname db [root@localhost ~]# exit [root@eveng-home ~]# ssh 10.163.1.102 [root@db ~]# [root@db ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config [root@db ~]# setenforce 0 [root@db ~]# systemctl disable firewalld --now [root@eveng-home ~]# ssh 10.163.1.117 [root@localhost ~]# hostnamectl set-hostname web [root@localhost ~]# exit [root@eveng-home ~]# ssh 10.163.1.117 [root@web ~]# [root@web ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config [root@web ~]# setenforce 0 [root@web ~]# systemctl disable firewalld --now
清空旧的软件仓库:
[root@server ~]# rm -rf /etc/yum.repos.d/* [root@db ~]# rm -rf /etc/yum.repos.d/* [root@web ~]# rm -rf /etc/yum.repos.d/*
设置新的软件仓库:
[root@server ~]# cat > /etc/yum.repos.d/repo.repo <<END [baseos] name=baseos baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/8/BaseOS/x86_64/os/ gpgcheck=0 [appstream] name=appstream baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/8/AppStream/x86_64/os/ gpgcheck=0 [epel] name=epel baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/ gpgcheck=0 [zabbix] name=zabbix baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/8/x86_64/ gpgcheck=0 END [root@db ~]# cat > /etc/yum.repos.d/repo.repo <<END [baseos] name=baseos baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/8/BaseOS/x86_64/os/ gpgcheck=0 [appstream] name=appstream baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/8/AppStream/x86_64/os/ gpgcheck=0 [epel] name=epel baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/ gpgcheck=0 [zabbix] name=zabbix baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/8/x86_64/ gpgcheck=0 END [root@web ~]# cat > /etc/yum.repos.d/repo.repo <<END [baseos] name=baseos baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/8/BaseOS/x86_64/os/ gpgcheck=0 [appstream] name=appstream baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/8/AppStream/x86_64/os/ gpgcheck=0 [epel] name=epel baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/ gpgcheck=0 [zabbix] name=zabbix baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/8/x86_64/ gpgcheck=0 END
zabbix-db的安装:
[root@db ~]# yum -y install mariadb-server zabbix-server-mysql [root@db ~]# systemctl enable mariadb --now [root@db ~]# mysql -e "create database zabbix character set utf8 collate utf8_bin;" [root@db ~]# mysql -e "grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';" [root@db ~]# mysql -e "flush privileges;" [root@db ~]# zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql - uzabbix -pzabbix zabbix [root@db ~]# mysql -uzabbix -pzabbix -e "use zabbix;" -e "show tables;"
zabbix-server的安装:
[root@server ~]# yum -y install zabbix-server-mysql [root@server ~]# sed -i 's/^# DBHost.*/DBHost=10.163.1.102/' /etc/zabbix/zabbix_server.conf [root@server ~]# sed -i 's/^# DBPassword.*/DBPassword=zabbix/' /etc/zabbix/zabbix_server.conf [root@server ~]# systemctl enable zabbix-server --now
zabbix-web的安装:
[root@web ~]# yum -y install zabbix-web-mysql zabbix-nginx-conf [root@web ~]# sed -i 's/^#.*listen.*/ listen 80;/' /etc/nginx/conf.d/zabbix.conf [root@web ~]# sed -i 's/^#.*server_name.*/ server_name 10.163.1.117;/' /etc/nginx/conf.d/zabbix.conf [root@web ~]# sed -i 's/; php_value[date.timezone] = Europe/Riga/php_value [date.timezone] = Asia/Shanghai/' /etc/php-fpm.d/zabbix.conf [root@web ~]# systemctl enable nginx php-fpm --now
访问zabbix-web:
设置中文:
如果是组件分离的安装方式,那么应该在zabbix-web上安装中文。
[root@web ~]# yum -y install langpacks-zh_CN glibc-common
3、shell脚本实现zabbix自动化安装
shell脚本需求和流程:
shell脚本实现zabbix自动化安装,我们需要安装zabbix-db,zabbix-server,zabbix-web,不同的
zabbix组件,所需的安装的软件包不同,修改的配置文件不同,组件所在的节点ip不同,节点的主机名不同。
shell脚本流程:
1. 节点的基础配置 主机名,ip地址,地址掩码,网关,dns,软件仓库
2. 软件安装
zabbix-db需要安装mariadb数据库,zabbix-server-mysql
zabbix-server需要安装zabbix-server-mysql
zabbix-web需要安装zabbix-web-mysql,zabbix-nginx-conf
3. 配置文件修改
zabbix-db需要导入zabbix的数据库
zabbix-server需要配置zabbix-db的连接
zabbix-web需要修改nginx和php
4. 启动服务
zabbix-db需要启动mariadb服务
zabbix-server需要启动zabbix-server服务
zabbix-web需要启动nginx和php-fpm服务
写shell脚本规范:
为了保证脚本的可扩展性,我们尽量的将配置写成函数的形式,且要对脚本的每一步操作做检查,如果可能的 话,尽量在脚本中提供带颜色的输出,相当于日志,尽可能的在脚本中加上备注,以防止后期别人看这个脚本 或者你自己看这个脚本没有障碍。
shell脚本的运行位置:
尽量选择一个额外的节点的来对我们的组件进行部署,这样能保证我们在任何场景如果想快速的进行一个 zabbix监控平台的部署提供便捷性。在我们的实验中,我们选择eveng作为我们的脚本运行节点。
写shell脚本:
#!/bin/bash #保证你的安装节点要有sshpass #---------------------------此处之后不可修改----------------------------------------- function line() { echo -e "