1、Nagios安装
yum install -y nagios.i686
yum install -y nagios-plugins-all.i686
安装完后会在apache的配置文件目录下/etc/httpd/conf.d/产生一个外部的配置文件nagios.conf
service httpd start
service nagios start
default user nagiosadmin password nagiosadmin
2.配置文件生成器
Django前期的收集主机信息代码
优化后:
1 #!/usr/bin/env python 2 3 import urllib,urllib2 4 from subprocess import Popen,PIPE 5 import pickle 6 import json 7 8 def getIfconfig(): 9 p = Popen(['ifconfig'],stdout=PIPE) 10 data = p.stdout.read() 11 return data 12 13 def getDmi(): 14 p = Popen(['dmidecode'],stdout=PIPE,stderr=PIPE) 15 data_out = p.stdout.read() 16 data_err = p.stderr.read() 17 if data_err: 18 return {'vendor':'container','product':'container','sn':'XXX'} 19 return data_out 20 21 def parseData(data): 22 if isinstance(data,dict): 23 return data 24 parsed_data = [] 25 new_line = '' 26 data = [i for i in data.split(' ') if i] 27 for line in data: 28 if line[0].strip(): 29 parsed_data.append(new_line) 30 new_line = line +' ' 31 else: 32 new_line += line+' ' 33 parsed_data.append(new_line) 34 return [i for i in parsed_data if i] 35 36 def parseIfconfig(parsed_data): 37 parsed_data = [i for i in parsed_data if not i.startswith('lo')] 38 for lines in parsed_data: 39 line_list = lines.split(' ') 40 devname = line_list[0].split()[0] 41 macaddr = line_list[0].split()[-1] 42 ipaddr = line_list[1].split()[1].split(':')[1] 43 break 44 dic['ip'] =ipaddr 45 return dic 46 47 def parseDmi(parsed_data): 48 if isinstance(parsed_data,dict): 49 return parsed_data 50 dic = {} 51 parsed_data = [i for i in parsed_data if i.startswith('System Information')] 52 parsed_data = [i for i in parsed_data[0].split(' ')[1:] if i] 53 dmi_dic = dict([i.strip().split(':') for i in parsed_data]) 54 dic['vendor'] = dmi_dic['Manufacturer'].strip() 55 dic['product'] = dmi_dic['Product Name'].strip() 56 dic['sn'] = dmi_dic['Serial Number'].strip()[:15] 57 return dic 58 59 def getHostname(f): 60 with open(f) as fd: 61 for line in fd: 62 if line.startswith('HOSTNAME'): 63 hostname = line.split('=')[1].strip() 64 break 65 return {'hostname':hostname} 66 67 def getOsver(f): 68 with open(f) as fd: 69 for line in fd: 70 osver = line.strip() 71 break 72 return {'osver':osver} 73 74 def getCpu(f): 75 num = 0 76 with open(f) as fd: 77 for line in fd: 78 if line.startswith('processor'): 79 num +=1 80 if line.startswith('model name'): 81 cpu_model = line.split(':')[1].split() 82 cpu_model = cpu_model[0]+' '+cpu_model[-1] 83 return {'cpu_num':num,'cpu_model':cpu_model} 84 85 def getMemory(f): 86 with open(f) as fd: 87 for line in fd: 88 if line.startswith('MemTotal'): 89 mem = int(line.split()[1].strip()) 90 break 91 mem = "%d" % int(mem/1024.0)+'M' 92 return {'memory':mem} 93 94 95 if __name__ == '__main__': 96 dic = {} 97 data_ip = getIfconfig() 98 parsed_data_ip = parseData(data_ip) 99 ip = parseIfconfig(parsed_data_ip) 100 data_dmi = getDmi() 101 parsed_data_dmi = parseData(data_dmi) 102 dmi = parseDmi(parsed_data_dmi) 103 hostname = getHostname('/etc/sysconfig/network') 104 osver = getOsver('/etc/issue') 105 cpu = getCpu('/proc/cpuinfo') 106 mem = getMemory('/proc/meminfo') 107 dic.update(ip) 108 dic.update(dmi) 109 dic.update(hostname) 110 dic.update(osver) 111 dic.update(cpu) 112 dic.update(mem) 113 #data = urllib.urlencode(dic) 114 #data = pickle.dumps(dic) 115 data = json.dumps(dic) 116 req = urllib2.urlopen('http://192.168.1.120:8000/hostinfo/collect/',data) 117 print req.read()
在nagios上分组
vim gen.py
1 #!/usr/bin/env python 2 3 import os 4 import urllib,urllib2 5 import json 6 7 CUR_DIR = os.path.dirname(__file__) 8 CONF_DIR = os.path.join(os.path.abspath(CUR_DIR),'hosts') 9 10 HOST_TEMP="""define host{ 11 use linux-server 12 host_name %(hostname)s 13 alias %(hostname)s 14 address %(ip)s 15 } 16 """ 17 HOSTGROUP_TEMP="""define hostgroup{ 18 hostgroup_name %(groupname)s 19 alias %(groupname)s 20 members %(members)s 21 } 22 """ 23 def initDir(): 24 if not os.path.exists(CONF_DIR): 25 os.mkdir(CONF_DIR) 26 27 def getData(): 28 url = 'http://192.168.1.120:8000/hostinfo/getjson/' 29 req = urllib2.urlopen(url) 30 data = json.loads(req.read()) 31 return data 32 33 def writeConf(f,data): 34 with open(f,'w') as fd: 35 fd.write(data) 36 37 def parseData(data): 38 host_conf = '' 39 hostgroup_conf = '' 40 for hg in data: 41 groupname = hg['groupname'] 42 members = [] 43 for h in hg['members']: 44 hostname = h['hostname'] 45 members.append(hostname) 46 host_conf += HOST_TEMP % h 47 hostgroup_conf += HOSTGROUP_TEMP % {'groupname':groupname, 'members':','.join(members)} 48 fp_hostconf = os.path.join(CONF_DIR,'hosts.cfg') 49 fp_hostgroupconf = os.path.join(CONF_DIR,'hostgroup.cfg') 50 writeConf(fp_hostconf,host_conf) 51 writeConf(fp_hostgroupconf,hostgroup_conf) 52 53 54 if __name__ == '__main__': 55 initDir() 56 data = getData() 57 parseData(data)
同步配置文件sync_gen.sh
1 #!/bin/bash 2 3 cur=`dirname $0` 4 cd $cur 5 python gen.py 6 md5=`find hosts/ -type f -exec md5sum {} ;|md5sum` 7 cd /etc/nagios/conf.d 8 conf_md5=`find hosts/ -type f -exec md5sum {} ;|md5sum` 9 if [ "$md5" != "$conf_md5" ];then 10 cd - 11 cp -rp hosts/ /etc/nagios/conf.d 12 /etc/init.d/nagios restart 13 fi
如果两个分组都有一样的信息,即一样的主机名,则需加判断条件:
1 #!/usr/bin/env python 2 3 import os 4 import urllib,urllib2 5 import json 6 7 CUR_DIR = os.path.dirname(__file__) 8 CONF_DIR = os.path.join(os.path.abspath(CUR_DIR),'hosts') 9 10 HOST_TEMP="""define host{ 11 use linux-server 12 host_name %(hostname)s 13 alias %(hostname)s 14 address %(ip)s 15 } 16 """ 17 HOSTGROUP_TEMP="""define hostgroup{ 18 hostgroup_name %(groupname)s 19 alias %(groupname)s 20 members %(members)s 21 } 22 """ 23 def initDir(): 24 if not os.path.exists(CONF_DIR): 25 os.mkdir(CONF_DIR) 26 27 def getData(): 28 url = 'http://192.168.1.120:8000/hostinfo/getjson/' 29 req = urllib2.urlopen(url) 30 data = json.loads(req.read()) 31 return data 32 33 def writeConf(f,data): 34 with open(f,'w') as fd: 35 fd.write(data) 36 37 def countDict(k,d): 38 if k in d: 39 d[k] += 1 40 else: 41 d[k] = 1 42 43 def parseData(data): 44 dic = {} 45 host_conf = '' 46 hostgroup_conf = '' 47 for hg in data: 48 groupname = hg['groupname'] 49 members = [] 50 for h in hg['members']: 51 hostname = h['hostname'] 52 members.append(hostname) 53 countDict(hostname,dic) 54 if dic(hostname) < 2: 55 host_conf += HOST_TEMP % h 56 hostgroup_conf += HOSTGROUP_TEMP % {'groupname':groupname, 'members':','.join(members)} 57 fp_hostconf = os.path.join(CONF_DIR,'hosts.cfg') 58 fp_hostgroupconf = os.path.join(CONF_DIR,'hostgroup.cfg') 59 writeConf(fp_hostconf,host_conf) 60 writeConf(fp_hostgroupconf,hostgroup_conf) 61 62 63 if __name__ == '__main__': 64 initDir() 65 data = getData() 66 parseData(data)