本文主要分为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:
|