天天看點

10、利用Zabbix API建立主機宏

需求:對所有雲主機添加公網帶寬監控,但不是每一台主機都有公網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) &gt; 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,如需轉載請自行聯系原作者

繼續閱讀