CMDB学习之六 --客户端请求测试,服务端api优化
客户端使用agent 请求测试,agent使用的POST 请求,使用requests模块
本地采集,汇报服务端
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from .base import BaseHandler
from ..plugins import get_server_info
import requests
import json class AgnetHandler(BaseHandler): def cmd(self,command,hostname=None):
import subprocess
return subprocess.getoutput(command) def handler(self):
"""
Agent模式下处理资产采集:硬盘、内存、网卡
:return:
"""
print('agent模式')
#调用pulugins.disk /plugins.momory /plugins.nerwork
info = get_server_info(self)
# print(info)
r1 = requests.post(
url='http://127.0.0.1:8000/api/asset',
data=json.dumps(info)
)
print(r1)
salt 和ssh请求 首先要获取服务端 ,没有采集的主机列表,然后根据主机列表进行采集。
1. get请求获取主机列表
2、发起远程采集数据,汇报服务器
两方法都有 采集都发起远程和汇报服务器的功能,所有在基类实现方法,然后 方法继承基类 SSHhandSaltHandler
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from ..plugins import get_server_info
import json
import requests class BaseHandler(object): def cmd(self,command,hostname=None):
'''
约束派生类
:return:
'''
raise NotImplementedError('cmd() must Implemented.') def handler(self):
'''
约束派生类
:return:
'''
raise NotImplementedError('handler() must Implemented.') class SSHhandSaltHandler(BaseHandler):
def handler(self):
"""
Salt模式下处理资产采集
:return:
"""
print('salt模式或者ssh模式')
r1 = requests.get(url='http://127.0.0.1:8000/api/asset')
host_list = r1.json()
print(host_list)
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(10)
for host in host_list:
pool.submit(self.task, host) def task(self, hostname):
# 资产采集并且汇报
info = get_server_info(self)
# print(info)
r1 = requests.post(
url='http://127.0.0.1:8000/api/asset',
data=json.dumps(info)
)
print(r1)
print(r1.text)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from .base import SSHhandSaltHandler class SaltHandler(SSHhandSaltHandler): def cmd(self, command, hostname=None):
"""
调用saltstack远程连接主机并执行命令(saltstack的master)
:param hostname:主机名
:param command: 要执行的命令
:return:
"""
import salt.client #安装salt
local = salt.client.LocalClient()
result = local.cmd(hostname, 'cmd.run', [command])
return result[hostname]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from .base import SSHhandSaltHandler
from config import settings class SSHHandler(SSHhandSaltHandler): def cmd(self, command, hostname=None):
"""
调用paramiko远程连接主机并执行命令,依赖rsa
:param hostname:主机名
:param command: 要执行的命令
:return:
"""
import paramiko private_key = paramiko.RSAKey.from_private_key_file(settings.SSH_PRIVATE_KEY)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, port=settings.SSH_PORT, username=settings.SSH_USER, pkey=private_key)
stdin, stdout, stderr = ssh.exec_command(command)
result = stdout.read()
ssh.close()
return result
##################下面是django服务端#######################

下面使用多种方式的api
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):
if request.method == 'GET':
host_list = ['c1.com','c2.com']
return HttpResponse(json.dumps(host_list)) #序列化 # print(request.body) #原始数据
# print(request.POST) #url编码的格式 "hostname=c1.com&memory=...."
ret =json.loads(request.body.decode('utf-8'))
print(ret)
return HttpResponse("接受成功") # CBV加装饰器,忽略csrf验证
# from django.utils.decorators import method_decorator
# from django.views import View
# # @method_decorator(csrf_exempt,name='dispatch') #这个装饰器比较特殊不能直接加到类中的方法,方法一
# class Asset(View):
#
# # 这个装饰器比较特殊不能直接加到类中的方法,方法二
# @method_decorator(csrf_exempt)
# def dispatch(self,request,*args,**kwargs):
# return super().dispatch(request,*args,**kwargs)
#
# def get(self,request):
# host_list = ['c1.com', 'c2.com']
# return HttpResponse(json.dumps(host_list)) # 序列化
#
# def post(self,request):
# ret = json.loads(request.body.decode('utf-8'))
# print(ret)
# return HttpResponse("接受成功") #使用rest_framework ,首先要安装pip去安装Djangorestframework ,这个模块
# 在Django的settings中注册app
from rest_framework.views import APIView
from rest_framework.response import Response class Asset(APIView): def get(self,request):
host_list = ['c1.com', 'c2.com']
return Response(host_list) def post(self,request):
ret = json.loads(request.body.decode('utf-8'))
print(ret)
return HttpResponse("接受成功")
Django提供的 rest_framework 需要安装模块导入使用,方便简洁,rest_framework是一个独立的app,所以在Django配置文件中注册

