初试Zabbix监控方案

因工作需要搜了一些监控解决方案,发现zabbix还是挺多人推荐的,于是乎记录一下学习过程。本篇主要是搭建好zabbix环境,然后使用agent采集主机数据、使用SNMP v3接入c2960采集数据。


0.环境

  • ubuntu 18.04
  • docker-ce 19.03.1
  • docker-compose 1.24.1
  • zabbix server 4.2.5
  • zabbix agent 1:4.2.5-1+bionic

1.安装zabbix

1.1.docker-compose编排容器

  • 创建docker-compose.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    version: '3.5'

    x-logging: # 日志配置的模板
    &logging-setting-template
    logging:
    driver: 'json-file' # 将容器内的stdout、stderr输出记录为json格式文件
    options:
    max-size: '30m' # 单个日志文件大小
    max-file: '1' # 最大日志文件数量
    tag: '{{.Name}}' # 日志记录加上容器名称信息,如使用ELK收集分析日志能方便识别日志类源

    networks: # 定义网络,供services使用
    monitor-app: # 名称随意
    driver: 'bridge'

    volumes: # 定义数据卷,供services使用
    mysql-data: # 名称随意

    services: # 定义服务
    mysql: # mysql数据库
    container_name: 'mysql' # >>指定容器名称,否则默认"{{yaml所在文件夹名}}_{{服务名称}}_1",PS:在根目录文件夹名为"default"
    image: 'mysql'
    volumes:
    - '/data/mysql:/var/lib/mysql' # 使用数据卷保存容器数据,PS:此处用mysql-data数据卷zabbix会初始化会失败,原因不明
    command: '--default-authentication-plugin=mysql_native_password'
    restart: 'always'
    environment:
    MYSQL_ROOT_PASSWORD: 'password' # root用户密码
    networks:
    - 'monitor-app'
    <<: *logging-setting-template

    adminer: # mysql的web管理客户端
    container_name: 'adminer'
    image: 'adminer'
    volumes:
    - '/etc/localtime:/etc/localtime:ro' # 同步容器时间
    restart: 'always'
    networks:
    - 'monitor-app'
    ports:
    - '8080:8080'
    <<: *logging-setting-template

    zabbix-server: # zabbix的后端
    container_name: 'zabbix-server'
    image: 'zabbix/zabbix-server-mysql'
    restart: 'always'
    volumes:
    - '/data/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro' # 监控脚本目录
    - '/data/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro' # 告警脚本目录
    depends_on:
    - 'mysql' # 在mysql服务后启动,填服务名
    environment:
    DB_SERVER_HOST: 'mysql' # >>与mysql服务的容器名对应
    MYSQL_USER: 'zabbix' # >>数据库用户名称,与创建的对应
    MYSQL_PASSWORD: 'zabbix' # >>数据库用户密码,与创建的对应
    MYSQL_DATABASE: 'zabbix' # >>数据库名称,与用户的权限对应
    # ZBX_CACHESIZE: '512M' # 一些缓存参数,具体含义自行了解
    # ZBX_HISTORYCACHESIZE: '1024M'
    # ZBX_HISTORYINDEXCACHESIZE: '256M'
    # ZBX_TRENDCACHESIZE: '256M'
    # ZBX_VALUECACHESIZE: '512M'
    # ZBX_STARTVMWARECOLLECTORS: 2
    # ZBX_VMWAREFREQUENCY: 60 # 带VMWARE是采集ESXI或vCenter的相关参数,具体含义自行了解
    # ZBX_VMWAREPERFFREQUENCY: 60
    # ZBX_VMWARECACHESIZE: '80M'
    # ZBX_VMWARETIMEOUT: 10
    PYTHONUNBUFFERED: 0
    networks:
    - 'monitor-app'
    # ports:
    # - '10051:10051'
    <<: *logging-setting-template

    zabbix-web: # zabbix的前端
    container_name: 'zabbix-web'
    image: 'zabbix/zabbix-web-nginx-mysql'
    volumes:
    - '/data/zabbix/fonts:/usr/share/zabbix/assets/fonts:ro' # 复制字体文件到/data/zabbix/fonts/DejaVuSans.ttf,解决中文乱码问题
    restart: 'always'
    depends_on:
    - 'mysql'
    - 'zabbix-server'
    environment:
    DB_SERVER_HOST: 'mysql' # >>与mysql服务的容器名对应
    MYSQL_USER: 'zabbix' # >>数据库用户名称,与创建的对应
    MYSQL_PASSWORD: 'zabbix' # >>数据库用户密码,与创建的对应
    MYSQL_DATABASE: 'zabbix' # >>数据库名称,与用户的权限对应
    ZBX_SERVER_HOST: 'zabbix-server' # >>与zabbix-server服务的容器名对应
    PHP_TZ: 'Asia/Shanghai'
    networks:
    - 'monitor-app'
    ports:
    - '80:80'
    - '433:433'
    <<: *logging-setting-template

INFO:使用zabbix需要两个镜像,zabbix-server负责采集数据,zabbix-web负责管理、配置。
INFO:建议新建一个特定的目录放置yaml文件,以项目名命名目录。

  • 启动容器
    1
    2
    3
    # 假设文件位于/home/docker/monitor/docker-compose.yaml
    cd /home/docker/monitor/
    docker-compose up -d

WARN:首次初始化zabbix是启动不起来的,因为还没有数据库的相关权限。
INFO:如配置文件名不为docker-compose.yaml,可以使用-f参数指定。

1.2.mysql配置

  • http://宿主机ip:8080,登录adminer
  • 创建用户
    1
    2
    3
    create user 'zabbix'@'%' identified by 'zabbix';
    grant all privileges on zabbix.* to 'zabbix'@'%';
    flush privileges;

INFO:此步骤可以跳过创建zabbix数据库,只授权即可,后续zabbix-server初始化会自行创建数据库以及建表。

  • 更改root密码(根据需要)
    1
    2
    alter user 'root'@'localhost' identified by 'newpassword';
    alter user 'root'@'%' identified by 'newpassword';

1.3.zabbix配置

  • 重启zabbix服务

    1
    2
    docker-compose restart zabbix-server
    docker-compose restart zabbix-web
  • 访问http://宿主机ip,登录。默认用户密码为Admin:zabbix

  • 更改中文、修改密码

    2.zabbix采集数据

    zabbix支持四大类接口采集数据:agent代理程序的接口、SNMP接口、JMX接口、IPMI接口,目前暂时只接触过前两种接入方式,接下来以实例简单介绍。

2.1.通过agent监控Linux/Win主机

  • 安装agent,详见官方教程

    1
    2
    3
    4
    5
    6
    # 添加源
    wget https://repo.zabbix.com/zabbix/4.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.2-2+bionic_all.deb
    dpkg -i zabbix-release_4.2-2+bionic_all.deb
    apt update
    # 安装
    apt install zabbix-agent
  • 配置agent,agent有两种工作模式:主动模式和被动模式,主动模式是agent主动联系server上报数据,被动模式则agent启用监听等待server通信再提供数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 配置文件:/etc/zabbix/zabbix_agentd.conf
    # ---被动模式设置---
    Server={{zabbix server IP}} # 被动模式的zabbix server ip
    # Hostname=zabbix server # 注释掉则默认系统主机名
    # ---被动模式设置---

    # ---主动模式设置---
    # Server=127.0.0.1 # 注释则禁用被动模式
    StartAgents=0 # 禁用被动模式需要将监听进程设为0否则启动报错
    ServerActive={{zabbix server IP}} # 主动模式的zabbix server ip
    # Hostname=zabbix server # 注释掉则默认系统主机名
    # RefreshActiveChecks=120 # 默认的上报间隔是120s,可自行设置
    # ---主动模式设置---

INFO:可以同时启动被动模式以及主动模式,一般使用被动模式,zabbix自带模板也是被动模式。

  • 启动agent

    1
    2
    3
    4
    # 启动
    service zabbix-agent start
    # 确认正常工作,PS:被动模式下会看到监听10050端口
    netstat -tulpn | grep zabbix_agent
  • 在zabbix server上创建监控主机

INFO:这里接口配置使用了DNS名称,是因为测试环境下agent和server容器是在同一个docker网络,可通过容器名通信。

  • 过一会能看到数据了

2.2.通过SNMP监控交换机

  • 交换机启用SNMPv3

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    C2960> enable
    C2960# configure terminal
    C2960(config)#ip access-list standard ACL_demo
    C2960(config-std-nacl)#permit host 128.8.39.121
    C2960(config-std-nacl)#deny any log
    C2960(config-std-nacl)#exit
    C2960(config)#
    c2960(config)#snmp-server view VIEW_demo mib-2 included
    c2960(config)#snmp-server view VIEW_demo cisco included
    c2960(config)#snmp-server view VIEW_demo snmpEngine included
    c2960(config)#snmp-server group GROUP_demo v3 priv read VIEW_demo
    c2960(config)#snmp-server user USER_demo GROUP_demo v3 auth sha PWD_auth priv aes 128 PWD_priv access ACL_demo
    (config)#exit
    C2960#copy running-config startup-config
  • 准备模板,自带的模板只有SNMPv2的,不过官方的模板库有大神做了比较好用的模板

  • 导入模板
    解压得到Template SNMPv3 AES - EN.xml,在web页面进行上传即可。

  • 导入脚本文件(模板中使用该脚本获取监控项数据)
    解压getSnmpPrivAes_EN.sh,改名为getSnmpPrivAes.sh放置到宿主机的/data/zabbix/externalscripts/目录,执行chmod 755 getSnmpPrivAes.sh添加执行权限。

INFO:docker-compose.yaml中对zabbix-server插件目录进行了映射,脚本文件放到宿主机即可使用。

  • 在zabbix server上创建监控主机
  • 过一会能看到数据了

INFO:需要定义交换机的SNMP信息。

3.快速入门理解

  • 自动发现
    zabbix里面有两种自动发现:一种是在“配置->自动发现”设置,是用于生成主机清单的;一种是在“配置->主机->主机列表中点击一台主机进详情->自动发现规则”设置,用于生成该主机的监控项。
  • 监控项
    主机的特定监控指标,可以是文字比如交换机端口1的名称,也可以是数字比如CPU占用率。
  • 应用集
    定义监控项的类别。
  • 触发器
    为监控项设置一定规则,当符合条件比如内存使用率达到90,则生成告警。
  • 图形
    将监控项可视化展示。

4.小结

  • zabbix的界面不太友好,感觉信息量特别大,熟悉花了不少时间,上手还是要耐心。
  • 自动发现规则很好用,不过涉及宏功能,还需要慢慢学习。
  • 模板是一个核心功能,可以克隆系统自带模板根据实际情况调整,只需在主机重新关联新模板,就会整体更新监控项。

参考文档