序读项目由来

终极目标,运维平台。自动化。装机,监控,安装软件,部署
基础服务,资产管理,之前是excel,现在是客户端自动获取,变更记录

后台管理 api 采集资产

四种模式
agent 定时,每天执行一次,采集的资产回报给api,api负责入库
ssh,需要中控机,不用部署agent,去api拿没有采集的主机,远程通过paramiko执行命令拿到数据回报给api
salt,利用salt内部原理rbc,列队形式执行命令
pupet,利用报表,每半个小时向master回报,我们利用报表执行自己的ruby脚本,资产拿到回报给api

一 四种模式

api 其他系统调用数据,不能让人直接用数据库。还可以提交数据,做统一化的管理。

agent客户端有自定义的脚本,通过任务计划每天采集信息给api

ssh 通过api 链接 数据库,查看谁没有给我信息,那我拿到主机名,我链接上去,执行命令,取返回值在给api

slat rpc模式。 内部提供队列,zero mq

30分钟自动链接,提供信息给中间,中间代码会整理这个信息

二 各个模式代码

import subprocess
import requests ### pip3 install request ################### 采集数据 ################## result = subprocess.getoutput('ifconfig')
print(result) # 正则处理获取的数据 ################## 整理资产信息 ###################
date_dict = {
'nic':{},
'disk':{},
'mem':{}
} ################### 发送数据 ##################
requests.post('http://www.127.0.0.1:8000/assets.html',data=date_dict)

Agent客户端模式

# 基于 paramiko 模块
# pip3 install paramiko import requests
import paramiko ################### 获取未采集主机名 ################## # result = requests.get('http://www.127.0.0.1:8000/assets.html')
con = ['c1.com','c2.com'] # 未收集到的主机名称 ################### 通过paramiko链接远程服务器,执行命令 ##################
# 创建SSH对象
ssh = paramiko.SSHClient() # 允许链接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 链接服务器
ssh.connect(hostname='c1.com',port=22,username='joker',password='') # 执行命令
stdin,stdout,stderr = ssh.exec_command('ifconfig') # 获取结果
result = stdout.read() # 关闭链接
ssh.close()
print(result) ################## 整理资产信息 ###################
date_dict = {result} ################### 发送数据 ##################
requests.post('http://www.127.0.0.1:8000/assets.html',data=date_dict)

paramiko的SSH模式

# 安装saltstack    http://www.cnblogs.com/wupeiqi/articles/6415436.html
# linux 上 rpm --import https://repo.saltstack.com/yum
# Master : yum install salt-master 服务器端
# Slave : yum install salt-minion 客户端 # Master准备
# a . 配置文件,监听本机ip
# vim /etc/salt/master
# interface 本机ip地址 # b. 启动master
# /etc/init.d/salt-master start # Slave准备
# a . 配置文件,链接哪个master
# vim /etc/salt/minion
# master : 远程master地址 # b . 启动slave
# /etc/init.d/salt-minion start # 1. 配置 好了 之后创建关系
# Master :
# 查看
# Master: salt-key -L 第一次执行命令的时候
# Accepted Keys:
# Denied Keys: 拒绝
# Unaccepted Keys: 未接受
# c1.com
# c2.com
# c3.com
# Rejected Keys: 拒绝 # 2. 接受
# Master: salt-key -a c1.com -a 后面可以正则匹配 # 在查看
# Master: salt-key -L
# Accepted Keys:
# c1.com
# Denied Keys:
# Unaccepted Keys:
# c2.com
# c3.com
# Rejected Keys: # 3. 执行命令
# 通过py 文件执行命令
# from salt import client
# local = salt.client.LocalClient()
# resutl = local.cmd('bogon','cmd.run',['ifconfig'])
# resutl.keys()
# ['bogon']
# resutl.values()
# ifconfig 的结果 # 通过 传输命令执行
# master:
# salt 'c1.com' cmd.run 'ifconfig'

saltstack简单用法

###################   获取未采集主机名  ##################

# result = requests.get('http://www.127.0.0.1:8000/assets.html')
con = ['c1.com','c2.com'] # 未收集到的主机名称 ################### 远程服务器执行命令 ##################
# 2种方式
import subprocess
result = subprocess.getoutput("salt 'c1.com' cmd.run 'ifconfig'") import salt.client
local = salt.client.LocalClient()
resutl = local.cmd('c1.com','cmd.run',['ifconfig']) ################## 整理资产信息 ###################
date_dict = {result} ################### 发送数据 ##################
requests.post('http://www.127.0.0.1:8000/assets.html',data=date_dict)

saltstack模式

三 面向对象的继承

四 代码

流程

