zoukankan      html  css  js  c++  java
  • 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请求提交的资产信息

  • 相关阅读:
    设计模式与23种设计模式的简单介绍
    一文读懂C++ Vector在算法竞赛中的常见用法
    一文读懂C++ String类在算法竞赛中的常见用法
    GO语言的单元测试与性能测试
    变量提升和函数提升及二者优先级
    闭包
    读《你不知道的JavaScript 中》-异步【3】Promise
    js数组方法-改变原数组和不改变原数组
    读《你不知道的JavaScript 中》-异步【2】回调
    组合类算法问题
  • 原文地址:https://www.cnblogs.com/michael2018/p/10422481.html
Copyright © 2011-2022 走看看