自动化运维基础

自动化运维

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

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

2.传统的上线流程:

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

优势:流程简单web

缺点:服务器多的话,部署就很是的慢,影响上线的进度,而且是人为的部署,容易出错数据库

3.自动化运维的流程:

 

简单的来讲:开发一个web系统,可以选择服务器并上传代码,进行发布django

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

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

4.CMDB概念

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

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进而录入数据库。

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

相关文章
相关标签/搜索