# agent 形式
# 1. 采集资产
# 2. 将资产数据发送到api(post 表示要创建资产) # ssh形式
# 1. 获取今日未采集主机列表
# 2. 采集资产
# 3. 将资产数据发送到api(post 表示要创建资产) # salt形式
# 1. 获取今日未采集主机列表
# 2. 采集资产
# 3. 将资产数据发送到api(post 表示要创建资产) # agent 自己取内容,拿标识往后台发 需要维护一个主机名文件 才知道给谁发
# 其他模式不需要,因为他先要获取主机名

三种模式获取资产比较

# 文件结构
# bin 可执行文件 src 业务逻辑,采集资产信息 lib 公共功能 conf 配置文件 bin 可执行文件

1. 资产信息的插件的封装

# 采集资产: 三种不同的形式,而形式都在test里面

from day73.conf import settings

class BasePlugin(object):

    def __init__(self):
mode_lsit = ['SSH','Salt','Agent'] # 配置文件里面的模式在这个列表里,执行命令
if settings.MODE in mode_lsit:
self.mode = settings.MODE
else:
raise Exception('配置文件错误') def ssh(self,cmd): # paramiko
pass def agent(self,cmd):
pass def salt(self,cmd):
pass def shell_cmd(self,cmd): # 获取 SETTINGS 里面的 模式
if self.mode == 'SSH':
ret = self.ssh(cmd)
elif self.mode == 'Salt':
ret =self.salt(cmd)
else:
ret = self.agent(cmd)
return ret def execute(self): # self 是 DiskPlugin 的对象 obj # 执行判断平台的命令 # agent 模式,代码放在远程的服务器上
# import subprocess
# subprocess.getoutput('') # ssh 模式,paramiko模块远程链接上执行命令 # saltstack 模式,调用salt接口执行命令 ret = self.shell_cmd('查看平台命令') # 不需要做判断 模式了,在内部判断了哪种模式
if ret == 'win':
return self.windows()
elif ret == 'linux':
return self.linux()
else:
raise Exception('只支持windows和Linux') def linux(self):
raise Exception('....') def windows(self):
raise Exception('....') class DiskPlugin(BasePlugin): # 硬盘 def linux(self):
output = self.shell_cmd('fdisk -l')
# 正则表达式,取该取的内容返回
return output def windows(self):
output = self.shell_cmd('xxx')
return output class MemPlugin(BasePlugin): # 内存 def linux(self):
output = self.shell_cmd('free')
return output def windows(self):
output = self.shell_cmd('xxx')
return output obj = BasePlugin()
obj.execute() # 就会执行命令,会自动分辨是哪个平台

采集资产

用到的知识点:
面向对象的继承
 2. 数据打包
将,内存,硬盘,网卡等信息打包在一起
# 将数据打包返回

# from .plugins.disk import DiskPlugin    导入 采集对象类
# from .plugins.mem import MemPlugin
# from .plugins.nic import NicPlugin from day73.conf import settings
def pack():
# 如果需要其他信息,就需要更改源码,这是我们不想看到的
# obj1 = DiskPlugin()
# disk_info = obj1.execute()
#
# obj2 = MemPlugin()
# mem_info = obj2.execute()
#
# obj3 = NicPlugin()
# nic_info = obj3.execute()
#
# response = {
# 'nic':nic_info,
# 'mem':mem_info,
# 'disk':disk_info
# } # 通过配置文件解决 response = {}
'''
settings.PLUGINS
PLUGINS = {
'disk':'src.plugins.disk.DiskPlugin',
'men':'src.plugins.mem.MemPlugin',
'nic':'src.plugins.nic.NickPlugin',
}
''' '''
# from 导入模块
from day73.src.plugins import disk
content = disk.DiskPlugin().execute() # 实例化 并且 执行 方法,返回内容 # 字符串的导入模块
import importlib
M = importlib.import_module('PY文件路径') # py 文件
M = importlib.import_module('src.plugins.disk') # py 文件
cls = getattr(M, 'DiskPlugin') # 反射
content = cls.DiskPlugin().execute() # 实例化 并且 执行 方法,返回内容
''' for k,v in settings.PLUGINS.items():
import importlib
m_path,classname = v.rsplit('.',maxsplit=1) # 从右边第一个点进行分割
M = importlib.import_module(m_path) # py 文件
cls = getattr(M, classname) # 是否有这个类
# 'disk':'src.plugins.disk.DiskPlugin',
# v 是字符串,所以要用反射
response[k] = cls().execute() # v().execute() 执行命令后的结果,参考.execute流程 return response

数据打包pack

用到的知识点:
# 字符串的导入模块
import importlib
M = importlib.import_module('PY文件路径') # py 文件
M = importlib.import_module('src.plugins.disk') # py 文件
cls = getattr(M, 'DiskPlugin') # 反射
content = cls.DiskPlugin().execute() # 实例化 并且 执行 方法,返回内容

字符串导入模块

3. bin目录启动文件导入

