本文主要分为3个部分
第一部分 前言,主要说说需求和获取数据的命令
第二部分 zabbix,主要说如何利用lld获得想要监控的数据
第三部分 ansible,主要提供一个ansible playbook来分发该监控所需的文件
第一部分 前言部分
最近有一个需求是对系统的IO进行监控,最后决定从iostat获取数据。
这是具体的命令:
1
|
iostat -x -d -m 1 3 |
参数简单解析:
-x Display extended statistics
-d Display the device utilization report
-m Display statistics in megabytes per second instead of blocks or kilobytes per second
那么为什么要 1 3呢?
我们用
1
|
iostat -x -d -m 1 |
多次测试,会发现第一次输出的值变动不大,第二次,第三次输出的值会有一定的变化,因此我更偏向与取第二次,第三次的值做平均
命令的输出格式如下:
1
|
Device: rrqm /s
wrqm /s
r /s w /s
rMB /s
wMB /s avgrq-sz avgqu-sz await svctm %util |
可以较好地满足我们的监控需求
第二部分 zabbix部分
接下来,我们就用zabbix的LLD来自动发现当前系统的Device值
cat /etc/zabbix/scripts/io_discovery.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/bin/env python import
os import
commands (status,output)
= commands.getstatusoutput( "iostat -x -d -m | sed -n '4,$p' | grep -v ^$| awk '{print $1}'" ) DISKS =
output.split() print
'{' print
'\t"data":[' count =
1 for
key in DISKS: print
'\t{' if
count < len (DISKS):
print '\t\t"{#DISK}":"%s"},'
% key else :
print '\t\t"{#DISK}":"%s"}'
% key count
+ =
1 print
'\t]' print
'}' |
拿到Device以后,用脚本来获取对应的数值
cat /etc/zabbix/scripts/userparameter_diskio.py
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
|
#!/bin/env python import
commands import
sys DISK =
sys.argv[ 1 ] cmdline =
'cat /tmp/iostat.txt | grep %s'
% DISK (status,output)
= commands.getstatusoutput(cmdline) output_list
= output.split() value =
zip ( * [ iter (output_list)] * 12 ) if
sys.argv[ 2 ]
= =
"rrqmps" : print
(( float (value[ 1 ][ 1 ]) + float (value[ 2 ][ 1 ])) / 2 ) elif
sys.argv[ 2 ]
= =
"wrqmps" : print
(( float (value[ 1 ][ 2 ]) + float (value[ 2 ][ 2 ])) / 2 ) elif
sys.argv[ 2 ]
= =
"rps" : print
(( float (value[ 1 ][ 3 ]) + float (value[ 2 ][ 3 ])) / 2 ) elif
sys.argv[ 2 ]
= =
"wps" : print
(( float (value[ 1 ][ 4 ]) + float (value[ 2 ][ 4 ])) / 2 ) elif
sys.argv[ 2 ]
= =
"rspeed" : print
(( float (value[ 1 ][ 5 ]) + float (value[ 2 ][ 5 ])) / 2 ) elif
sys.argv[ 2 ]
= =
"wspeed" : print
(( float (value[ 1 ][ 6 ]) + float (value[ 2 ][ 6 ])) / 2 ) elif
sys.argv[ 2 ]
= =
"await" : print
(( float (value[ 1 ][ 9 ]) + float (value[ 2 ][ 9 ])) / 2 ) elif
sys.argv[ 2 ]
= =
"svctm" : print
(( float (value[ 1 ][ 10 ]) + float (value[ 2 ][ 10 ])) / 2 ) elif
sys.argv[ 2 ]
= =
"util" : print
(( float (value[ 1 ][ 11 ]) + float (value[ 2 ][ 11 ])) / 2 ) |
这里还需要一个crontab来生成/tmp/iostat.txt文件
* * * * * iostat -x -d -m 1 3 > /tmp/iostat.txt
接着写一个自定义配置文件
cat /etc/zabbix/zabbix_agentd.d/userparameter_diskio.conf
1
2
|
UserParameter=diskio_discovery[*],python
/etc/zabbix/scripts/io_discovery .py UserParameter=diskio[*],python
/etc/zabbix/scripts/userparameter_diskio .py $1 $2 |
接下来需要在zabbix上建一个监控模板,模板在附件里面,本模板适用于zabbix3.2,其他版本请自行测试,可能需要做一些修改
都准备以后可以开始使用了
首先把相应的脚本和配置文件放到客户机上面,添加cron
接着把模板导入,在模板里面添加机器,然后restart zabbix 客户端
第三部分 Ansible部分
如果你有使用ansible,这里可以提供一个playbook,用来分发脚本等工作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
- hosts: 客户机 tasks: - name: mkdir the scripts dir
file: path=/etc/zabbix/scripts state=directory - name: copy conf files copy: src=/etc/zabbix/zabbix_agentd.d/userparameter_diskio.conf dest=/etc/zabbix/zabbix_agentd.d/ - name: copy io_discovery.py
copy: src=/etc/zabbix/scripts/io_discovery.py dest=/etc/zabbix/scripts/io_discovery.py mode=0755 - name: copy userparameter_diskio.py
copy: src=/etc/zabbix/scripts/userparameter_diskio.py dest=/etc/zabbix/scripts/userparameter_diskio.py mode=0755 - name: add cron cron: name='add iostat cron' minute='*' hour='*' day='*' month='*' weekday='*' job='iostat -x -d -m 1 3 > /tmp/iostat.txt' state=present notify: - restart zabbix-agent handlers: |