Title

自动化运维基础

自动化运维

1.企业中,项目的发布流程

产品经理调研需求 ----》三方开会讨论(开发,产品,运维,测试) -----> 开发进行开发产品 ----> 测试流程 (黑盒和白盒测试) -----> 上线

2.传统的上线流程:

SVN |开发将代码压缩一下发给运维,运维拿到代码之后,然后将代码解压缩,部署到服务器上,启动服务

优点:流程简单

缺点:服务器多的话,部署就非常的慢,影响上线的进度,并且是人为的部署,容易出错

3.自动化运维的流程:

 

简单的来说:开发一个web系统,能够选择服务器并上传代码,进行发布

因此这个web系统需要能够随时获取服务器的基本信息,所以需要一个监控系统

监控系统:需要监控服务器的使用信息,比如cpu使用率,磁盘大小,内存使用率(使用大于90%报警等)

4.CMDB概念

通过上面的例子,需要做一个基石项目,提供服务器的基础信息(服务器的磁盘,cpu, 内存等),这个基石项目叫做CMDB Configure Manage DataBase 中文叫 配置管理数据库,主要用来收集服务器的基础信息

CMDB是所有运维工具的数据基础

CMDB包含的功能
  1. 用户管理,记录测试,开发,运维人员的用户表

  2. 业务线管理,需要记录业务的详情

  3. 项目管理,指定此项目用属于哪条业务线,以及项目详情

  4. 应用管理,指定此应用的开发人员,属于哪个项目,和代码地址,部署目录,部署集群,依赖的应用,软件等信息

  5. 主机管理,包括云主机,物理机,主机属于哪个集群,运行着哪些软件,主机管理员,连接哪些网络设备,云主机的资源池,存储等相关信息

  6. 主机变更管理,主机的一些信息变更,例如管理员,所属集群等信息更改,连接的网络变更等

  7. 网络设备管理,主要记录网络设备的详细信息,及网络设备连接的上级设备

  8. 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数据分析,数据展示


  • ssh实现方式 (基于Paramiko模块)

中控机通过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进而录入数据库。

优点:快,开发成本低 缺点:依赖于第三方 工具

 

 

posted @ 2020-03-26 01:21  Mr江  阅读(242)  评论(0编辑  收藏  举报