# package.PY文件在SRC目录下导入
# from day73.src import package
# data_dict = package.pack() # 将package.PY文件的代码放入到SRC里面的__init__文件中,然后导入包
# 导入包,文件夹,默认就会加载文件夹下的__INIT__文件
from day73.src import plugins
data_dict = plugins.pack() # 相当于将PACK放到了plugins里面了,就可以调用了

导入文件,模块,导入包,目录

4. 代码流程

 代码流程进阶 AutoClient    上面流程的三四步骤,如下的获取资产信息步骤

运维平台cmdb开发-day1的更多相关文章

  1. 运维平台cmdb开发-day3

    后台管理 1. 访问过程 我们在前面2天得到了各个客户端的资产数据信息,我们将各个这个数据打包发送到api,这个api其实就是django的url传参,之后按照数据的格式对比数据库增删改 2. 后台页 ...

  2. 运维平台cmdb开发-day2

    一 发送数据到api(Django的URL) 发送请求携带参数 requests.get(url='http://127.0.0.1:8000/api/asset/?k1=123') # <Qu ...

  3. #研发解决方案#iDB-数据库自动化运维平台

    郑昀 创建于2015/12/2 最后更新于2015/12/2 关键词:数据库,MySQL,自动化运维,AutoDDL,刷库,帐号授权,审核,回滚 提纲: 数据库自动化运维什么?别人家是怎么玩的? 我们 ...

  4. 《开源安全运维平台:OSSIM最佳实践》内容简介

    <开源安全运维平台:OSSIM最佳实践 > 李晨光 著 清华大学出版社出版 内 容 简 介在传统的异构网络环境中,运维人员往往利用各种复杂的监管工具来管理网络,由于缺乏一种集成安全运维平台 ...

  5. 《开源安全运维平台OSSIM最佳实践》

    <开源安全运维平台OSSIM最佳实践> 经多年潜心研究开源技术,历时三年创作的<开源安全运维平台OSSIM最佳实践>一书即将出版.该书用80多万字记录了,作者10多年的IT行业 ...

  6. saltstack---自动化运维平台

    https://github.com/ixrjog/adminset[自动化运维平台:CMDB.CD.DevOps.资产管理.任务编排.持续交付.系统监控.运维管理.配置管理 ] https://ww ...

  7. sso 自动化运维平台

    单点登录SSO(Single Sign-On)是身份管理中的一部分.本文中作者开发了一个自动化运维平台中的统一认证接口,单点登录平台通过提供统一的认证平台,实现单点登录.因此,应用系统并不需要开发用户 ...

  8. python自动化运维之CMDB篇-大米哥

    python自动化运维之CMDB篇 视频地址:复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1Oj_sglTi2P1CMjfMkYKwCQ  ...

  9. 运维平台之CMDB系统建设

    CMDB是运维的基础核心系统,所有的元数据和共享数据管理源,类似于业务中的账号平台的作用.本篇文章,我将从概念篇.模型篇.到实现与实施篇具体的进行阐述. CMDB也称配置管理,配置管理一直被认为是 I ...

随机推荐

  1. L146 Space Station Hole Cause Will Be Determined

    The head of the U.S. space agency said Tuesday he's sure that investigators will determine the cause ...

  2. fedora 修改home下的中文目录为英文目录

    <h4>修改home下的中文目录为英文目录</h4>习 惯问题,喜欢使用fedora为您在home目录下自创建的“桌面”.“文档”,“图片 .公共的” .“下载”. “音乐”. ...

  3. maven搭建ssm框架问题总结

    1. Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.0:compile (default-comp ...

  4. qt creator在Qt5中中文显示的问题

    当我们用Qt Creater时,经常出会出现如下问题: 处理方法如下:用记事本打开你的源代码,然后点另存为,utf-8,编码覆盖,这时中文就没问题了但是会乱码.在字符串前加个宏QStringLiter ...

  5. python学习-序列排序

    python的排序中,可以使用内置的sort()来对序列进行排序,也可以使用内置的sorted()函数对序列进行排序,区别是,当使用sort()时,是对原序列进行排序,而sorted()则是生成一个新 ...

  6. pat 乙级 1093 字符串A+B (20 分)

    给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集.要求先输出 A,再输出 B,但重复的字符必须被剔除. 输入格式: 输入在两行中分别给出 A 和 B,均为长度不超过 1的.由可见 ...

  7. 《DSP using MATLAB》示例Example 8.24

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  8. 学习Selenium同学必看

    本文转载 作者:灰蓝蓝蓝蓝蓝蓝链接:http://www.jianshu.com/p/5188cb3ab790來源:简书著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.更多技术博客 ...

  9. 超详细的celery异步任务和定时任务的教程

    转载自:https://segmentfault.com/a/1190000007780963

  10. linux网络设备理解

    网络层次 linux网络设备驱动与字符设备和块设备有很大的不同. 1. 字符设备和块设备对应/dev下的一个设备文件.而网络设备不存在这样的设备文件.网络设备使用套接字socket访问,虽然也使用re ...