您的位置:首页 > 其它

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

2015-11-12 11:31 441 查看
接到一个需求,说想批量查看机器的运行情况,在zabbix中使用guest登录时查看多个主机的运行数据时需要不停的切换,Screen 的方法已经有了(Screen 的方法是将每个item的graph放到一个屏幕上),但是看起来不够明晰;最好是将各机器的同一item放到同一个graph里。
比如一个Nginx的组里有10台机器,将这10台机器的内存使用率放到一个graph里,方便在测试时查看。
在zabbix的前端要创建此类的graph只能通过手工一个一个的加,不能创建此类的templates。网上查找,有批量创建Screen的针对API的python脚本,但是由于尚未接触过zabbix的API,所以就没使用。想想是否可以通过操作zabbix的数据库来做到呢,于是研究一番,有了这个bash脚本。
#!/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".
这里有个问题需要提醒一下,也是我第一次知道。
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表时产生许多垃圾数据.
但是此脚本,是直接针对数据库的,不会略过graphs中的使用过的ID号,所以删除后再创建这个graphs时会发现在graph里每个item都是双份的。 此中细节不得了解过后才能理解。
如有问题,欢迎指正,谢谢。

本文出自 “海风久远” 博客,请务必保留此出处http://beyondhf.blog.51cto.com/8953234/1712082
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: