zabbix自动化监控基础

zabbix安装配置文档 2

一 zabbix-server 安装配置(基础配置) 2

二 zabbix agent安装配置 5

2.1 主动模式和被动模式 6

2.2 安装配置zabbix_agent 12

2.3 配置zabbix-server 前端(active)模式 18

2.4 自动发现 18

2.5 自动注册 21

附录: 22

1 自动发现(原理) 22

网络发现简介 22

2 自动发现(具体操作) 24

3 自动注册 33

4 zabbix low-level discover zabbix批量部署必备 38

1. 概述 38

2. Discovery之文件系统 38

3. 自定义LLD规则 44

5 zabbix自定义自动发现服务(low-level-discovery)监控系统服务 47

1 ) 概述 47

2 )  LLD脚本 48

3) 添加模板和自动发现规则 52

6 解决现实中文乱码: 65

7 zabbix_agent playbook 批量安装 66

 

 

zabbix安装配置文档

 

一 zabbix-server 安装配置(基础配置)

# 软件版本 4.0.4,172.20.50.11

# 参考地址 https://www.zabbix.com/download

# 导入repo包

rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm

# 安装配置数据库

yum remove mariadb-libs -y

# 上传mysql相关包

mysql-community-client-5.7.22-1.el7.x86_64.rpm

mysql-community-devel-5.7.23-1.el7.x86_64.rpm  

mysql-community-libs-compat-5.7.23-1.el7.x86_64.rpm

mysql-community-common-5.7.22-1.el7.x86_64.rpm  

mysql-community-libs-5.7.22-1.el7.x86_64.rpm   

mysql-community-server-5.7.22-1.el7.x86_64.rpm

 

yum install * -y

 

vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

character_set_server = utf8

interactive_timeout = 120

wait_timeout = 120

symbolic-links=0

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

[client]

socket=/data/mysql/mysql.sock

 

# 在配置文件中[mysqld] 中添加skip-grant-tables 并且重启mysqld服务,跳过授权表

FLUSH PRIVILEGES;

GRANT ALL PRIVILEGES ON *.* TO 'zabbix'@'localhost' IDENTIFIED BY 'JkW&$y42PL5&y#cx';

GRANT ALL PRIVILEGES ON *.* TO 'zabbix'@'%' IDENTIFIED BY 'JkW&$y42PL5&y#cx';

FLUSH PRIVILEGES;

# 注释 数据库配置中skip-grant-tables 配置

# 创建zabbix库

create database zabbix character set utf8 collate utf8_bin;

 

# 安装zabbix相关包

yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent -y

 

# 初始化zabbix表结构

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p JkW&$y42PL5&y#cx

 

[root@VM_4_84_centos mysql]# cat /etc/zabbix/zabbix_server.conf | egrep -v "^$|^#|#"

LogFile=/var/log/zabbix/zabbix_server.log

LogFileSize=0

PidFile=/var/run/zabbix/zabbix_server.pid

SocketDir=/var/run/zabbix

DBName=zabbix

DBUser=zabbix

DBPassword=JkW&$y42PL5&y#cx

DBSocket=/data/mysql/mysql.sock

SNMPTrapperFile=/var/log/snmptrap/snmptrap.log

Timeout=4

AlertScriptsPath=/usr/lib/zabbix/alertscripts

ExternalScripts=/usr/lib/zabbix/externalscripts

LogSlowQueries=3000

 

# 修改时区

vim /etc/httpd/conf.d/zabbix.conf

php_value date.timezone Asia/Shanghai

 

# 启动服务

systemctl restart zabbix-server zabbix-agent httpd

systemctl enable zabbix-server zabbix-agent httpd

 

# 配置前端

http://172.20.50.11/zabbix

 

# 生成的配置信息

Database type MySQL

Database server 172.20.50.11

Database port 3306

Database name zabbix

Database user zabbix

Database password ****************

 

Zabbix server 172.20.50.11

Zabbix server port 10051

Zabbix server name zabbix_server

 

# 配置信息路径

Configuration file "/etc/zabbix/web/zabbix.conf.php" created.

 

# 初始账号

Admin/zabbix

 

 

 

二 zabbix agent安装配置

 

2.1 主动模式和被动模式

主动模式的流程:

客户端每隔一段时间主动向服务端发起连接请求–>服务端收到请求,查询客户端需要取的item信息,发送给客户端–>客户端收集数据发送服务端–>结束。

被动模式的流程:

客户端开一个端口默认10050,等待服务端来取数据,然后客户端收集数据发送到服务端,然后结束。

 

zabbix agent检测分为主动(agent active)和被动(agent)两种形式,主动与被动的说法均是相对于agent来讨论的。

