|
zabbix自动化
基于zabbix2.0.2版本
目录
zabbix自动化.... 1
一、定期报表功能.... 1
1.1配置文件:config.ini2
1.2主程序:create_script.sh.. 2
1.3生成文件:WEB_music.idc3 WEB_outlets.idc3.. 4
二、批量添加screen.. 4
2.1主配置文件:screen.ini4
2.2 监控项对应关系.... 5
2.3 主机、screen对应关系文件:host.ini5
2.4主程序:screen.py. 6
2.5接口程序:addscreen.sh.. 10
2.6执行.... 10
三、批量添加主机.... 11
3.1配置文件:config.ini11
3.2主程序:daemon_config_host.sh.. 11
3.3中间状态表结构:.... 19
一、定期报表功能
根据screen名称将screen所展示的内容发给指定用户的邮件。
1.1配置文件:config.ini
将screen的名称以逗号分隔,之后以---与report收件地址分隔。多个地址可以分号分隔
WEB_outlets.idc3(CPU),WEB_outlets.idc3(TCP)---shanks@126.com
WEB_music.idc3(MEM)---shanks@qq.com;shanks@126.com
1.2主程序:create_script.sh
默认查看近期一周的数据。
脚本会以(为分隔符,拿到同一类screen的名称,里面可以包含cpu、mem等子分类。
#!/bin/bash
#create report script.
config='config.ini'
dbuser='shanks'
dbpass='shanks123'
dbhost='localhost'
dbport=3306
dbname='zabbix'
for zone in `awk -F\('{print $1}' ${config}`
do
mail_user=`grep -w "${zone}"${config}|awk -F--- '{print $2}'`
cat << hello-DD >${zone}
#!/bin/bash
now=\`date+"%Y%m%d%H%M%S"\`
now_s=\`date+"%s"\`
day_now=\`date+"%d"\`
week=604800
day=\${week}
width=500
url='http://zabbix.shanks.com/chart2.php?'
/usr/sbin/sendmail -fwangpo@dangdang.com -t << EOF
To:${mail_user}
Subject:ZABBIX-REPORT-${zone}
Content-type:text/html;charset=UTF-8
hello-DD
for screen in `grep -w "${zone}"${config} |awk -F--- '{print $1}'|sed 's/,/ /g'`
do
echo"<p><center><h1><fontcolor=\"#FF0000\"<h1>${screen}</h1></font></h1></center></p>">> ${zone}
echo "<tablewidth=\"1025\" border=\"1\">" >> ${zone}
#global set is over,now set the graph.
#get all of this screen's graphid.
graphids=`mysql -u${dbuser} -p${dbpass}-h${dbhost} -P${dbport} ${dbname} -e "select resourceid from screens_itemswhere screenid=(select screenid from screens wherename=\"${screen}\")"`
jishu=1
num_graphids=`echo${graphids##*resourceid}|awk '{print NR}'`
echo ${num_graphids}
for graphid in `echo${graphids##*resourceid}`
do
module=$((${jishu}%2))
if [ ${module} == 1 ]
then
if [ ${jishu} ==${num_graphids} ]
then
echo"<tr><td><imgsrc=\"\${url}graphid=${graphid}&width=\${width}&period=\${day}&stime=\${now}\"></td></tr>">> ${zone}
else
echo"<tr><td><imgsrc=\"\${url}graphid=${graphid}&width=\${width}&period=\${day}&stime=\${now}\"></td>">> ${zone}
fi
elif [ ${module} == 0 ]
then
echo "<tr><td><imgsrc=\"\${url}graphid=${graphid}&width=\${width}&period=\${day}&stime=\${now}\"></td></tr>">> ${zone}
fi
jishu=$((jishu+1))
done
echo "</table>">> ${zone}
done
echo "EOF" >> ${zone}
done
1.3生成文件:WEB_music.idc3 WEB_outlets.idc3
之后将WEB_music.idc3 WEB_outlets.idc3赋予可执行权限,并用cron执行即可。
二、批量添加screen
2.1主配置文件:screen.ini
[zabbix]
host=192.168.122.100
db=zabbix
dbuser=shanks
dbpasswd=shanks123
api=http://192.168.122.101/api_jsonrpc.php
zbuser=admin
zbpasswd=shanks
2.2 监控项对应关系
显示名:graph名称
{
"CPU":"CPU",
"MEM":"mem_free",
"DISK":"DISK",
"TRAFFIC":"traffic",
"TCP":"fluxconns",
"SWAP":"swap_free"
}
2.3 主机、screen对应关系文件:host.ini
Screen的名称以【】括起,其对应的主机以host=定义,多台以逗号分隔。
[WEB_shanks.com]
host=web-192.168.122.99-IDC2,web-192.168.122.100-IDC2
[WEB_pp711.com]
host=web-192.168.122.101-IDC2,web-192.168.122.102-IDC2
2.4主程序:screen.py
#!/usr/bin/python
#encoding:gb2312
import MySQLdb
import ConfigParser
import commands,json,sys,os
#def GetAuthStr():
authstr={}
cmd='''curl -i -s -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"user.login","params":{"user":"'''+zbuser+'''","password":"'''+zbpasswd+'''"},"auth":null,"id":0}' '''+api+'|tail -1'
#print cmd
out=commands.getoutput(cmd)
#json
authstr=json.loads(out)
return authstr["result"]
def GetScreenId():
conn=MySQLdb.connect(host=host,user=dbuser,passwd=dbpasswd,port=3306,db=db)
sql='select max(screenid)+1 from screens'
cursor=conn.cursor()
cursor.execute(sql)
result=cursor.fetchall()
for record in result:
return record[0]
cursor.close()
conn.close()
#graphid
def GetResourceId(item,ip):
conn=MySQLdb.connect(host=host,user=dbuser,passwd=dbpasswd,port=3306,db=db)
sql="select DISTINCT a.graphid,a.name,d.host from graphs a,graphs_items b,items c,hosts d\
where a.graphid=b.graphid andb.itemid=c.itemid and c.hostid=d.hostid\
and d.host='"+ip+"' anda.name='"+item+"'"
#print sql
cursor=conn.cursor()
cursor.execute(sql)
result=cursor.fetchall()
for record in result:
return record[0]
cursor.close()
conn.close()
#screeitems
def GetScreeItems(screenid,resourceid,x,y):
screenitem='{"screenid":"'+str(screenid)+'","resourcetype":0,"resourceid": "'+str(resourceid)+'","rowspan":0,"colspan": 0,"width":500,"height":100,"x":'+str(x)+',"y": '+str(y)+'}'
return screenitem
if __name__=='__main__':
if(len(sys.argv)<1):
print"usage:"+sys.argv[0]+"domain itemidc\nex:"+sys.argv[0]+" cpu "
sys.exit(1)
#zabbix
globalhost,db,dbuser,dbpasswd,api,zbuser,zbpasswd
conf=ConfigParser.ConfigParser()
conf.read('screen.ini')
host=conf.get("zabbix","host")
db=conf.get("zabbix","db")
dbuser=conf.get("zabbix","dbuser")
dbpasswd=conf.get("zabbix","dbpasswd")
zbuser=conf.get("zabbix","zbuser")
zbpasswd=conf.get("zabbix","zbpasswd")
api=conf.get("zabbix","api")
authstr=GetAuthStr()
#print authstr
# itm=sys.argv[1].upper()
#idc=sys.argv[3].upper()
#screen_name=domain+'('+itm+')'
#print screen_name
#aph name
items={}
tmpstr=''
fhandle=open('item.ini','r')
confinfo=fhandle.readlines()
for iline in confinfo:
tmpstr+=iline
#print tmpstr
#json
items=json.loads(tmpstr)
item=items[itm]
#print "item:"+item
hconf=ConfigParser.ConfigParser()
hconf.read('host.ini')
names=hconf.sections()
for domain in names:# screenitem=''
x=y=0
screenid=GetScreenId()
#print"screenid:"+str(screenid)
screen_name=domain+'('+itm+')'
hosts=hconf.get(domain,"host").split(',')
for ip in hosts:
if x>1:
x=0
y=y+1
#print ip
resourceid=GetResourceId(item,ip)
#print"resourceid:"+str(resourceid)
screenitem=screenitem+GetScreeItems(screenid,resourceid,x,y)+','
x=x+1
#
screenitem=screenitem.strip(',')
#print screenitem
vsize=y+1
cmdstr='''curl -i -s -X POST -H'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"screen.create","params": {"name":"'''+screen_name+'''","hsize":2,"vsize":'''+str(vsize)+''',"screenitems":['''+screenitem+''']},"auth":"'''+authstr+'''","id": 1}' '''+api
print cmdstr
os.system(cmdstr)
2.5接口程序:addscreen.sh
#!/bin/sh
#cpu
python screen.py cpu
#mem
python screen.py mem
#
python screen.py disk
#traffic
python screen.py traffic
#tcp udp
python screen.py tcp
#windows swap
#python screen.py swap
2.6执行
sh addscreen.sh
三、批量添加主机
3.1配置文件:config.ini
[config]
db=monitor
user=monitor
passwd=monitor
dbtab=zabbix_dbconf
host=192.168.122.103
[zabbix]
db=zabbix
user=zabbix
passwd=zabbix
zb_user=Admin
zb_passwd=zabbix
[graph_idc2]
zbserver=192.168.122.100
dbport=3306
zburl=http://192.168.122.100/api_jsonrpc.php
zbagent=192.168.122.101
3.2主程序:daemon_config_host.sh
#!/bin/bash
#invoking config_host.sh
host_dbname='monitor'
host_dbuser='monitor'
host_dbpasswd='monitor'
host_dbport=3306
host_dbhost='192.168.122.103'
dbconn="mysql-u${host_dbuser} -p${host_dbpasswd} -h${host_dbhost} -P${host_dbport} ${host_dbname}"
help(){
echo "$0 [target] [action] {group}"
echo "target:"
echo " client ip"
echo "action:"
echo " create|delete"
echo "group:"
echo " [dns|lvs|haproxy|tengine|other]"
echo "---*---"
echo "if action=create,then you shouldput a group"
echo "exp:"
echo " $0 110.110.110.110 create lvs"
echo " $0 110.110.110.110 delete"
exit 0
}
get_config_ini(){
#get the config.ini from10.64.5.17
#wget the new one.
cd /tmp && wget -qchttp://10.64.5.14/tech/zabbix_hostconf/config.ini
#if md5 not same,rm local file.
md5_old=`md5sum/usr/local/zabbix/script/config.ini|awk '{print $1}'`
md5_new=`md5sum /tmp/config.ini|awk '{print$1}'`
if [ "${md5_old}" = "${md5_new}"]
then
echo "config.ini is not change."
else
rm -rf /usr/local/zabbix/script/config.ini&& mv /tmp/config.ini /usr/local/zabbix/script/config.ini
fi
}
check_host(){
#check the host exist.
check_result=`curl -s -X POST -H"Content-Type: application/json" -d '{"jsonrpc":"2.0","method": "host.exists","params":{"host": '\"${client_ip}\"',"nodeids":["0"]},"auth": '\"${auth_passwd}\"',"id":0}' ${api_url##*=}|awk -F, '{print $2}'|awk -F: '{if(NF==2) {print $2}}'`
}
create_host(){
if [ "${check_result}" ="false" ]
then
#to create host.
if [ "aa${linux_template_id}aa"!= "aa${template_id}aa" ]
then
curl -s -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"host.create","params": {"host":'\"${client_ip}\"',"interfaces":[{"type": 1,"main": 1,"useip":1,"ip":'\"${client_ip}\"',"dns":"","port": "10050"}],"groups": [{"groupid":'\"${group_id}\"'}],"templates":[{"templateid":'\"${linux_template_id}\"'},{"templateid":'\"${template_id}\"'}]},"auth":'\"${auth_passwd}\"',"id":0}' ${api_url##*=}
else
curl -s -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"host.create","params":{"host":'\"${client_ip}\"',"interfaces":[{"type": 1,"main": 1,"useip":1,"ip":'\"${client_ip}\"',"dns":"","port": "10050"}],"groups":[{"groupid":'\"${group_id}\"'}],"templates":[{"templateid":'\"${linux_template_id}\"'}]},"auth":'\"${auth_passwd}\"',"id":0}' ${api_url##*=}
fi
else
echo "${client_ip} is exist."
fi
}
delete_host(){
if [ "${check_result}" ="true" ]
then
host_id=`${zabbix_db_conn} -e "selecthostid from hosts where host=\"${client_ip}\""|grep -v 'hostid'`
#to delete host.
curl -s -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"host.delete","params": [{"hostid":'\"${host_id}\"'}],"auth":'\"${auth_passwd}\"',"id":0}' ${api_url##*=}
else
echo "${client_ip} is not exist."
fi
}
config_host(){
#get zabbix conn fromconfig.ini
CONFIG_INI="/usr/local/zabbix/script/config.ini"
#get some var.
username=`awk -F\= '{if($1~/\[zabbix\]/){getline;getline;getline;getline;print $0}}' ${CONFIG_INI}`
passwd=`awk -F\= '{if($1~/\[zabbix\]/){getline;getline;getline;getline;getline;print $0}}'${CONFIG_INI}`
db_name=`awk -F\= '{if($1~/\[zabbix\]/){getline;print $0;getline;print $0;getline;print $0}}'${CONFIG_INI}|grep -w 'db'`
db_user=`awk -F\= '{if($1~/\[zabbix\]/){getline;print $0;getline;print $0;getline;print $0}}'${CONFIG_INI}|grep -w 'user'`
db_passwd=`awk -F\= '{if($1~/\[zabbix\]/){getline;print $0;getline;print $0;getline;print $0}}'${CONFIG_INI}|grep -w 'passwd'`
if [[ $# < 2 ]] || [[ $#> 3 ]]
then
help
fi
client_ip=$1
case $2 in
create)
case $3 in
dns)
group_name='dns'
;;
lvs)
group_name='lvs'
;;
haproxy)
group_name='haproxy'
;;
tengine)
group_name='tengine'
;;
other)
group_name='linux'
;;
esac
for z_server in `awk -F\= '{if($1~/zbserver/)print $2}' ${CONFIG_INI}`
do
#get the linux template id.
db_port=`awk -F\=-vz_s="${z_server}" '{if ($2==z_s){getline;print $0}}' ${CONFIG_INI}`
zabbix_db_conn="/usr/bin/mysql-u${db_user##*=} -p${db_passwd##*=} -h${z_server} -P${db_port##*=}${db_name##*=}"
linux_template_id=`${zabbix_db_conn} -e"select hostid from hosts where name=\"linux\""|grep -v'hostid'`
api_url=`awk -F\=-vz_s="${z_server}" '{if ($2==z_s){getline;getline;print $0}}'${CONFIG_INI}`
group_id=`${zabbix_db_conn} -e "selectgroupid from groups where name=\"${group_name}\""|grep -v'groupid'`
template_id=`${zabbix_db_conn} -e"select hostid from hosts wherename=\"${group_name}\""|grep -v 'hostid'`
#to get the auth.
auth_passwd=`curl -s -X POST -H"Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"user.login","params":{"user":'\"${username##*=}\"',"password":'\"${passwd##*=}\"'},"auth":null,"id":0}' ${api_url##*=}|awk -F\" '{print $8}'|grep -v ^$`
check_host
create_host
done
${dbconn} -e "update zabbix_hostconfset stat=0 where ip='${c_ip}'" && echo "${c_ip} createmonitor ok,and set stat to 0."
;;
delete)
for z_server in `awk -F\= '{if($1~/zbserver/)print $2}' ${CONFIG_INI}`
do
#getthe linux template id.
db_port=`awk -F\=-vz_s="${z_server}" '{if ($2==z_s){getline;print $0}}' ${CONFIG_INI}`
zabbix_db_conn="/usr/bin/mysql-u${db_user##*=} -p${db_passwd##*=} -h${z_server} -P${db_port##*=}${db_name##*=}"
linux_template_id=`${zabbix_db_conn} -e"select hostid from hosts where name=\"linux\""|grep -v'hostid'`
api_url=`awk -F\=-vz_s="${z_server}" '{if ($2==z_s){getline;getline;print $0}}'${CONFIG_INI}`
#to get the auth.
auth_passwd=`curl -s -X POST -H "Content-Type:application/json" -d '{"jsonrpc":"2.0","method":"user.login","params":{"user":'\"${username##*=}\"',"password":'\"${passwd##*=}\"'},"auth":null,"id":0}' ${api_url##*=}|awk -F\" '{print $8}'|grep -v ^$`
check_host
delete_host
done
${dbconn} -e "delete from zabbix_hostconfwhere ip='${d_ip}'" && echo "${d_ip} delete monitor ok."
;;
*)
help
esac
}
get_config_ini
#get the ip list of create.
create_list=`${dbconn} -e"select ip from zabbix_hostconf where stat=1"`
if [ "aa" ="a${create_list}a" ]
then
echo "no ip need create monitor."
else
for c_ip in ${create_list##*ip}
do
c_ip_group_=`${dbconn} -e "selecthostgroup from zabbix_hostconf where ip='${c_ip}'"`
c_ip_group=${c_ip_group_##*hostgroup}
config_host ${c_ip} create ${c_ip_group}
done
fi
#get the ip list of delete.
delete_list=`${dbconn} -e"select ip from zabbix_hostconf where stat=2"`
if [ "aa" ="a${delete_list}a" ]
then
echo "no ip need delete monitor."
else
for d_ip in ${delete_list##*ip}
do
config_host ${d_ip} delete
done
fi
3.3中间状态表结构:
可忽略
|
|