zabbix 中快速建立同组多主机同一item 的graph的方法

    接到一个需求,说想批量查看机器的运行状况,在zabbix中使用guest登陆时查看多个主机的运行数据时须要不停的切换,Screen 的方法已经有了(Screen 的方法是将每一个item的graph放到一个屏幕上),可是看起来不够明晰;最好是将各机器的同一item放到同一个graph里。前端

    好比一个Nginx的组里有10台机器,将这10台机器的内存使用率放到一个graph里,方便在测试时查看。python

    在zabbix的前端要建立此类的graph只能经过手工一个一个的加,不能建立此类的templates。网上查找,有批量建立Screen的针对API的python脚本,可是因为还没有接触过zabbix的API,因此就没使用。想一想是否能够经过操做zabbix的数据库来作到呢,因而研究一番,有了这个bash脚本。mysql

#!/bin/bash
# date: 2015/11/12 10:00
export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/apache/bin:/root/bin

CMD="mysql -uroot zabbix_2 -Bse"
CMD2="mysql -uroot zabbix_2 -e"
color=`openssl rand -base64 6 |md5sum |cut -c1-6 |tr [a-f] [A-F]`
# 获取zabbix内组ID
gid=`$CMD "SELECT groupid FROM groups WHERE name=\"$1\""`

# 判断参数及组名是否正确
if [ $# -ne 2 ];then
    echo -e "\e[031mplease input \"zabbix_group_name\" and \"key_name\"\e[0m"
    exit 3
fi
if [ -z $gid ];then
    echo -e "\e[031mzabbix_group_name is error\e[0m"
    exit 4
fi

# 组ID之下的HOST-id
hid=`$CMD "SELECT hostid FROM hosts_groups WHERE groupid=${gid};"`
hid_last=`$CMD "SELECT hostid FROM hosts_groups WHERE groupid=${gid};" | head -1`

# itemid,用来检查第二个参数key是否有效
testitem=`$CMD "SELECT itemid FROM items WHERE key_=\"$2\" AND hostid=${hid_last}"`
# 获取最后一个graph的ID,insert时需使用这个数字加1
grapid=`$CMD "SELECT graphid FROM graphs" | tail -1`

# 获取最后一个gitemid, 每一个gitemid对应一个itemid, 多个gitemid对应一个graphid,gitemid每insert一次得加一
gitemid=`$CMD "SELECT gitemid FROM graphs_items" |tail -1`

# insert graphs 表中一个graph记录
in_graphs() {
    new_graph_id=$((grapid+1))
      # 记录下这次运行产生的graphid
    echo "这次产生的graphid为:$new_graph_id" >> $0.out 
    name="$1-$2"
    $CMD2 "INSERT INTO graphs VALUES ($new_graph_id,'$name',900,200,0.0000,100.0000,NULL,1,1,0,1,0,0.0000,0.0000,0,0,NULL,NULL,0);"
}
# insert graphs_items 表中多个graphs_item记录的指向
in_graphs_items() {
    $CMD2  "INSERT INTO graphs_items VALUES ($gitemid,$new_graph_id,$itemid,0,0,'$color',0,2,0)"
}

# 获取指定组下的每一个host的指定的item,好比vm.memory.size[total]这个key
if [ -z $testitem ];then
    echo -e "\e[031mkey_name is error\e[0m"
    exit 5
else
    in_graphs "$1" "$2"
    for i in $hid;do
        let gitemid++
        color=`openssl rand -base64 6 |md5sum |cut -c1-6 |tr [a-f] [A-F]`
        itemid=`$CMD "SELECT itemid FROM items WHERE key_=\"$2\" AND hostid=${i}"`
        in_graphs_items
    done
    echo -e "\e[032mcreate graph done\e[0m;"
fi

    此脚本因是与数据库交互的因此本人使用时建立了~/.my.cnf,在里面输入了[client]
password = 123456。需使用两个参数“group_name”和“key_name”,参数须要使用“”引发来。若是成功的提示,便可在前端查看是否有graph生成了。生成的名字是"gruop_name+key_name".git

    这里有个问题须要提醒一下,也是我第一次知道。sql

1, 在graphs 表里 graphid 的数字指向了 graphs_items 中的多个 gitemid 号;

       表          项                 表        项            表    项
    graphs:grapid    graphs_items:gitemid   items:itemid


        564:                            1871    :         23733
                                          1872    :         23317

2,graphs_items 中的 itemid 又指向了 items 中的 itemid。itemid与hostid是有联系的,而hostid又是经过groupid获取到同组之下的hostid的
数据库

    这是建立graph的相关关系。在前端建立好此类graph时,若是直接delete删除,那么只是在graphs表中将这个graphid删除了,而不删除在graphs_items中指向graphid的行。 而下次你再建立相似graphs时,graphs表会使用新的ID号,而不会接着graphs表中的ID号来,因此总是在前端建立此类graphs并删除时,会在graphs_items表时产生许多垃圾数据.apache

    可是此脚本,是直接针对数据库的,不会略过graphs中的使用过的ID号,因此删除后再建立这个graphs时会发如今graph里每一个item都是双份的。 此中细节不得了解事后才能理解。api

    若有问题,欢迎指正,谢谢。
bash

相关文章
相关标签/搜索