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请求提交的资产信息

原文地址:https://www.cnblogs.com/michael2018/p/10422481.html