页面结果;

CMDB学习之六 --客户端请求测试,服务端api优化的更多相关文章
- Socket(TCP)客户端请求和服务端监听和链接基础(附例子)
一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...
- ajax客户端请求与服务端响应浅谈
AJAX,即Asynchronous Javascript And XML,AJAX本质是在HTTP协议的基础上以异步的方式与服务器进行通信. 所谓的异步,是指某段程序执行不会阻塞其他程序执行,其表现 ...
- JSP基础知识➣客户端请求与服务端响应(三)
JSP客户端请求 浏览器请求服务器端,信息头的一些重要内容,在以后的网络编程中将会经常见到这些信息: Accept:指定浏览器或其他客户端可以处理的MIME类型.它的值通常为 image/png 或 ...
- C#开发BIMFACE系列15 服务端API之获取模型的View token
系列目录 [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken>中详细介绍了应用程序访问API的令牌凭证.我 ...
- python服务器端、客户端的模型,客服端发送请求,服务端进行响应(web.py)
服务器端.客户端的模型,客服端发送的请求,服务端的响应 相当于启动了一个web server install web.py 接口框架用到的包 http://webpy.org/tutorial3.zh ...
- CMDB学习之五服务端api
服务端api 对发送来的数据进行处理,并返回结果,首先要创建一个Django项目 第一步,就是写URL路由在分支中写url api 主路由 from django.conf.urls import u ...
- Netty 学习(一):服务端启动 & 客户端启动
Netty 学习(一):服务端启动 & 客户端启动 作者: Grey 原文地址: 博客园:Netty 学习(一):服务端启动 & 客户端启动 CSDN:Netty 学习(一):服务端启 ...
- Netty 学习(二):服务端与客户端通信
Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...
- Identity4实现服务端+api资源控制+客户端请求
准备写一些关于Identity4相关的东西,最近也比较对这方面感兴趣.所有做个开篇笔记记录一下,以便督促自己下一个技术方案方向 已经写好的入门级别Identity4的服务+api资源访问控制和简单的客 ...
随机推荐
- Activity-数据状态的保存
由于手机是便捷式移动设备,掌握在用户的手中,它的展示方向我们是无法预知的,具有不确定性.平时我们拿着手机多数为竖屏,但有时候我们感觉累了也会躺着去使用手机,那么这时手机屏幕的展示方向可能已经被用户切换 ...
- 分库分表中间件Sharding-JDBC
数据库分库分表从互联网时代开启至今,一直是热门话题.在NoSQL横行的今天,关系型数据库凭借其稳定.查询灵活.兼容等特性,仍被大多数公司作为首选数据库.因此,合理采用分库分表技术应对海量数据和高并发对 ...
- hiho 1572 - set.upper_bound,排序树
链接 小Hi家的阳台上摆着一排N个空花盆,编号1~N.从第一天开始,小Hi每天会选择其中一个还空着花盆,栽种一株月季花,直到N个花盆都栽种满月季. 我们知道小Hi每天选择的花盆的编号依次是A1, A2 ...
- oracle动态磁盘管理
一.ASM发展: oracle 想做硬件: 收购sum公司的小型机业务 推出一体机Exadata 1.sum服务器 2.磁盘柜(没做存储) 推出asm建库方式配合一体机(自动使用磁盘柜的盘)(抛弃ra ...
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...
- SpringBoot实战(三)代码热部署
每次代码改动后都需要重新手动Run项目,心累,在网上找了下,发现SpringBoot提供了热部署的方案,改动代码后自动编译打包,现在将热部署的配置方法记下来: 第一步:在pom.xml中添加依赖,导入 ...
- 普通码农和CTO之间的差距
虚心 学习的第一步是--"我不懂".一个空是水杯才能装水,如果是满的就没有办法装水了."自我肯定"是一种非常难克服的习惯,经常会有朋友看到某个技术或者实现之后不 ...
- Raw-OS源代码分析之任务删除与总结
分析的内核版本号截止到2014-04-15,基于1.05正式版,blogs会及时跟进最新版本号的内核开发进度,若源代码凝视出现"???"字样,则是未深究理解部分. Raw-OS官方 ...
- BP神经网络模型及梯度下降法
BP(Back Propagation)网络是1985年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一. B ...
- Pycharm-连接服务器