Quantcast
Viewing all articles
Browse latest Browse all 3

zabbix 与 salt 的一次简单结合

静思学吧 - 关注Graphite,Puppet,saltstack, Zabbix

概述

  • zabbix 是一个监控工具,可以实现监控和报警功能。
  • salt 是一个配置管理工具,可以实现批量部署的自动化运维。

目标

我们有多台服务器,每个服务器绑定了一些IP(以一个C网段为单位,每个服务器可能会绑定多个C网段的所有IP),服务器的一个应用程序会绑定相应的IP去连接某些smtp服务器,如qq smtp服务器(smtp.qq.com:25)。

我们需要达成的目标和要求包括:

  1. 监控服务器绑定的网段中的IP是否能连接到指定的SMTP服务器,如QQ SMTP服务器
  2. 假如连续三次连接都不成功,则向管理人员发出报警
  3. 在加入新服务器时能够自动加入监控系统和自动添加监控项
  4. 在所有机器上部署这个监控

假如我们全部用手动方式去实现的话,假设我们的监控和报警脚本是smtptest.sh,那么我们需要在每个服务器上部署这个脚本,手动找出绑定的IP,然后使用不同的参数来运行,如果:

  1. 脚本的内容需要调整
  2. IP进行了调整,如增加或删除了IP
  3. 需要指定不同的smtp服务器

都需要做一大堆的工作。

但是zabbix和salt可以让所有这些工作都变成一次性的工作。

前提

在本文中我做了以下假设:

  • 假设已安装好了zabbix系统和salt系统

注意事项

  • 在本文中有多处涉及到修改zabbix配置文件的地方,在修改了配置文件必须重启zabbix相应的服务才能生效。
  • 在防火墙开放 zabbix agent 的 10050和 zabbix server 和 10051 端口。

实现步骤

一、zabbix 监控

1. 自动发现IP网段

首先我们要用zabbix实现自动发现IP功能,使用 zabbix 的 low level discovery (低级别发现)来做这个事情。

在这里我们自定义了一个发现规则,这个发现规则会创建一个数据项,使用UserParameter 来创建这个数据项,完整定义如下:

UserParameter=network.deliver.discovery, /usr/bin/delivernetwork
  • 数据项名: network.deliver.discovery
  • 数据获取程序:/usr/bin/delivernetwork,在这里我们略过delivernetwork的实现。我们只需要知道这个程序会获取服务器绑定的IP网段,并以指定格式(JSON格式)输出。

注意这个数据项的内容必须是JSON格式。比如我们其中一个服务器的数据(/usr/bin/delivernetwork 程序执行结果)如下:

{
    "data":[
        {
            "{#NETWORK}":"211.159.64",
            "{#NETWORKHEXCODE}":"D39F40"},
        ]
}

