需求:對所有雲主機添加公網帶寬監控,但不是每一台主機都有公網IP,有公網IP的主機的帶寬也不完全相同,比如有的是1M,有的是5M,帶寬監控的門檻值為帶寬值*0.8*1000K。例如1M的帶寬,監控的門檻值為800K。(注意:經過測試,在zabbix的trigger中這是0.8M,不會發出告警,但是門檻值為大于1M的小數時又可以告警,懷疑是小于1M時,zabbix自動将機關換成K導緻的。後來索性在定義帶寬監控門檻值時将機關統一為K,并且一定要為整數。如1300K可以,但是1300.5K則不會告警。)
腳本思路1:監控門檻值在每台主機上去添加主機宏,不是手動添加,而是通過zabbix API為主機添加宏。
具體的過程如下:
通過CMDB接口拿到所有主機的資訊,包括zabbix主機可見名和帶寬資訊,做判斷,公網帶寬為0M時,不添加主機宏。當不為0M時,先判斷主機上是否存着這個宏,如果不存在則建立這個宏,如果存在,先比較該宏的值是否和由的帶寬值計算出的告警門檻值相等,如果相等,表示帶寬沒有更新過,不做處理。如果不相等,則表示帶寬是調整過的,需要更新主機宏上的帶寬門檻值。
腳本思路2:當主機上存在帶寬告警門檻值宏的時候删除宏,如果公網帶寬擷取到的資訊不是0M,則建立宏,如果是0M,則不建立宏。
思路2明顯比思路1要簡單。下面是思路2對應的腳本
先分别定義擷取主機宏、删除主機宏、建立主機宏的函數出來。然後定義一個main函數,在main()函數中先删除宏,再建立宏即可。
Python腳本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<code>#!/usr/bin/python</code>
<code>#coding:utf-8</code>
<code>import</code> <code>requests,json</code>
<code>from zabbix_api </code><code>import</code> <code>ZabbixAPI</code>
<code>server=</code><code>"http://zabbix.cheyaoshicorp.com"</code>
<code>username=</code><code>"zhouhai"</code>
<code>password=</code><code>"zhouhai"</code>
<code>zapi = ZabbixAPI(server=server, path=</code><code>""</code><code>, log_level=0)</code>
<code>zapi.login(username, password)</code>
<code>def get_hostmacroid(host_name):</code>
<code> </code><code>''</code><code>'</code>
<code> </code><code>通過host_name擷取目前主機的$TRAFFIC_THRESHOLD宏ID</code>
<code> </code><code>hosts = zapi.host.get({</code><code>"output"</code><code>:</code><code>"extend"</code><code>,</code><code>"filter"</code><code>:{</code><code>"name"</code><code>:host_name}})</code>
<code> </code><code>hostid = hosts[0].get(</code><code>'hostid'</code><code>)</code>
<code> </code><code>host_macros = zapi.usermacro.get({</code><code>"output"</code><code>:</code><code>"extend"</code><code>, </code><code>"hostids"</code><code>:hostid})</code>
<code> </code><code>macros = [_ </code><code>for</code> <code>_ </code><code>in</code> <code>host_macros </code><code>if</code> <code>_.get(</code><code>'macro'</code><code>) == </code><code>'{$TRAFFIC_THRESHOLD}'</code><code>]</code>
<code> </code><code>hostmacroid = [macros[0].get(</code><code>'hostmacroid'</code><code>)] </code><code>if</code> <code>len(macros) > 0 </code><code>else</code> <code>None</code>
<code> </code><code>return</code> <code>hostid, hostmacroid</code>
<code>def delete_host_macro(host_name):</code>
<code> </code><code>hostid, hostmacroid = get_hostmacroid(host_name)</code>
<code> </code><code>if</code> <code>hostmacroid:</code>
<code> </code><code>zapi.usermacro.delete(hostmacroid)</code>
<code>def create_host_macro(host_name, bandwidthout):</code>
<code> </code><code>band = int(bandwidthout.replace(</code><code>'M'</code><code>, </code><code>''</code><code>))</code>
<code> </code><code>if</code> <code>band == 0:</code>
<code> </code><code>return</code>
<code> </code><code>if</code> <code>hostid:</code>
<code> </code><code>zapi.usermacro.create({</code>
<code> </code><code>"hostid"</code><code>: hostid,</code>
<code> </code><code>"macro"</code><code>: </code><code>"{$TRAFFIC_THRESHOLD}"</code><code>,</code>
<code> </code><code>"value"</code><code>: </code><code>'{0}K'</code><code>.</code><code>format</code><code>(band * 800)</code>
<code> </code><code>})</code>
<code>def main():</code>
<code> </code><code>1.删除主機的帶寬宏</code>
<code> </code><code>2.建立主機宏</code>
<code> </code><code>url = </code><code>'http://cmdb.cheyaoshicorp.com/api/ecs'</code>
<code> </code><code>r = requests.get(url)</code>
<code> </code><code>ecss = json.loads(r.text)</code>
<code> </code><code>for</code> <code>_ </code><code>in</code> <code>ecss:</code>
<code> </code><code>host_name = _.get(</code><code>'name'</code><code>)</code>
<code> </code><code>bandwidthout = _.get(</code><code>'bandwidthout'</code><code>)</code>
<code> </code><code>delete_host_macro(host_name)</code>
<code> </code><code>create_host_macro(host_name, bandwidthout)</code>
<code>main()</code>
<code></code>
本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1784792,如需轉載請自行聯系原作者