简单说明一下主动与被动的区别如下:

主动:agent请求server获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy

被动:server向agent请求获取监控项的数据,agent返回数据。

zabbix agent通信过程中的协议均基于json格式,格式如下:

- "ZBXD\x01" (5 bytes)

- data length (8 bytes). 1 will be formatted as 01/00/00/00/00/00/00/00 (eight bytes in HEX, 64 bit number)

 

备注:为了避免内存耗尽,server限制每个通信连接最多使用128MB内存。

 

被动检测:

server发起如下请求

<item key>\n

Aegent返回如下响应数据

<HEADER><DATALEN><DATA>[\0<ERROR>]

supported items通信过程:

1)  Server打开一个TCP连接

2)  Server发送请求agent.ping\n

3)  Agent接收到请求并且响应<HEADER><DATALEN>1

4)  Server处理接收到的数据

 

关闭TCP连接:

not supported items通信过程:

1)  Server打开一个TCP连接

2)  Server发送请求vfs.fs.size[/nono]\n

3)  Agent接收请求并且返回响应数据 <HEADER><DATALEN>ZBX_NOTSUPPORTED\0Cannot obtain filesystem information: [2] No such file or directory

4)  Server接收并处理数据, 将item的状态改为“ not supported ”

5) 关闭TCP连接

 

主动检测:

zabbix首先向ServerActive配置的IP请求获取active items,获取并提交active tiems数据值server或者proxy。zabbix多久获取一次active items?它会根据配置文件中的RefreshActiveChecks的频率进行,如果获取失败,那么将会在60秒之后重试获取ACTIVE ITEMS列表。

Agent请求:

<HEADER><DATALEN>{

    "request":"active checks",

    "host":"<hostname>"

}


Server响应列表:

<HEADER><DATALEN>{

    "response":"success",

    "data":[

        {

            "key":"log[/home/zabbix/logs/zabbix_agentd.log]",

            "delay":30,

            "lastlogsize":0,

            "mtime":0

        },

        {

            "key":"agent.version",

            "delay":600,

            "lastlogsize":0,

            "mtime":0

        },

        {

            "key":"vfs.fs.size[/nono]",

            "delay":600,

            "lastlogsize":0,

            "mtime":0

        }

    ]

}

 

 


备注:获取到的items列表中的所有item属性key, delay, lastlogsize ,mtime都必须存在,获取列表的通信过程如下:

1)  Agent打开TCP连接(主动检测变成Agent打开)

2)  Agent请求items检测列表

3)  Server返回items列表

4)  Agent 处理响应

5)  关闭TCP连接

6)  Agent开始收集数据

7)  提交active items数据

Agent发送请求:

<HEADER><DATALEN>{

    "request":"agent data",

    "data":[

        {

            "host":"<hostname>",

            "key":"agent.version",

            "value":"2.4.0",

            "clock":1400675595,

            "ns":76808644

        },

        {

            "host":"<hostname>",

            "key":"log[/home/zabbix/logs/zabbix_agentd.log]",

            "lastlogsize":112,

            "value":" 19845:20140621:141708.521 Starting Zabbix Agent [<hostname>]. Zabbix 2.4.0 (revision 50000).",

            "clock":1400675595,

            "ns":77053975

        },

        {

            "host":"<hostname>",

            "key":"vfs.fs.size[/nono]",

            "state":1,

            "value":"Cannot obtain filesystem information: [2] No such file or directory",

            "clock":1400675595,

            "ns":78154128

        }

    ],

    "clock": 1400675595,

    "ns": 78211329

}


Server响应数据

{

 "response":"success",

 "info":"processed: 3; failed: 0; total: 3; seconds spent: 0.003534"

 }


备注:如果有些数据提交失败,比如host、item被删除或者禁用,agent不会尝试重新提交

主动检测提交数据过程如下:

1)  Agent建立TCP连接

2)  Agent提交items列表收集的数据

3)  Server处理数据,并返回响应状态

4)  关闭TCP连接

 

 

被动模式agent配置:

[root@zabbix_client ]# grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf

PidFile=/var/run/zabbix/zabbix_agentd.pid

LogFile=/var/log/zabbix/zabbix_agentd.log

LogFileSize=0

StartAgents=3

Server=172.20.50.11

ServerActive=172.20.50.11

Hostname=zabbix_client

HostMetadataItem=system.uname

 

systemctl restart zabbix-agent

 

因为zabbix监控模板默认使用的就是被动模式,所以zabbix-server端直接添加hosts默认使用的就是被动模式。

 

主动模式配置:

[root@zabbix_master zabbix-server-mysql-3.2.7]# grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf

PidFile=/var/run/zabbix/zabbix_agentd.pid

