標籤:www hit elf lap indicator quick gen dem cat
營運自動化路線:
cmdb的開發需要包含三部分功能:
執行流程:伺服器的用戶端採集硬體資料,然後將硬體資訊發送到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
123456 |
/ etc / puppet / puppet.conf [main] reports = store #預設 #report = true #預設 #pluginsync = true #預設 |
on client
12345678 |
/ etc / puppet / puppet.conf [main] #report = true #預設 [agent] runinterval = 10 server = master.puppet.com certname = c1.puppet.com |
如上述設定之後,每次執行client和master同步,就會在master伺服器的 【/var/lib/puppet/reports】路徑下建立一個檔案,主動執行:puppet agent --test
所以,我們可以建立自己的report來實現cmdb資料的採集,建立report也有兩種方式。
Demo 1
1、建立report
+ View Code
2、應用report
+ View Code
Demo 2
1、建立report
在 /etc/puppet/modules 目錄下建立如下檔案結構:
modules└── cmdb ├── lib │ └── puppet │ └── reports │ └── cmdb.rb └── manifests └── init.pp
123456789101112131415161718192021222324 |
require ‘puppet‘ require ‘fileutils‘ require ‘puppet/util‘ SEPARATOR = [Regexp.escape( File ::SEPARATOR.to_s), Regexp.escape( File ::ALT_SEPARATOR.to_s)].join Puppet::Reports.register_report(:cmdb) do desc "Store server info These files collect quickly - - one every half hour - - so it is a good idea to perform some maintenance on them if you use this report (it‘s the only default report)." def process certname = self .name now = Time.now.gmtime File . open ( "/tmp/cmdb.json" , ‘a‘ ) do |f| f.write(certname) f.write( ‘ | ‘ ) f.write(now) f.write( "\r\n" ) end end end |
2、應用report
12345 |
/ etc / puppet / puppet.conf [main] reports = cmdb #report = true #預設 #pluginsync = true #預設 |
方式二
使用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/
class Blog(models.Model): title = models.CharField(max_length=50) content = models.TextField()
from django.contrib.auth.models import Userfrom rest_framework import routers, serializers, viewsetsfrom app02 import modelsfrom rest_framework.decorators import detail_route, list_routefrom rest_framework import responsefrom 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‘)
from django.conf.urls import patterns, include, urlfrom django.contrib import adminfrom rest_framework import routersfrom app02 import apifrom 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‘)))
from django.shortcuts import renderfrom rest_framework.decorators import api_viewfrom 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‘ }])
後台管理頁面
後台管理頁面需要實現對資料表的增刪改查。
問題:
1、paramiko執行sudo
1234 |
/ etc / sudoers Defaults requiretty Defaults:cmdb !requiretty |
Python CMDB開發