数据内容里面包括两个Macro(宏):

  • {#NETWORK}
  • {#NETWORKHEXCODE}

数据内容表明该服务器绑定了211.159.64.0 网段。

测试方法

在 zabbix_agentd.conf 中加入上面的UserParameter后,部署好/usr/bin/delivernetwork程序,使用以下命令获取数据项的内容:

zabbix_get -s your_server -k network.deliver.discovery

获取到的内容应与直接运行/usr/bin/delivernetwork程序的结果保持一致。

2. SMTP连接测试数据项

在这里我们还是自定义一个UserParameter, 完整定义如下:

# $1 host
# $2 port
# $3 network
UserParameter=smtptest[*], /usr/bin/getsmtptest $1 $2 $3

其中:

  • $1 为SMTP服务器的host
  • $2 为SMTP服务器的端口
  • $3 为网段

这里可能还有个问题,直接使用getsmtptest来测试连接的话可能需要时间比较长,而zabbix获取数据项的超时时间(Timeout)默认为3秒,因此会出现not Support 的提示。我的解决方法是用两个程序配合:

  • getsmtptest负责:
    1. 将$1, $2, $3写入到一个配置文件中
    2. 读取结果文件中的结果
  • 假设我们还有另外一个程序 smtptest,这个程序负责:
    1. 读取配置文件中的条目,并进行实际的smtp连接测试
    2. 将测试结果写入到结果文件中

其中 smtptest 放到 cron 中定期运行。这样的话就不会出现超时的问题了。

这里的测试方法与上一步的类似,不详细写了。

3. zabbix web 添加低级别发现规则

登录 zabbix 后台界面,打开 配置 – 模板,选择一个模板,然后点击该模板的 “发现” ,点击右上角的”创建发现规则”,打开后界面如下:

Image may be NSFW.
Clik here to view.

键值为 network.deliver.discovery ,即在第一步中创建的UserParameter的key,一定要填写正确。

接下来点击”项目原型”,点击右上角的”创建项目原型”,打开后界面如下:

Image may be NSFW.
Clik here to view.

接下来添加触发器,在三次连接失败的情况下触发条件来报警,点击”触发器类型”,接着点击右上角的”创建触发器原型”,打开后界面如下:

Image may be NSFW.
Clik here to view.

我们定义了如果最后三次连接测试都失败的话发触发报警。

这样就可以了。

4. zabbix 添加自动注册功能

自动注册功能能够在加入新的服务器后自动加入监控系统,不用手动去做任何操作。

这里假设我们新加了一个服务器,然后在上面部署了zabbix agent,其中zabbix_agentd.conf 设置了ServerActive 和 Server指向zabbix server,注意要使用自动注册功能的话必须设置ServerActive。

接下来在zabbix web设置自动发现规则,登录后台,然后打开 配置 – 动作,在右上角的”事件源”中选择”自动注册”,接着点击右上角的”创建动作”, 打开后如下图:

Image may be NSFW.
Clik here to view.

选择”条件”,填入相应的值:

Image may be NSFW.
Clik here to view.

选择”操作”,填入相应的动作:

Image may be NSFW.
Clik here to view.

设置好后点击保存就可以了。

使用上面的4个步骤,我们就可以实现:

  1. 自动发现IP网段,且这种发现是动态的,因此增加和删除都会在zabbix中自动进行处理。
  2. 自动发出告警
  3. 自动添加新服务器

但最后一个需求还没实现,我们使用salt来做这个事情。

二、salt 部署

salt 的sls我已经写出来了,如下:

include:
    - zabbix.agent

/usr/bin/smtptest:
    file.managed:
        - mode: 755
        - source: salt://zabbix/agent/smtptest/files/smtptest

/usr/bin/getsmtptest:
    file.managed:
        - mode: 755
        - source: salt://zabbix/agent/smtptest/files/getsmtptest

/usr/bin/delivernetwork:
    file.managed:
        - mode: 755
        - source: salt://zabbix/agent/smtptest/files/delivernetwork

/etc/deliversmtptest:
    file.directory:
        - user: zabbix
        - group: zabbix
        - makedirs: True
        - recurse:
            - user
            - group

run_smtptest:
    cron.present:
        - name: /usr/bin/smtptest
        - minute: '*/3'

/etc/zabbix/zabbix_agentd.d/smtptest.conf:
    file.managed:
        - source: salt://zabbix/agent/smtptest/files/smtptest.conf
        - watch_in:
            - service: zabbix-agent

我将/usr/bin/getsmtptest 和/usr/bin/smtptest要输出的文件放在 /etc/deliversmtptest目录下,因此将这个目录的用户和组设置为zabbix运行的用户和组zabbix。

其中目录结构如下:

ls -R /srv/salt/zabbix/agent/smtptest/
/srv/salt/zabbix/agent/smtptest/:
files  init.sls

/srv/salt/zabbix/agent/smtptest/files:
delivernetwork  getsmtptest  smtptest  smtptest.conf

这里我包含了zabbix.agent这个sls,zabbix.agent 这个sls内容如下:

include:
    - zabbix

zabbix-agent:
    pkg:
        - installed
        - require:
            - pkg: zabbix
    service:
        - running
        - enable: True
        - require: 
            - pkg: zabbix-agent
        - watch:
            - file: /etc/zabbix/zabbix_agentd.conf
            - file: /etc/zabbix/zabbix_agentd.d

/etc/zabbix/zabbix_agentd.conf:
    file.managed:
        - source: salt://zabbix/agent/files/zabbix_agentd.conf
        - user: root
        - group: root
        - mode: 644
        - template: jinja
        - require: 
            - pkg: zabbix-agent

/etc/zabbix/zabbix_agentd.d:
    file.recurse:
        - source: salt://zabbix/agent/files/zabbix_agentd.d
        - user: root
        - group: root
        - dir_mode: 755
        - file_mode: 644
        - template: jinja
        - makedirs: True
        - recurse:
            - user
            - group
            - mode
        - require: 
            - pkg: zabbix-agent

其中 zabbix 这个sls内容如下:

zabbix-release:
    pkg.installed:
        - sources:
        {% if grains['os_family'] == 'RedHat' %}
            {% if '5.' in grains['osrelease'] and %}
            - zabbix-release: http://repo.zabbix.com/zabbix/2.0/rhel/5/x86_64/zabbix-release-2.0-1.el5.noarch.rpm
            {% elif '6. ' grains['osrelease'] and grains['os_family'] == 'RedHat' %}
            - zabbix-release: http://repo.zabbix.com/zabbix/2.0/rhel/6/x86_64/zabbix-release-2.0-1.el6.noarch.rpm
            {% endif %}
        {% endif %}

zabbix:
    pkg.installed:
        - require:
            - pkg: zabbix-release
            - user: zabbix
            - group: zabbix
    group.present:
        - system: True
    user.present:
        - system: True
        - groups:
            - zabbix
        - home: /var/lib/zabbix
        - shell: /sbin/nologin
        - require:
            - group: zabbix

OK,到这里就有所有步骤都做完了!

参考资料

静思学吧 - 关注Graphite,Puppet,saltstack, Zabbix


Viewing all articles
Browse latest Browse all 3

Trending Articles