序读项目由来

终极目标,运维平台。自动化。装机,监控,安装软件,部署
基础服务,资产管理,之前是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. vue.js 源代码学习笔记 ----- instance event

    /* @flow */ import { updateListeners } from '../vdom/helpers/index' import { toArray, tip, hyphenate ...

  2. js函数的伪重载

    这也是今天写东西是遇到的一个问题,导致我联想起了函数重载的问题. 在javascript中是没有函数重载机制的,对于用惯了java开发的同学可能就表示吃惊了,我屮艸芔茻,函数 没有重载?那怎么搞?!! ...

  3. SpringMVC札集(04)——SpringMVC传递参数

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  4. 跟着小程学微服务-Mock自动化系统的原理及实现

    一.前言 在之前的文章 http://blog.csdn.net/u013970991/article/details/54862772 中已经介绍了"自动化Mock系统0.9版本" ...

  5. 老男孩Linux运维期中架构

  6. 06----fiter

    步骤一:渲染标签 双层for循环---- 步骤二:进行数据过滤 fiter_name=java 知识点: """ 改为生成器方式: def foo(): temp=[] ...

  7. C# 速编神器LinqPad(新版5.25)

    点此下载5.25 (支持.net4.6,有调试器)(页面有广告,一直点免费下载即可)(可用)密码  lp123456  批处理如下. @echo off start /b LINQPad.exe -n ...

  8. BZOJ5194: [Usaco2018 Feb]Snow Boots(排序&set)(可线段树优化)

    5194: [Usaco2018 Feb]Snow Boots Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 102  Solved: 79[Subm ...

  9. 每天一个linux命令:【转载】more命令

    more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...

  10. BZOJ1510 POI2006 Kra-The Disks 【模拟】

    BZOJ1510 POI2006 Kra-The Disks LINK 还是粘题面吧,但是图就算了 Description Johnny 在生日时收到了一件特殊的礼物,这件礼物由一个奇形怪状的管子和一 ...