1.利用 ansible 自动化工具,获取相应主机的信息
(1) 调用接口得到相应的 ip 链表 (http 协议)
def getHostInfo(): HostIPList = [] url = 'http://cmdb.mwbyd.cn/api/host/host/' r = requests.get(url) result_json = r.json() count = 0 while count != result_json['count']: url = url if count == 0 else result_json['next'] r = requests.get(url) result_json = r.json() result = result_json['results'] for host in result: HostIPList.append(host['ip']) count += 1 HostIPList.sort() return HostIPList
(2)调用 ansible python api 利用 ssh 协议获取相应ip的网络信息,系统信息(json 解析数据)
1 class MyInventory(Inventory): 2 def __init__(self, resource): 3 4 self.resource = resource 5 self.inventory = Inventory(host_list=[]) 6 self.gen_inventory() 7 8 def my_add_group(self, hosts, groupname, groupvars=None): 9 """ 10 add hosts to a group 11 """ 12 my_group = Group(name=groupname) 13 14 # if group variables exists, add them to group 15 if groupvars: 16 for key, value in groupvars.iteritems(): 17 my_group.set_variable(key, value) 18 19 # add hosts to group 20 for host in hosts: 21 # set connection variables 22 hostname = host.get("hostname") 23 hostip = host.get('ip', hostname) 24 hostport = host.get("port") 25 username = host.get("username") 26 password = host.get("password") 27 ssh_key = host.get("ssh_key") 28 my_host = Host(name=hostname, port=hostport) 29 my_host.set_variable('ansible_ssh_host', hostip) 30 my_host.set_variable('ansible_ssh_port', hostport) 31 my_host.set_variable('ansible_ssh_user', username) 32 my_host.set_variable('ansible_ssh_pass', password) 33 my_host.set_variable('ansible_ssh_private_key_file', ssh_key) 34 35 # set other variables 36 for key, value in host.iteritems(): 37 if key not in ["hostname", "port", "username", "password"]: 38 my_host.set_variable(key, value) 39 # add to group 40 my_group.add_host(my_host) 41 42 self.inventory.add_group(my_group) 43 44 def gen_inventory(self): 45 """ 46 add hosts to inventory. 47 """ 48 if isinstance(self.resource, list): 49 self.my_add_group(self.resource, 'default_group') 50 elif isinstance(self.resource, dict): 51 for groupname, hosts_and_vars in self.resource.iteritems(): 52 self.my_add_group(hosts_and_vars.get("hosts"), groupname, hosts_and_vars.get("vars")) 53 54 55 class MyRunner(MyInventory): 56 def __init__(self, *args, **kwargs): 57 super(MyRunner, self).__init__(*args, **kwargs) 58 self.results_raw = {} 59 def run(self, module_name='shell', module_args='', timeout=10, forks=10, pattern='*', 60 become=False, become_method='sudo', become_user='root', become_pass='', transport='paramiko'): 61 hoc = Runner(module_name=module_name, 62 module_args=module_args, 63 timeout=timeout, 64 inventory=self.inventory, 65 pattern=pattern, 66 forks=forks, 67 become=become, 68 become_method=become_method, 69 become_user=become_user, 70 become_pass=become_pass, 71 transport=transport 72 ) 73 self.results_raw = hoc.run() 74 return self.results_raw 75 76 @property 77 def results(self): 78 result = {'failed': {}, 'ok': {}} 79 dark = self.results_raw.get('dark') 80 contacted = self.results_raw.get('contacted') 81 if dark: 82 for host, info in dark.items(): 83 result['failed'][host] = info.get('msg') 84 85 if contacted: 86 for host, info in contacted.items(): 87 if info.get('invocation').get('module_name') in ['raw', 'shell', 'command', 'script']: 88 if info.get('rc') == 0: 89 result['ok'][host] = info.get('stdout') + info.get('stderr') 90 else: 91 result['failed'][host] = info.get('stdout') + info.get('stderr') 92 else: 93 if info.get('failed'): 94 result['failed'][host] = info.get('msg') 95 else: 96 result['ok'][host] = info.get('changed') 97 return result 98 99 100 def getHostInfoByIp(ip_list): 101 resource = [] 102 for ip in ip_list: 103 resource.append({ 104 "hostname": ip, 105 "port": "22", 106 "username": "root", 107 "password": "xxx", 108 }) 109 runner = MyRunner(resource) 110 result = runner.run(module_name='setup', module_args='') 111 if not result.has_key("contacted"): 112 return False 113 contacted = result.get('contacted') 114 hostinfo_list = [] 115 for k, v in contacted.items(): 116 ansible_facts = v.get('ansible_facts') 117 ansible_devices = ansible_facts.get('ansible_devices') 118 disk = {} 119 for d, v in ansible_devices.items(): 120 disk[d] = v['size'] 121 ansible_processor = ansible_facts.get('ansible_processor') 122 123 system_type = ansible_facts.get("ansible_distribution") 124 if system_type.lower() == "freebsd": 125 system_version = ansible_facts.get("ansible_distribution_release") 126 cpu_cores = ansible_facts.get("ansible_processor_count") 127 else: 128 system_version = ansible_facts.get("ansible_distribution_version") 129 cpu_cores = ansible_facts.get("ansible_processor_vcpus") 130 131 cpu = cpu_cores 132 if len(ansible_processor) > 0: 133 cpu = ansible_processor[0] + ' * ' + unicode(cpu_cores) 134 135 # 遍历 ansible_facts 字典 136 network_card = {} 137 for key,value in ansible_facts.items(): 138 if (type(value) is types.DictType) and value.has_key('promisc'): 139 network_card[key] = value 140 141 hostinfo_list.append({ 142 'ip': k, 143 'kernel': ansible_facts.get('ansible_kernel'), 144 'hostname': ansible_facts['ansible_hostname'], 145 'memory': ansible_facts.get('ansible_memtotal_mb'), 146 'cpu': cpu, 147 'sn': ansible_facts.get('ansible_product_serial'), 148 'disk': json.dumps(disk), 149 'os_name': system_type + ' ' + system_version + ' ' + ansible_facts.get('ansible_architecture'), 150 'mac': ansible_facts.get("ansible_default_ipv4").get("macaddress"), 151 'network': ansible_facts.get("ansible_default_ipv4").get("network"), 152 'gateway': ansible_facts.get("ansible_default_ipv4").get("gateway"), 153 'netmask': ansible_facts.get("ansible_default_ipv4").get("netmask"), 154 'fqdn': ansible_facts.get("ansible_fqdn"), 155 'network_card':json.dumps(network_card) 156 }) 157 return hostinfo_list
(3)将获取的数据存到数据库中,调用接口(http协议,身份验证)
1 class CMDBApi(): 2 3 token = '' 4 cmdb_url = 'http://test.cmdb.mwbyd.cn' 5 api = '/api/host/info/' 6 headers = {"Content-Type": "application/json"} 7 8 def __init__(self): 9 state, token = self.getToken() 10 if state: 11 self.headers['Authorization'] = 'Token ' + token 12 13 def getToken(self): 14 try: 15 response = requests.post(self.cmdb_url + '/api/tokenauth/' + '?format=json', 16 data=json.dumps({'username': 'cmdb', 'password': 'mwbyd,123'}), 17 headers={"Content-Type": "application/json"}) 18 if response.status_code != 200: 19 return False, 'fail!' 20 data = json.loads(response.text) 21 return True, data['token'] 22 except Exception, ex: 23 return False, str(ex) 24 25 def post(self,par): 26 try: 27 response = requests.post(self.cmdb_url + self.api + '?format=json',data=json.dumps(par),headers=self.headers) 28 if response.status_code < 200 or response.status_code >= 300: 29 return False, 'fail!' 30 data = json.loads(response.text) 31 return True, data 32 except Exception, ex: 33 return False, str(ex) 34 35 def delete(self): 36 try: 37 response = requests.delete(self.cmdb_url + self.api, headers=self.headers) 38 if response.status_code != 200: 39 return False, 'fail!' 40 data = json.loads(response.text) 41 return True, 'succ!' 42 except Exception, ex: 43 return False, str(ex)
1 if __name__ == "__main__": 2 cmdb_api = CMDBApi() 3 cmdb_api.delete() #删除旧数据 4 ip_list = getHostInfo() 5 hostinfo_list = getHostInfoByIp(ip_list) 6 for hostinfo in hostinfo_list: 7 cmdb_api.post(hostinfo)
(4)从数据库中读取数据并传入到前端,显示(前端页面的显示)