CMDB学习之五服务端api
服务端api 对发送来的数据进行处理,并返回结果,首先要创建一个Django项目
第一步,就是写URL路由在分支中写url
api 主路由
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^api/', include('api.urls')),
api路由
from django.conf.urls import url from api import views urlpatterns = [ url(r'^asset',views.asset), ]
试图views,试图函数 ,这里我使用 的csrf的忽略校验 和 接收的是PSOT请求,josn 反序列化
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render,HttpResponse,redirect,reverse from django.views.decorators.csrf import csrf_exempt import json # Create your views here. @csrf_exempt def asset(request): print(request.body) #原始数据 print(request.POST) #url编码的格式 "hostname=c1.com&memory=...." ret =json.loads(request.body.decode('utf-8')) print(ret) return HttpResponse("接受成功")
客户端测试 脚本
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json def agent(): ''' :return: ''' import subprocess disk = subprocess.getoutput('dir') info = {'hostname':'127.0.0.1','cpu':"cpu..",'meorey':'内存','disk':disk} r1= requests.post( url='http://127.0.0.1:8000/api/asset', data=json.dumps(info) ) print(r1) print(r1.text) agent()
服务端接受数据打印成功
客户端接收成功
#####################错误信息 traceback.format_exc 错误堆栈信息
#!/usr/bin/env python # -*- coding:utf-8 -*- import traceback def f1(): int('asd') return 123 def run(): try: ret = f1() print(ret) except Exception as e: # print(e) ret = traceback.format_exc() print(ret, type(ret)) run()
单进程执行数据采集函数实例:
def ssh(): r1= requests.get(url='http://127.0.0.1:8000/api/asset') # print(r1.text,type(r1.text)) #返回str 类型 # print(r1.json(),type(r1.json())) #直接反序列化 # print(r1.content,type(r1.content)) #返回bytes 类型 host_list = r1.json() for host in host_list: #连接每一台服务器远程执行(ssh ,salt)执行命令拿到资产信息 info = { 'hostname':host, 'disk':'diskinfo', 'cpu':'cpuinfo', 'memory':'memoryinfo' } r1 = requests.post( url='http://127.0.0.1:8000/api/asset', data=json.dumps(info) ) print(r1) ssh()
多线程数据采集实现
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json def agent(): ''' :return: ''' import subprocess disk = subprocess.getoutput('dir') info = {'hostname':'127.0.0.1','cpu':"cpu..",'meorey':'内存','disk':disk} r1= requests.post( url='http://127.0.0.1:8000/api/asset', data=json.dumps(info) ) print(r1) print(r1.text) def task(host): #创建任务 # 连接每一台服务器远程执行(ssh ,salt)执行命令拿到资产信息 info = { 'hostname': host, 'disk': 'diskinfo', 'cpu': 'cpuinfo', 'memory': 'memoryinfo' } r1 = requests.post( url='http://127.0.0.1:8000/api/asset', data=json.dumps(info) ) print(r1) def ssh(): r1= requests.get(url='http://127.0.0.1:8000/api/asset') # print(r1.text,type(r1.text)) #返回str 类型 # print(r1.json(),type(r1.json())) #直接反序列化 # print(r1.content,type(r1.content)) #返回bytes 类型 host_list = r1.json() from concurrent.futures import ThreadPoolExecutor pool = ThreadPoolExecutor(10) for host in host_list: #连接每一台服务器远程执行(ssh ,salt)执行命令拿到资产信息 pool.submit(task,host) ssh()
总结:auto_client
agnet模式:
1、采集资产信息
2、使用requests模块发POST请求提交的资产信息
ssh模式:
1、获取未采集的主机列表
2、远程连接(ssh)上指定的主机,执行命令采集资产信息
3、使用requests模块发POST请求提交的资产信息
salt模式:
1、获取未采集的主机列表
2、远程连接(salt)上指定的主机,执行命令采集资产信息
3、使用requests模块发POST请求提交的资产信息