说明
第一种方案,借助docker的python版的api,然后通过自己封装自定义脚本来做,稍微麻烦点,但是可以达到个人自定义的效果。
第二种借助已经封装好的模板来做,简单省事情,不过功能有限,更多功能还是需要自己开写脚本开发。
开始配置
安装模块docker-py
pip install docker-py
具体用法参见:https://docker-py.readthedocs.io/en/stable/
下面开始写自动发现docker容器的脚本,以下操作是在zabbix_agent端进行的。也分两种,一种shell脚本一种python脚本
脚本放在一般放在这里/etc/zabbix/script(新建了一个script的目录)
# cat /etc/zabbix/script/docker_discovery.sh
#!/bin/bash
docker() {
port=($(sudo docker ps -a|grep -v "CONTAINER ID"|awk '{print $NF}'))
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'
}
case $1 in
docker)
docker
;;
*)
echo "Usage:`basename $0` {docker}"
;;
esac
第二种脚本:
#cat /etc/zabbix/script/docker_discovery.py
#!/usr/bin/env python
import os
import simplejson as json
t=os.popen("""sudo docker ps |grep -v 'CONTAINER ID'|awk {'print $NF'} """)
container_name = []
for container in t.readlines():
r = os.path.basename(container.strip())
container_name += [{'{#CONTAINERNAME}':r}]
print json.dumps({'data':container_name},sort_keys=True,indent=4,separators=(',',':'))
推荐使用第二种脚本执行上面的脚本是需要先安装模块,赋予执行权限
pip install simplejson
chmod 757 docker_discovery.py
chown zabbix:zabbix /etx/zabbix/script -R
赋予zabbix权限,编辑/etc/sudoers,添加如下内容
zabbix ALL=(root) NOPASSWD: ALL #可能权限比较大
或者
zabbix ALL=(root) NOPASSWD:/usr/bin/docker,/usr/bin/python,/etc/zabbix/script/docker_discovery.py,/etc/zabbix/script/docker_minion.py #这种写法比较具体
添加配置文件,配置文件放在/etc/zabbix/zabbix_agentd.d/里面,如下
#cat docker_discovery.conf
UserParameter=docker_discovery,python /etc/zabbix/script/docker_discovery.py
UserParameter=docker_discovery[*],python /etc/zabbix/script/docker_discovery.sh $1
测试:
[root@localhost zabbix_agentd.d]# zabbix_get -s 127.0.0.1 -k docker_discovery
{
"data":[
{
"{#CONTAINERNAME}":"slave2"
},
{
"{#CONTAINERNAME}":"slave1"
},
{
"{#CONTAINERNAME}":"master"
}
]
}
成功即可。
另外一个脚本,监控容器内的各个状态。如下:
#cat /etc/zabbix/script/docker_minion.py
#!/usr/bin/env python
import docker
import sys
import subprocess
import os
def check_container_stats(container_name,collect_item):
#docker_client = docker_client.containers.get(container_name)
container_collect=docker_client.containers.get(container_name).stats(stream=True)
old_result=eval(container_collect.next())
new_result=eval(container_collect.next())
container_collect.close()
if collect_item == 'cpu_total_usage':
result=new_result['cpu_stats']['cpu_usage']['total_usage'] - old_result['cpu_stats']['cpu_usage']['total_usage']
elif collect_item == 'cpu_system_usage':
result=new_result['cpu_stats']['system_cpu_usage'] - old_result['cpu_stats']['system_cpu_usage']
elif collect_item == 'cpu_percent':
cpu_total_usage=new_result['cpu_stats']['cpu_usage']['total_usage'] - old_result['cpu_stats']['cpu_usage']['total_usage']
cpu_system_uasge=new_result['cpu_stats']['system_cpu_usage'] - old_result['cpu_stats']['system_cpu_usage']
cpu_num=len(old_result['cpu_stats']['cpu_usage']['percpu_usage'])
result=round((float(cpu_total_usage)/float(cpu_system_uasge))*cpu_num*100.0,2)
elif collect_item == 'mem_usage':
result=new_result['memory_stats']['usage']
elif collect_item == 'mem_limit':
result=new_result['memory_stats']['limit']
elif collect_item == 'network_rx_bytes':
result=new_result['networks']['eth0']['rx_bytes']
elif collect_item == 'network_tx_bytes':
result=new_result['networks']['eth0']['tx_bytes']
elif collect_item == 'mem_percent':
mem_usage=new_result['memory_stats']['usage']
mem_limit=new_result['memory_stats']['limit']
result=round(float(mem_usage)/float(mem_limit)*100.0,2)
return result
if __name__ == "__main__":
docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock', version='1.27')
container_name=sys.argv[1]
collect_item=sys.argv[2]
print check_container_stats(container_name,collect_item)
赋予脚本权限:
chmod 757 docker_discovery.py
chmod 757 docker_minion.py
添加配置文件,配置文件放在/etc/zabbix/zabbix_agentd.d/里面,如下
cat docker_status.conf
UserParameter=docker_status[*],sudo /usr/bin/python /etc/zabbix/script/docker_monitor.py $1 $2
先测试一下:
[root@localhost zabbix_agentd.d]# zabbix_get -s 127.0.0.1 -k docker_status[master,cpu_percent]
1.4
这样代表成功。
制作模板:
最终结果
我制作的模板:https://github.com/fungitive/zabbix_template/blob/master/Template_Discovery_Docker.xml
参照文章:https://blog.csdn.net/yang00322/article/details/77895301