产品经理调研需求 ----》三方开会讨论(开发,产品,运维,测试) -----> 开发进行开发产品 ----> 测试流程 (黑盒和白盒测试) -----> 上线html
SVN |开发将代码压缩一下发给运维,运维拿到代码以后,而后将代码解压缩,部署到服务器上,启动服务linux
优势:流程简单web
缺点:服务器多的话,部署就很是的慢,影响上线的进度,而且是人为的部署,容易出错数据库
简单的来讲:开发一个web系统,可以选择服务器并上传代码,进行发布django
所以这个web系统须要可以随时获取服务器的基本信息,因此须要一个监控系统json
监控系统:须要监控服务器的使用信息,好比cpu使用率,磁盘大小,内存使用率(使用大于90%报警等)windows
经过上面的例子,须要作一个基石项目,提供服务器的基础信息(服务器的磁盘,cpu, 内存等),这个基石项目叫作CMDB Configure Manage DataBase 中文叫 配置管理数据库,主要用来收集服务器的基础信息api
CMDB是全部运维工具的数据基础服务器
用户管理,记录测试,开发,运维人员的用户表网络
业务线管理,须要记录业务的详情
项目管理,指定此项目用属于哪条业务线,以及项目详情
应用管理,指定此应用的开发人员,属于哪一个项目,和代码地址,部署目录,部署集群,依赖的应用,软件等信息
主机管理,包括云主机,物理机,主机属于哪一个集群,运行着哪些软件,主机管理员,链接哪些网络设备,云主机的资源池,存储等相关信息
主机变动管理,主机的一些信息变动,例如管理员,所属集群等信息更改,链接的网络变动等
网络设备管理,主要记录网络设备的详细信息,及网络设备链接的上级设备
IP管理,IP属于哪一个主机,哪一个网段, 是否被占用等
1.问:如何获取服务器的信息? 答:执行对应的linux命令 (ip:ifconfig)
2.问:如何使用Python代码来执行linux的命令? 答:subprocess模块来执行linux命令
3问:为啥requests模块的post方法发送的信息在request的post中没有收到数据,而body中有 答:django根据你http协议的头信息来判断, 若是 content-type: application/form-url-encode的话,django会将body中的数据付给post,好比表单数据。若是 content-type: application/json的话,django不会将body中的数据付给post
Agent实现方式
Agent方式,能够将服务器上面的Agent程序做定时任务,定时将资产信息提交到指定API录入数据库
服务器上部署伪代码:
import subprocess,json # 调用getoutput方法得到ip信息(windows用ipconfig,mac用ifconfig) res = subprocess.getoutput('ipconfig') print(res) # t经过正则或其余方法获取res里面的ip info = res[] print(info) # 经过requests模块,调用post方法发送到某个url import requests requests.post('http://127.0.0.1:8000/api/', data=json.dumps(info))
API上的伪代码:
from django.shortcuts import HttpResponse def asset(request): print(request.body) return HttpResponse('ok')
其本质上就是在各个服务器上执行subprocess.getoutput()
命令,而后将每台机器上执行的结果,返回给主机API,而后主机API收到这些数据以后,放入到数据库中,最终经过web界面展示给用户
优势:速度快,不须要额外的中控机 缺点:须要为每台服务器部署一个Agent程序(服务器多的状况下,好比大于1000台)
总结:整个架构方案,分红3部分, 客户端采集,API数据分析,数据展现
中控机经过Paramiko(py模块)登陆到各个服务器上,而后执行命令的方式去获取各个服务器上的信息
中控机的伪代码:
import paramiko # 建立SSH对象 ssh = paramiko.SSHClient() # 容许链接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 链接服务器 ssh.connect(hostname='10.0.0.200', port=22, username='root', password='123456') # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取命令结果 result = stdout.read() # 关闭链接 ssh.close()
优势:中控机拿到任意服务器用户密码主机信息就能登录采集信息,不须要额外的部署脚本
缺点:速度慢(服务器较少的状况下,好比少于1000台)
能够并发采集可是不能连接多台服务器
若是在服务器较少的状况下,可应用此方法
import paramiko
# 建立SSH对象
ssh = paramiko.SSHClient()
# 容许链接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 链接服务器
ssh.connect(hostname='192.xx.xx.xx', port=22, username='root', password='123')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
# 关闭链接
ssh.close()
saltstack方式
此方案本质上和第二种方案大体是差很少的流程,中控机上装salt-master,发送命令给服务器执行(服务器装slat-minion)。服务器将结果放入另外一个队列中,中控机获取将服务信息发送到API进而录入数据库。
优势:快,开发成本低 缺点:依赖于第三方 工具