序读项目由来

终极目标,运维平台。自动化。装机,监控,安装软件,部署
基础服务,资产管理,之前是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. igmpproxy源代码学习——配置信息加载 loadConfig

            在igmpproxy主程序运行之前需要先读取配置文件,igmpproxy的配置文件通常为/etc/igmpproxy.conf或者/var/igmpproxy.conf 其内容如下: ...

  2. C语言编程的两个工具:valgrind和core

    检查内存泄漏: valgrind --leak-check=full ./ecox_rws_helper 来检查内存泄漏 程序崩溃看错误: ulimit -c unlimited 然后执行程序,会在当 ...

  3. jq的.off解绑事件

    .off( events [, selector ] [, handler ] ) 描述:移除一个事件处理函数 events 类型: String 一个或多个空格分隔的事件类型和可选的命名空间,或仅仅 ...

  4. 理解Scala中的Extractor

    引言 最近抱着<Programming in Scala>(英文第二版)在死啃Scala.在阅读第26章Extractor时,偶然在Stack Overflow上搜到一个帖子<Sca ...

  5. Swift GCD

    var queue: dispatch_queue_t = dispatch_get_main_queue()// 主线程 queue = dispatch_get_global_queue(DISP ...

  6. PyQt: “AttributeError: 'Form' object has no attribute 'exec_'” when opening second window

    # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication , QMainWindow from PyQt5 ...

  7. Git详解之五 分布式Git

    以下内容转载自:http://www.open-open.com/lib/view/open1328070090108.html 分布式 Git 为了便于项目中的所有开发者分享代码,我们准备好了一台服 ...

  8. Android学习问题记录之open failed EACCES (Permission denied)

    1.问题描述 Android调用相机拍照保存,然后读取保存好的照片,在读取照片时出现异常(该异常是因为没有SD卡的读取权限所致): 11-08 11:07:46.421 8539-8539/com.c ...

  9. HDU4035 Maze(师傅逃亡系列•二)(循环型 经典的数学期望)

    When wake up, lxhgww find himself in a huge maze. The maze consisted by N rooms and tunnels connecti ...

  10. Python Tkinter 学习历程 一

    一丶一个简单的程序 from tkinter import * #引入所有类#查看tk版本#tkinter._test() root = Tk(); #对这个类进行实例化 w1 = Label(roo ...