接到一個需求,說想批量查看機器的運行狀況,在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