当前位置: 首页 > news >正文

pythoncmdb_Python-CMDB开发

运维自动化路线:

cmdb的开发需要包含三部分功能:

采集硬件数据

API

页面管理

执行流程:服务器的客户端采集硬件数据,然后将硬件信息发送到API,API负责将获取到的数据保存到数据库中,后台管理程序负责对服务器信息的配置和展示。

采集硬件信息

采集硬件信息可以有两种方式实现:

利用puppet中的report功能

自己写agent,定时执行

两种方式的优缺点各异:方式一,优点是不需要在每台服务器上步一个agent,缺点是依赖于puppet,并且使用ruby开发;方式二,优点是用于python调用shell命令,学习成本低,缺点是需要在每台服务器上发一个agent。

方式一

默认情况下,puppet的client会在每半个小时连接puppet的master来同步数据,如果定义了report,那么在每次client和master同步数据时,会执行report的process函数,在该函数中定义一些逻辑,获取每台服务器信息并将信息发送给API

puppet中默认自带了5个report,放置在【/usr/lib/ruby/site_ruby/1.8/puppet/reports/】路径下。如果需要执行某个report,那么就在puppet的master的配置文件中做如下配置:

on master

on client

如上述设置之后,每次执行client和master同步,就会在master服务器的 【/var/lib/puppet/reports】路径下创建一个文件,主动执行:puppet agent  --test

所以,我们可以创建自己的report来实现cmdb数据的采集,创建report也有两种方式。

Demo 1

1、创建report

/usr/lib/ruby/site_ruby/1.8/puppet/reports/cmdb.rb

2、应用report

/etc/puppet/puppet.conf

Demo 2

1、创建report

在 /etc/puppet/modules 目录下创建如下文件结构:

modules└── cmdb├── lib│   └── puppet│       └── reports│           └── cmdb.rb└── manifests└── init.pp

require'puppet'

2、应用report

/etc/puppet/puppet.conf

方式二

使用python调用shell命令,解析命令结果并将数据发送到API

API

REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”

REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态

REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”

所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性

对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

django中可以使用 Django rest framwork 来实现:http://www.django-rest-framework.org/

 modes.py

class Blog(models.Model):

title = models.CharField(max_length=50)

content = models.TextField()

 api.py

from django.contrib.auth.models import User

from rest_framework import routers, serializers, viewsets

from app02 import models

from rest_framework.decorators import detail_route, list_route

from rest_framework import response

from django.shortcuts import HttpResponse

# Serializers define the API representation.

class UserSerializer(serializers.HyperlinkedModelSerializer):

class Meta:

model = User

fields = ('url', 'username', 'email', 'is_staff')

# ViewSets define the view behavior.

class UserViewSet(viewsets.ModelViewSet):

queryset = User.objects.all()

serializer_class = UserSerializer

# Serializers define the API representation.

class BlogSerializer(serializers.HyperlinkedModelSerializer):

class Meta:

model = models.Blog

depth = 1

fields = ('url','title', 'content',)

# ViewSets define the view behavior.

class BLogViewSet(viewsets.ModelViewSet):

queryset = models.Blog.objects.all()

serializer_class = BlogSerializer

@list_route()

def detail(self,request):

print request

#return HttpResponse('ok')

return response.Response('ok')

api.py

 urls.py

from django.conf.urls import patterns, include, url

from django.contrib import admin

from rest_framework import routers

from app02 import api

from app02 import views

# Routers provide an easy way of automatically determining the URL conf.

router = routers.DefaultRouter()

router.register(r'users', api.UserViewSet)

router.register(r'blogs', api.BLogViewSet)

urlpatterns = patterns('',

url(r'^', include(router.urls)),

url(r'index/', views.index),

#url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))

)

urls.py

 views

from django.shortcuts import render

from rest_framework.decorators import api_view

from rest_framework.response import Response

# Create your views here.

@api_view(['GET', 'PUT', 'DELETE','POST'])

def index(request):

print request.method

print request.DATA

return Response([{'asset': '1','request_hostname': 'c1.puppet.com' }])

views

后台管理页面

后台管理页面需要实现对数据表的增删改查。

问题:

1、paramiko执行sudo

相关文章:

  • python热门吗_Python现在仍然是最热门的编程语言吗?
  • python 西门子_python读取S7-1200 DB块
  • 为什么真无线蓝牙耳机每次切换设备都要重新连接_悅响音质,尽在双耳-360 PlayBuds真无线蓝牙耳机...
  • 多个bit位整合成一个byte输出_Micro:Bit儿童编程神器第2课:25颗LED灯怎么玩
  • mysql 转int_一文彻底读懂MySQL事务的四大隔离级别
  • python箭头函数_函数----箭头函数
  • python中复数的乘法_PTA:Python解答1049 数列的片段和/1051 复数乘法
  • 14张思维导图python_收藏 | 14张思维导图-构建Python核心体系!Python语法总结!
  • 从底部上滑失灵_苹果iPhone11Pro屏幕失灵怎么办
  • python列表的基本操作_python中列表的基本操作
  • kmeans图像分割matlab代码_直播案例 | KMeans 的 Python 实现及在图像分割和新闻聚类中的应用...
  • vb6.0集成开发环境_加明作品|IDLE集成开发环境美化教程
  • python 浏览器自动化 弹窗控制_Python_Selenium之浏览器封装_去掉浏览器受到自动化控制横条显示及去掉是否记住密码弹窗...
  • 将两个文件的路径作为参数传递给脚本_做MG动画你还不用脚本?别傻了!
  • python的题目在哪查_Python语言程序设计_章节测验,期末考试,慕课答案查询公众号...
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • Android系统模拟器绘制实现概述
  • Docker: 容器互访的三种方式
  • ES2017异步函数现已正式可用
  • Hexo+码云+git快速搭建免费的静态Blog
  • java2019面试题北京
  • Java新版本的开发已正式进入轨道,版本号18.3
  • js 实现textarea输入字数提示
  • LintCode 31. partitionArray 数组划分
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 服务器之间,相同帐号,实现免密钥登录
  • 回流、重绘及其优化
  • 简析gRPC client 连接管理
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端面试题总结
  • 十年未变!安全,谁之责?(下)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • - 转 Ext2.0 form使用实例
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ![CDATA[ ]] 是什么东东
  • (4)(4.6) Triducer
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (TOJ2804)Even? Odd?
  • (第一天)包装对象、作用域、创建对象
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)认识微服务
  • (转)一些感悟
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NetCore部署微服务(二)
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @Autowired 与@Resource的区别