def info(request, host_id): auth = ZabbixRestAPI.get_auth("Admin", "zabbix") zabbix = ZabbixRestAPI(auth) # 호스트 리스트 host_result = zabbix.get_hosts(output=["hostid", "host", "name"]) if host_result.get("result"): hosts = host_result.get("result") else: hosts = host_result # 호스트 정보가 없을 경우 if '1' == host_id: return redirect("/dashboard/monitoring/" + hosts[0].get("hostid") + "/detail") # 이벤트 정보 result = zabbix.get_host_events(hostid=host_id, output="extend", sortfield=["clock", "eventid"]) if result.get("result"): events = result.get("result") else: events = result host_flag = True result_host_interfaces = zabbix.get_host_interfaces(output=["hostid", "ip", "port"]) if result_host_interfaces.get("result"): host_interfaces = result_host_interfaces["result"] for host_interface in host_interfaces: # host와 interface 매칭 if host_id == host_interface.get("hostid"): if "127.0.0.1" in host_interface.get("ip") or "localhost" in host_interface.get("ip"): host_flag = False return render(request, "monitoring/info.html", {"hostid": host_id, "hosts": hosts, "events": events, "host_flag": host_flag})
def index(request): token = request.session.get("passToken") auth_url = request.session.get("auth_url") project_id = request.session.get("project_id") auth = ZabbixRestAPI.get_auth("Admin", "zabbix") zabbix = ZabbixRestAPI(auth) if request.method == "POST" and request.is_ajax(): groupids = request.POST.get("groupids") groupname = request.POST.get("groupname") hostids = request.POST.get("hosts") if groupname or groupids: if "Template" in groupname: if groupname == "Templates": result_hosts = zabbix.get_template(output="extend") else: result_hosts = zabbix.get_template(output="extend", groupids=groupids) else: result_hosts = zabbix.get_hosts(output=["hostid", "host"], groupids=groupids) else: host_ping_list = [] for hostid in json.loads(hostids): result_item = zabbix.get_item({"hostid": hostid, "name": "Agent ping"}, output=["lastvalue"]) if result_item.get("result"): host_ping_list.append({"hostid": hostid, "ping": result_item["result"][0].get("lastvalue")}) result_hosts = {"host_ping_list": host_ping_list} return JsonResponse(result_hosts) else: """ 1. openstack - floating_ip 목록 조회 2. zabbix - host 목록 조회 floating_ip 목록 중 등록되지 않은 vm이 있으면 host 생성(floating_ip-port조회) 3. openstack - vm조회 4. zabbix - hostgroup조회 5. zabbix - host 생성 6. zabbix - hostinterface 조회 7. zabbix - application 생성 8. zabbix - item 생성 9. zabbix - trigger 생성 10. zabbix - mediatype 생성 11. zabbix - action 생성 12. zabbix - host 목록 조회 13. zabbix - hostinterface 조회 floating_ip 목록 중 등록되지 않은 vm이 없거나 생성 완료후 1. host목록, hostinterface목록, vm목록 매칭 2. host목록 반환 """ neutron = NeutronRestAPI(auth_url, token) # openstack의 floating_ip 목록 가져오기 response_data = {"hosts": [], "vm_list": []} q = {"project_id": project_id} result_floating_ips = neutron.get_floating_ips(None, q) create_host_flag = False # host목록 가져오기 result_hosts = zabbix.get_hosts(output=["hostid", "host", "status", "name"]) if result_hosts.get("result") and result_floating_ips.get("success"): floating_ips = result_floating_ips["success"].get("floatingips") # 중요1 hosts = result_hosts.get("result") # floating_ips 목록이 Zabbix에 전부 등록되있는지 확인 # TODO: javascript에서 서버 상태(ICMP Ping)를 실시간으로 변경 recovery_list = [] # 중요3 for floating_ip in floating_ips: if floating_ip.get("port_id"): # floatingip - port 조회 result_port = neutron.getPort(floating_ip["port_id"]) if result_port.get("success"): port = result_port["success"].get("port") floating_ip["port_details"] = port server_id = port.get("device_id") host_names = [temp_host.get("host") for temp_host in hosts] # 각 가상머신의 호스트가 등록되있지 않다면 등록 if server_id and "compute" in port.get("device_owner") and server_id not in host_names: # floatingip - port - device(서버) 조회 recovery_info = { "server": { "vm_id": server_id, "floating_ip_id": floating_ip.get("id"), "floating_ip_address": floating_ip.get("floating_ip_address") }, "auth_url": auth_url, "project_name": request.session.get("project_name") } recovery_list.append(recovery_info) # host의 interface 목록 가져오기 result_host_interfaces = zabbix.get_host_interfaces(output=["hostid", "ip", "port"]) if result_host_interfaces.get("result"): host_interfaces = result_host_interfaces["result"] for host in hosts: for host_interface in host_interfaces: # host와 interface 매칭 if host.get("hostid") == host_interface.get("hostid"): host["interface"] = host_interface # host중 interface의 ip가 127.0.0.1이거나 localhost인 경우 if "127.0.0.1" in host_interface.get("ip") or "localhost" in host_interface.get("ip"): for floating_ip in floating_ips: # floating_ip의 device_id와 host의 host(hostname)이 같을때만 리스트에 담아 보여주기 if floating_ip.get("port_details"): result_item = zabbix.get_item({"hostid": host.get("hostid"), "name": "ICMP ping"}) if result_item.get("result"): item = result_item["result"][0] if host.get("host") == floating_ip["port_details"]["device_id"]: host["floatingip_info"] = floating_ip host["ping"] = item.get("lastvalue") response_data["vm_list"].append(host) # logger.debug("\n\n\n\nfloating_ip: {}\nctrl_header: {}\n\n\n\n".format(floating_ip, request.session.get("ctrl_header"))) else: check_recovered_vm_host(zabbix, host, item, floating_ip) elif "admin" in request.session["roles"]: result_item = zabbix.get_item({"hostid": host.get("hostid"), "name": "Agent ping"}) if result_item.get("result"): host["ping"] = result_item["result"][0].get("lastvalue") response_data["hosts"].append(host) if len(recovery_list) > 0: response_data["synchronize_flag"] = False else: response_data["synchronize_flag"] = True else: response_data["error"] = {} if result_floating_ips.get("error"): response_data["error"]["openstack"] = result_floating_ips["error"] if not result_hosts.get("result"): response_data["error"]["zabbix"] = result_hosts return render(request, "monitoring/index.html", response_data)