zoukankan      html  css  js  c++  java
  • 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.4172.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

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

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

    - "ZBXDx01" (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>

    Aegent返回如下响应数据

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

    supported items通信过程:

    1)  Server打开一个TCP连接

    2)  Server发送请求agent.ping

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

    4)  Server处理接收到的数据

    关闭TCP连接:

    not supported items通信过程:

    1)  Server打开一个TCP连接

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

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

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

    5) 关闭TCP连接

     

    主动检测:

    zabbix首先向ServerActive配置的IP请求获取active items,获取并提交active tiems数据值server或者proxyzabbix多久获取一次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"

     }


    备注:如果有些数据提交失败,比如hostitem被删除或者禁用,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 nameTemplate 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的信息

    网络发现由两个阶段组成:discoveryactions

    Discovery发现

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

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

    时间

    条件

    Service Up

    zabbix检测到可用的service

    Service Down

    zabbix无法检测到service

    Host Up

    某个ip上至少有一个serviceup状态

    Host Down

    所有service都无响应

    Service Discovered

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

    Service Lost

    serviceup之后又丢失了

    Host Discovered

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

    Host Lost

    一个hostup之后又丢失了

     

    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 agentsnmp请求作出响应,那么会同时创建这两种接口

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

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

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

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

    2 自动发现(具体操作)

    第一步

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

     

    如上配置,zabbix30秒会扫描10.9.7.8810.9.32.106-107。会使用keyagent.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 agentcheck作为唯一标识

    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

     

    条件

     

    动作

     

    移除主机我就不演示了。

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

     

     

    3 自动注册

    1. 概述

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

    作用:用于标示主机,通过该符号能够把主机区别开来。比如我们经常用它来区分linuxwindows系统,这样才能分别给他们设置组与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通过配置好的规则,自动添加hostgrouptemplate

    zabbix Active agent自动注册》与discovery相反,功能基本相同,active联系serverserver自动添加hostgrouptemplate

    以上目的都是发现host、添加host,本文的low-level discovery更底层点,用于发现itemtriggergraph等等。我们最常用如:filesystem(如//home/procC:D:等),networketh0eth1等)

     

    2. Discovery之文件系统

    众多服务器,难免系统以及分区会有所不同。一般存在linuxwindows两种系统,linux下分区有//data/proc等等,windowsC: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 periodin days):数据保留天数,默认30

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

     

    2.3 创建Item prototypes

    其实就是一个创建一个itemconfiguration>>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数据,包含keyvalue

    脚本加入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 "{ ";

    print " "data":[ ";

    for (`cat /proc/mounts`)

    {

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

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

        print " , " if not $first;

        $first = 0;

        print " { ";

        print " "{#FSNAME}":"$fsname", ";

        print " "{#FSTYPE}":"$fstype" ";

        print " } ";

    }

    print " ] ";

    print "} ";

    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 "{ "

    printf  ' '""data":["

    printf " "

    printf ' {'

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

    printf  ","

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

    do

            printf ' {'

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

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

                    printf ','

            fi

    done

    printf  " ] "

    printf "} "

    说明:以上脚本基于 /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 ,如果服务不存在则返回
    检查的原则就是在/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线上环境

  • 相关阅读:
    一轮项目冲刺9
    一轮项目冲刺8
    一轮项目冲刺7
    一轮项目冲刺6
    一轮项目冲刺5
    一轮项目冲刺4
    一轮项目冲刺3
    一轮项目冲刺2
    一轮项目冲刺1
    移山小分队---每日记录01
  • 原文地址:https://www.cnblogs.com/wanstack/p/10536520.html
Copyright © 2011-2022 走看看