自动化运维基础
自动化运维
1.企业中,项目的发布流程
产品经理调研需求 ----》三方开会讨论(开发,产品,运维,测试) -----> 开发进行开发产品 ----> 测试流程 (黑盒和白盒测试) -----> 上线
2.传统的上线流程:
SVN |开发将代码压缩一下发给运维,运维拿到代码之后,然后将代码解压缩,部署到服务器上,启动服务
优点:流程简单
缺点:服务器多的话,部署就非常的慢,影响上线的进度,并且是人为的部署,容易出错
3.自动化运维的流程:
简单的来说:开发一个web系统,能够选择服务器并上传代码,进行发布
因此这个web系统需要能够随时获取服务器的基本信息,所以需要一个监控系统
监控系统:需要监控服务器的使用信息,比如cpu使用率,磁盘大小,内存使用率(使用大于90%报警等)
4.CMDB概念
通过上面的例子,需要做一个基石项目,提供服务器的基础信息(服务器的磁盘,cpu, 内存等),这个基石项目叫做CMDB Configure Manage DataBase 中文叫 配置管理数据库,主要用来收集服务器的基础信息
CMDB是所有运维工具的数据基础
CMDB包含的功能
-
用户管理,记录测试,开发,运维人员的用户表
-
业务线管理,需要记录业务的详情
-
项目管理,指定此项目用属于哪条业务线,以及项目详情
-
应用管理,指定此应用的开发人员,属于哪个项目,和代码地址,部署目录,部署集群,依赖的应用,软件等信息
-
主机管理,包括云主机,物理机,主机属于哪个集群,运行着哪些软件,主机管理员,连接哪些网络设备,云主机的资源池,存储等相关信息
-
主机变更管理,主机的一些信息变更,例如管理员,所属集群等信息更改,连接的网络变更等
-
网络设备管理,主要记录网络设备的详细信息,及网络设备连接的上级设备
-
IP管理,IP属于哪个主机,哪个网段, 是否被占用等
5.架构图方案
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
CMDB实现的四种方式
-
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进而录入数据库。
优点:快,开发成本低 缺点:依赖于第三方 工具