LogFile=/var/log/zabbix/zabbix_agentd.log

LogFileSize=0

StartAgents=0

Server=172.20.50.11  # 注意,这里虽然没啥用,但是获取可以解决前端可以搜集数据但是显示状态为红色的bug

ServerActive=172.20.50.11

Hostname=172.20.50.11

Include=/etc/zabbix/zabbix_agentd.d/*.conf

 

客户端agent模式,StartAgents=0设置为0表示关闭被动模式,被监控端的 zabbix_agentd 不监听本地端口,所以无法在 netstat -tunpl 中查看到zabbix_agentd进程

取值范围:0-100

默认值:3

zabbix启动之后开启被动监控的进程数量,如果设置为0,那么zabbix被动监控被禁用,并且不会监听相应端口,也就是说10050端口不会开启。

2.2 安装配置zabbix_agent

# 手动安装zabbix_agent

 

tar xf zabbix_agents-4.0.0-centos7-amd64-openssl.tar.gz -C /opt/

mv /opt/zabbix_agents-4.0.0-centos7-amd64-openssl /opt/zabbix_agent

cd /opt/zabbix_agent

mkdir pids

mkdir log

useradd zabbix

chown -R zabbix.zabbix /opt/zabbix_agent

 

vim /etc/init.d/zabbix_agentd

#!/bin/bash

#

# chkconfig: - 90 10

# description:  Starts and stops Zabbix Agent using chkconfig

# Tested on Fedora Core 2 - 5

# Should work on all Fedora Core versions

#

# @name: zabbix_agentd

# @author: Alexander Hagenah <hagenah@topconcepts.com>

# @created: 18.04.2006

#

# Modified for Zabbix 2.0.0

# May 2012, Zabbix SIA

#

# Source function library.

. /etc/init.d/functions

 

# Variables

# Edit these to match your system settings

 

# Zabbix-Directory

BASEDIR=/opt/zabbix_agent

 

# Binary File

BINARY_NAME=zabbix_agentd

 

# Full Binary File Call

FULLPATH=$BASEDIR/sbin/$BINARY_NAME

 

# config file

CONFIG=$BASEDIR/conf/zabbix_agentd.conf

# PID file

PIDFILE=/opt/zabbix_agent/pids/$BINARY_NAME.pid

 

# Establish args

ERROR=0

STOPPING=0

 

#

# No need to edit the things below

#

 

# application checking status

if [ -f $PIDFILE  ] && [ -s $PIDFILE ]

then

PID=`cat $PIDFILE`

 

if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null && [ $BINARY_NAME == `ps -e | grep $PID | awk '{print $4}'` ]

then

STATUS="$BINARY_NAME (pid `pidof $APP`) running.."

RUNNING=1

else

rm -f $PIDFILE

STATUS="$BINARY_NAME (pid file existed ($PID) and now removed) not running.."

RUNNING=0

fi

else

if [ `ps -e | grep $BINARY_NAME | head -1 | awk '{ print $1 }'` ]

then

STATUS="$BINARY_NAME (pid `pidof $APP`, but no pid file) running.."

else

STATUS="$BINARY_NAME (no pid file) not running"

fi

RUNNING=0

fi

 

# functions

start() {

if [ $RUNNING -eq 1 ]

then

echo "$0 $ARG: $BINARY_NAME (pid $PID) already running"

else

action $"Starting $BINARY_NAME: " $FULLPATH -c $CONFIG

touch /var/lock/subsys/$BINARY_NAME

fi

}

 

stop() {

echo -n $"Shutting down $BINARY_NAME: "

killproc $BINARY_NAME

RETVAL=$?

echo

[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$BINARY_NAME

RUNNING=0

}

 

 

# logic

case "$1" in

start)

start

;;

stop)

stop

;;

status)

status $BINARY_NAME

;;

restart)

stop

sleep 10

start

;;

help|*)

echo $"Usage: $0 {start|stop|status|restart|help}"

cat <<EOF

 

start - start $BINARY_NAME

stop - stop $BINARY_NAME

status - show current status of $BINARY_NAME

restart - restart $BINARY_NAME if running by sending a SIGHUP or start if not running

help - this screen

 

EOF

exit 1

;;

esac

 

exit 0

 

chmod +x /etc/init.d/zabbix_agentd

 

cd zabbix_agentd/

mv userparameter_examples.conf userparameter_examples.conf.bak

mv serparameter_mysql.conf serparameter_mysql.conf.bak

 

 

[root@vm_110_2_centos conf]# cat /opt/zabbix_agent/conf/zabbix_agentd.conf

PidFile=/opt/zabbix_agent/pids/zabbix_agentd.pid

LogFile=/opt/zabbix_agent/logs/zabbix_agentd.log

LogFileSize=0

StartAgents=0

ServerActive=172.20.50.11

Server=172.20.50.11

Hostname=本机IP地址

Include=/opt/zabbix_agent/conf/zabbix_agentd/*.conf

UnsafeUserParameters=1

 

 

/etc/init.d/zabbix_agentd start

chkconfig zabbix_agentd on

 

 

2.3 配置zabbix-server 前端(active)模式

1) 创建模板

创建一个主动模式的模板:

 

克隆一个模板,把所有的类型改为Zabbix agent(Active)主动模式:

克隆模板:Configuration–》Template–》Template OS Linux(选择需要克隆的模板)–》Full clone(最下面)–》Template name:Template OS Linux Active–》Add

把这个模板软连接的模板remove掉,,添加一个新的克隆的类型为主动的。另外,克隆模板成功后,记得修改类型,改为主动模式。

 

2.4 自动发现

zabbix自动发现主机,可以在ansible安装好zabbix客户端后,服务器能直接发现客户端

 

 

1)创建一个规则,名字自定义,ip范围是想要发现的主机范围。时间间隔,每多久发现一次。检查,建议用uptime,这样表明能用zabbix的自带的键值都能监控到,就可以添加该主机了。设置准则就不要用ip地址了,会出错的。然后更新就可以了。

 

2)接下来是操作,也就是你的动作主要要做什么,我添加了3点,在操作细节那里添加,分别是把发现的主机添加进来,第二点是发主机添加到Base Group组里,第三点是给主机与一个模板关联。最后点更新就可以了。

 

 

2.5 自动注册

zabbix客户端搭建好后,自动注册到zabbix服务端,这样可以降低zabbix服务端的负载。

 

 

 

 

附录:

1 自动发现(原理)

网络发现简介

网络发现有什么用?网络发现怎么配置?我们带着这两个问题开始我们的网络发现之旅。比如小明有100台服务器,不想一台台主机去添加,能不能让zabbix自动添加主机呢,当然可以,网络发现便是这个功能,当然前提条件是所有服务器都已经安装了agent或者snmp(其实也可以不用,鉴于我们大部分功能都用agent,所以请安装上agent),server扫描配置好的ip段,自动添加host,自动给host link模板,自动加到主机组里等等。网络发现功能让我们能更快速的部署zabbix、简化zabbix管理、并且在经常变动的环境里面也不需要花太多的精力,毕竟网络发现也能随时变化。虽然网络发现能干很多事情,但是它无法发现网络拓扑。

zabbix网络发现基于如下信息

ip范围

可用的外部服务(FTP, SSH, WEB, POP3, IMAP, TCP, etc)

来自zabbix agent的信息

来自snmp agent的信息

网络发现由两个阶段组成:discovery和actions

Discovery发现

zabbix定期扫描网络发现规则中的ip范围,每个规则中都定义了一组需要检测的服务,在这些ip范围内一一扫描

网络发现模块每次检测到service和host(ip)都会生成一个discovery事件,如下是事件

时间

条件

Service Up

zabbix检测到可用的service

Service Down

zabbix无法检测到service

Host Up

某个ip上至少有一个service是up状态

Host Down

所有service都无响应

Service Discovered

一个service首次被发现或者在维护后从新归队

Service Lost

service在up之后又丢失了

Host Discovered

一个host首次被发现或者在维护后从新归队

Host Lost

一个host在up之后又丢失了

 

Actions动作

zabbix所有action都是基于发现事件,例如:

发送通知

添加/移除主机

启用/禁用主机

添加主机到组

从组中移除主机

主机link模板/unlink模板

执行远程脚本命令

创建主机
discovery发现主机事件产生之后,接下来需要执行discovery action,在action中选择添加主机操作、并且将主机加入某个组以及link某个模板等等。更具体操作请关注下一篇文章。那么主机名怎么定义呢?首先监控端(server/proxy)通过ip泛解析主机名(如果失败了,不会重新尝试),如果解析成功了,那么zabbix将会使用这个主机名,否则直接使用ip地址。如果主机名相同怎么办?比如都叫ttlsa-server,那么第一台主机名会定义为ttlsa-server,第二台为ttlsa-server_2,第三台为ttlsa-server_3,以此类推。action配置里的条件包含设备类型、IP、状态、uptime/downtime等等。
添加主机接口
主机接口规则如下:

服务检测 - 例如,成功检测到一个SNMP服务,那么创建snmp接口

如果主机同时UIzabbix agent和snmp请求作出响应,那么会同时创建这两种接口

如果使用agent或者snmp作为唯一性指标,先通过哪个接口发现主机,那么哪个接口就作为默认接口,其他的作为附加接口。

如果一开始只响应zabbix agent的检测,那么他只会创建agent接口。如果后面响应了snmp检测,那么他又会增加snmp接口

如果有三*立的主机A\B\C,一开始使用IP地址来作为唯一标识。可以看到discovery有三条记录。此时我们修改发现规则,让他们有相同的唯一标识。例如自定义一个keysystem.dis,这个key统一输出值"ttlsa",这样A的接口成了默认的,B和C都变成了附加到A主机上。我们可以发现一个很明显的变化。在discovery接口中依旧有3条记录,但是"discovered device"这列显示的A主机的接口,”monitored host“这列显示的都是A主机的名称,”Uptime/downtime“这列只有A主机有值,B和C都为空。从这里我们能看到唯一标识是多重要,如果唯一标识不是唯一,那么有的主机会被认为是同一台

在了解了《网络发现规则》是什么之后,我们开始配置。首先,我们需要定义发现规则,用于扫描。步骤如下

 

 

 

2 自动发现(具体操作)

第一步

Configuration >>Discovery>>Create rule,编辑网络发现规则

 

如上配置,zabbix每30秒会扫描10.9.7.88与10.9.32.106-107。会使用key:agent.uanme来判断客户端是否存在,并且以IP地址作为唯一性的标识。

 

规则属性

 属性

描述

Name

规则名称,唯一

 Discovery by proxy

   谁执行当前发现规则:
no proxy - zabbix server
<proxy name> - 指定的proxy

 IP range

发现规则中的ip范围,格式如下
单IP: 192.168.1.33
一个IP段: 192.168.1.1-255
一个子网: 192.168.4.0/24
支持如下子网掩码:
IPV4:/16 - /30
IPV6:/112 - /128
IP列表: 192.168.1.1-255,192.168.2.1-100,192.168.2.200,192.168.4.0/24
备注:1. IP列表中的IP不能重复2. 不同的发现规则里面不要包含相同的IP,否则可能会出现意想不到的问题

 Delay (in sec)

规则执行完毕之后,要多久才执行下一次。

 Checks

支持的checks: SSH, LDAP, SMTP, FTP, HTTP, HTTPS, POP, NNTP, IMAP, TCP, Telnet, Zabbix agent, SNMPv1 agent, SNMPv2 agent, SNMPv3 agent, ICMP ping.
Port属性如下:
单个端口: 22
端口段: 22-45
端口列表: 22-45,55,60-70

 Device uniqueness criteria

 设备唯一标识:
IP address - 使用IP地址作为设备唯一性标识
Type of discovery check - 使用SNMP 或者Zabbix agent的check作为唯一标识

Enabled

是否启用当前规则

 

第二步

Monitorning>>Discovery,可以看到已经发现了两台主机,ip地址作为他们的唯一标识。确保这个标识的唯一性,否则zabbix会认为他们是一台主机。

 

第三步

目前仅仅是可以找到主机,并未自动添加到Host中,接下来完成几个步骤:

1. 加入到Linux Servers组

2.Linux link linux模板、windows link windows模板

3. 主机在线时长10分钟的主机添加到HOST中

4. 离线1天以上的主机从Host中移除

创建Action

我们需要创建两个Action,一份正对windows,一份针对Linux。我们下面演示一下Linux服务器

Action添加主机

configuration>>action>>Event source(选discover)>>create action

首先,配置名称,以及定义消息内容,这些使用默认的即可

Action

 

条件配置

 

操作

 

回到HOST中,我们可以发现已经把主机加到列表里了,并且也Linux了模板以及加到了相应的组里

 

移除主机

configuration>>action>>Event source(选discover)>>create action

首先,配置名称,以及定义消息内容,这些使用默认的即可

移除主机

action

 

条件

 

动作

 

移除主机我就不演示了。

通过使用discovery,zabbix能够自动完成添加到host等等一系列动作,这一切都是基于这个规则来实现的。那么如果离开这个规则,我能完成这一系列动作吗?答案是肯定的,请关注下一篇文章《Active agent自动注册》

 

 

3 自动注册

1. 概述

上一篇内容《zabbix自动发现配置》,大概内容是zabbix server去扫描一个网段,把在线的主机添加到Host列表中(如果是使用zabbix agent去检测,适用于被动模式)。我们本篇内容与上篇相反,这次是Active agent主动联系zabbix server,最后由zabbix server将这些agent加到host里。对于需要部署特别多服务器的人来说,这功能相当给力。所有服务器批量装好zabbix agent,server配置好trigger,所有的服务器都配置好了,非常快速。

2. 配置

2.1配置文件修改

指定server ip

1

2

# cat /usr/local/zabbix-2.2.2/etc/zabbix_agentd.conf | grep -E ^ServerActive

 ServerActive=66.175.222.232

修改Hostname

1

2

# cat /usr/local/zabbix-2.2.1/etc/zabbix_agentd.conf | grep -E ^Hostname                           

Hostname=auto-reg-for-ttlsa-01

关于主机名:如果zabbix_agentd.conf配置有定义Hostname,那么zabbix会使用这个Hostname命名,否则agent的主机名(hostname得来的)

修改metadataitem

1

2

cat /usr/local/zabbix-2.2.1/etc/zabbix_agentd.conf | grep HostMetadataItem=

 HostMetadataItem=system.uname

 

2.2 配置action

步骤:configuration>>action>>Event source(选择Auto registration)>>Create Action,我们按如下步骤来定义个action

2.2.1 action选项卡

 

定义Action名称,以及发送消息的主题和内容,使用默认的就行了

2.2.2 Conditions选项卡

 

Host metadata包含Linux字符的主机将会触发 2.2.3的操作,什么是metadata,文章的下半段会专门讲解。

2.2.3 operations选项卡

 

满足条件的active host发起请求,server会完成三个动作:

把agent加到host列表

把agent加入linux servers组

agent主机link模板Template OS linux

3. 查看结果

查看/tmp/zabbix_server.log我们能看到如下内容:

1

 16585:20150203:161110.910 enabling Zabbix agent checks on host "auto-reg-for-ttlsa-01": host became available

看到如上内容,表明host增加成功,此时此刻的host列表如下:

 

4. HostMetadataItem与HostMetadata

作用:用于标示主机,通过该符号能够把主机区别开来。比如我们经常用它来区分linux与windows系统,这样才能分别给他们设置组与template等等

4.1 HostMetadataItem用法

1

HostMetadataItem=system.uname

它的值来之key

4.2 HostMetadata用法

1

HostMetadata: Linux hehehehehehehehe xxxxx

他的值是直接定义的

通过使用各式各样的metadata我们可以用于区分各个主机,来达到我们各种需求。

4 zabbix low-level discover zabbix批量部署必备

1. 概述

本篇文章是zabbix发现的最后一篇,回顾一下前面几篇文章

zabbix发现介绍》整个功能的介绍

zabbix发现配置》server通过配置好的规则,自动添加host、group、template

zabbix Active agent自动注册》与discovery相反,功能基本相同,active联系server,server自动添加host、group、template

以上目的都是发现host、添加host,本文的low-level discovery更底层点,用于发现item、trigger、graph等等。我们最常用如:filesystem(如/、/home、/proc、C:、D:等),network(eth0,eth1等)

 

2. Discovery之文件系统

众多服务器,难免系统以及分区会有所不同。一般存在linuxwindows两种系统,linux下分区有/、/data、/proc等等,windows有C:D:E:等,A服务器有/data分区,B服务器可能有/site分区。他有什么分区,我便监控什么分区,这就是low-level discovery的功能。

2.1 创建模板

创建模板A_Template_For_Discovery,.....过程省略....

 

2.2 配置discovery规则

configuration>>templates>>找到模板“A_Template_For_Discovery”>>Discovery(0)>>Create discovery rule

 

属性说明:

Keep lost resources period(in days):数据保留天数,默认30天

Fileter:Macro为{#FSNAME},key “vfs.fs.discovery”返回json数据列表,里面内容为{#FSNAME}作为key,/、/data、C:等等作为value。regext可以使用表达式,例如"^/data|/C:",如果想通过{#FSTYPE}来过滤,那么Macro写{#FSTYPE},regexp写^(ext2|ext3|swap)$,或者引入zabbix中定义好的的正则表达式,@表达式名称。关于《zabbix正则表达式》请继续关注ttlsa。

 

2.3 创建Item prototypes

其实就是一个创建一个item,configuration>>templates>>找到模板“A_Template_For_Discovery”>>Discovery(1)>>find file system>>Item prototypes (0)>>create Item prototypes

 

 

 

 

2.4 创建Trigger

当剩余量小于20%触发warnning

configuration>>templates>>找到模板“A_Template_For_Discovery”>>Discovery(1)>>find file system>>Trigger prototypes (0)>>Create trigger prototypes

 

与普通的trigger区别在{#FSNAME}

2.4 创建graph

绘制简单图表

configuration>>templates>>找到模板“A_Template_For_Discovery”>>Discovery(1)>>find file system>>Graph prototypes (0)>>Create Graph prototypes

 

3. 自定义LLD规则

系统已经内建了文件系统的{#FSNAME},网络的{#IFNAME},因为业务的特殊性,我们如何定义我们自己需要的名称呢?

编写脚本,脚本输出json数据,包含key和value

脚本加入zabbix_agentd.conf UserParameter

重启zabbix_agentd

使用定义好的名称配置low-level discovery

3.1 脚本范例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#!/usr/bin/perl

 

$first = 1;

print "{\n";

print "\t\"data\":[\n\n";

 

for (`cat /proc/mounts`)

{

    ($fsname, $fstype) = m/\S+ (\S+) (\S+)/;

    $fsname =~ s!/!\\/!g;

 

    print "\t,\n" if not $first;

    $first = 0;

 

    print "\t{\n";

    print "\t\t\"{#FSNAME}\":\"$fsname\",\n";

    print "\t\t\"{#FSTYPE}\":\"$fstype\"\n";

    print "\t}\n";

}

 

print "\n\t]\n";

print "}\n";

3.2 结果范例

执行后得到如下数据,是json格式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

{

        "data":[

 

        {

                "{#FSNAME}":"\/",

                "{#FSTYPE}":"rootfs"

        }

        ,

        {

                "{#FSNAME}":"\/proc",

                "{#FSTYPE}":"proc"

        }

        ,

        {

                "{#FSNAME}":"\/sys",

                "{#FSTYPE}":"sysfs"

        }

        ,

        {

                "{#FSNAME}":"\/dev",

                "{#FSTYPE}":"devtmpfs"

        }

        ,

        {

                "{#FSNAME}":"\/dev\/pts",

                "{#FSTYPE}":"devpts"

        }

        ,

        {

                "{#FSNAME}":"\/dev\/shm",

                "{#FSTYPE}":"tmpfs"

        }

        ,

        {

                "{#FSNAME}":"\/",

                "{#FSTYPE}":"ext4"

        }

        ,

        {

                "{#FSNAME}":"\/proc\/bus\/usb",

                "{#FSTYPE}":"usbfs"

        }

        ,

        {

                "{#FSNAME}":"\/proc\/xen",

                "{#FSTYPE}":"xenfs"

        }

        ,

        {

                "{#FSNAME}":"\/proc\/sys\/fs\/binfmt_misc",

                "{#FSTYPE}":"binfmt_misc"

        }

        ]

}

 

更多参考

http://blog.51cto.com/dyc2005/2178939

https://www.zabbix.com/documentation/3.4/zh/manual/discovery/low_level_discovery

 

5 zabbix自定义自动发现服务(low-level-discovery)监控系统服务

1 ) 概述

由于工作关系很久没有更新博客了,本文基于生产配置,是zabbix系列的另一补充;本次要讲的是zabbix Low-level discovery简称(LLD),我们在配置items(监控项)时,有时需要对类似的Items进行添加,换句话说,多台机器上的某一监控具有类似的items,如系统开放的服务,再如磁盘分区,网卡名称等,后两种zabbix已经自带,今天我们以自定义监控每个系统开放的服务来说明 LLD的使用逻辑;
和普通items获取不同的是,LLD 脚本在获取返回时,格式必须是json形式;
和自动发现不同的是,自动发现通过网络发现设备;而LLD是针对主机或模板中用来自动发现定义的items和添加触发器和图形的;
本次测试操作基于zabbix3.4.4 本文中的相关脚本和模板下载

2 )  LLD脚本

1、获取开放的服务
任何获取items都要基于程序脚本,LLD发现也不例外,以下是获取系统开放服务脚本discovery_services.sh

# cat /usr/local/zabbix-3.4.4/scripts/discovery_services.sh

 

#!/bin/bash

proarray=($(find /var/run/ -name "*.pid"  2> /dev/null||egrep -v '(rpc|php_daemon|haldaemon|irqbalance|console-kit-daemon)' |awk -F'/' '{print $NF}'|awk -F'.' '{print $1}'))    # 排除不监控的服务

 

length=${#proarray[@]}

printf "{\n"

printf  '\t'"\"data\":["

printf "\t"

printf '\n\t\t{'

printf "\"{#PRO_NAME}\":\"iptables\"}"       #必须要添加的iptables

printf  ","

for ((i=0;i<$length;i++))

do

        printf '\n\t\t{'

        printf "\"{#PRO_NAME}\":\"${proarray[$i]}\"}"

        if [ $i -lt $[$length-1] ];then

                printf ','

        fi

done

printf  "\n\t]\n"

printf "}\n"

说明:以上脚本基于 /var/run下的pid进行监控开放的服务,所以如果是公司运维人员自已经开发的管理脚本服务,pid文件请按默认的放到/var/run下 ,这样就不会漏掉,再说大部分系统或知名程序都遵守这一规定,你为什么不能遵守呢?
在一台监控机器上执行如下:

记住这里的{#PRO_NAME} 这个就是自动发现规则中的宏变量;另外这个脚本返回的是json格式;

2、检查系统状态
对获取的服务进行检查

# cat /usr/local/zabbix-3.4.4/scripts/program_status.sh

 

#!/bin/bash

procjetName="${1:-NULL}"

LOCK_PATH="/var/lock/subsys"     

RUN_PATH="/var/run"

ret_ok=1

ret_critical=3

ret_unknown=4

 

if  [[ ${procjetName} == "NULL" ]] ; then

        echo ${ret_unknown}

fi

 

if [ -f "${LOCK_PATH}/${procjetName}" ] || [ -f "${RUN_PATH}/${procjetName}.pid" ]  || [ -f "${RUN_PATH}/${procjetName}/${procjetName}.pid" ] ; then

        echo ${ret_ok}

else

        echo ${ret_critical}

fi

以上脚本检查如果服务存在则返回1 否则返回 3 ,如果服务不存在则返回4 
检查的原则就是在/var/run/下是否有和服务同名的pid文件存在,或/var/run/服务/服务.pid存在,对于像iptabls这种则检查 /var/run/subsys/服务.pid 三种情况满足一种即可;
运行效果如下:

对iptables服务检查 返回 1说明 iptables正常
关闭iptables 再次进行检查:

而对httpd服务进行检查,由于本机根本没有httpd服务,所以返回的是3

3、定义items

# cat /usr/local/zabbix-3.4.4/etc/zabbix_agentd.conf.d/LLD_Services.conf

UserParameter=services.scan,/bin/bash /usr/local/zabbix-3.4.4/scripts/discovery_services.sh

UserParameter=services.status[*],/bin/bash /usr/local/zabbix-3.4.4/scripts/program_status.sh $1

3) 添加模板和自动发现规则

这里需要在web页上添加,和添加items很类似;
1、创建模板
进入web端;单击 配置--模板--配置模板--创建模板-- 这里模板名叫 “Ickey Services status” --创建应用集("Services_status") 如图:

2、创建自动发现规则(LLD)
如上图点自动发现规则在模板中创建 自动发现规则 -- 创建自动发现规则 如图:

这里需要注意的是 键值: servies.scan 即item 是在2.3小节的配置文件中定义的,不可乱写

再配置上图中的过滤器 配置变量(宏)如图:

此处的{#PRO_NAME}就是上面2.1节中脚本返回的变量; -- 保存

3、创建 配置 监控项原型 
如图:

填写名称,等相关信息如图:

此处需要注意的$1 和键值 是 2.3 定义items中的$1 也即是服务名; 保存;

4、创建触发器类型
如图:


说明:触发器名称:即是 “服务名” is down 
表达式的意思就是 当发现某服务返回的值不是 1时发出警告
保存 这个 模板中的自动发现规则 就完成啦
但是这里存在一个问题,当我们机器上yum工具时,会在/var/run下生成yum.pid这样就会侦测到一个新服务,yum,但yum执行完后yum.pid会被删除,此时触发器就会报yum is down,为了解决这类问题,我们可以修改触发器报警策略,修改成如下:

意思就是,最后状态不是1 同时一小时前的状态是1;这样那此在/var/run生成临时pid的程序就不会被触发;

接下来就是在主机上应用模板,可以批量添加;这里就忽略了;
5、测试
看下效果图:


可以看到此主机应用了模板后已经可以拿到监控项数据了,我们来关闭这台主机的防火墙服务试试,看看触发器是否正常;
如图:

再把iptables服务启动

可以看到服务关闭和启动可以报警与恢复;至此自动发现服务已经可以正常使用啦!通过这个实例,希望大家能理解自动发现规则的原理逻辑!本文基于生产故有些截图带有涂;主要用于备忘与分享,如有错误之处欢迎留言!

 

 

6 解决现实中文乱码:

中文显示乱码 --> Windows 系统获取字体 --> 上传到zabbix服务器 --> 替换字体 --> 问题解决

 

windows --> 控制面板 --> 字体 --> simkai.ttf (这个字体看着顺眼一些)-->上传到zabbix_server 中

cd /usr/share/fonts/dejavu; mv DejaVuSans.ttf DejaVuSans.ttf.bak  # 这个字体是zabbix正在使用的字体

cp /root/ simkai.ttf /usr/share/fonts/dejavu/DejaVuSans.ttf

 

 

7 zabbix_agent playbook 批量安装

使用playbook线上环境

 

上一篇:[技术干货] zabbix_agent信号量报错处理方法


下一篇:ldap集成grafana