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

相關文章
相關標籤/搜索