1. 程式人生 > >CMDB開發(需求分析)

CMDB開發(需求分析)

tsm them linux del 個數 chang 時間 變更管理 regexp

淺談ITIL

TIL即IT基礎架構庫(Information Technology Infrastructure Library, ITIL,信息技術基礎架構庫)由英國政府部門CCTA(Central Computing and Telecommunications Agency)在20世紀80年代末制訂,現由英國商務部OGC(Office of Government Commerce)負責管理,主要適用於IT服務管理(ITSM)。ITIL為企業的IT服務管理實踐提供了一個客觀、嚴謹、可量化的標準和規範。

1、事件管理(Incident Management)

事故管理負責記錄、歸類和安排專家處理事故並監督整個處理過程直至事故得到解決和終止。事故管理的目的是在盡可能最小地影響客戶和用戶業務的情況下使IT系統恢復到服務級別協議所定義的服務級別。

目標是:在不影響業務的情況下,盡可能快速的恢復服務,從而保證最佳的效率和服務的可持續性。事件管理流程的建立包括事件分類,確定事件的優先級和建立事件的升級機制。

2、問題管理(Problem Management)

問題管理是指通過調查和分析IT基礎架構的薄弱環節、查明事故產生的潛在原因,並制定解決事故的方案和防止事故再次發生的措施,將由於問題和事故對業務產生的負面影響減小到最低的服務管理流程。與事故管理強調事故恢復的速度不同,問題管理強調的是找出事故產生的根源,從而制定恰當的解決方案或防止其再次發生的預防措施。

目標是:調查基礎設施和所有可用信息,包括事件數據庫,來確定引起事件發生的真正潛在原因,一起提供的服務中可能存在的故障。

3、配置管理(Configuration Management)

配置管理是識別和確認系統的配置項,記錄和報告配置項狀態和變更請求,檢驗配置項的正確性和完整性等活動構成的過程,其目的是提供IT基礎架構的邏輯模型,支持其它服務管理流程特別是變更管理和發布管理的運作。

目標是:定義和控制服務與基礎設施的部件,並保持準確的配置信息。

4、變更管理(Change Management)

變更管理是指為在最短的中斷時間內完成基礎架構或服務的任一方面的變更而對其進行控制的服務管理流程。變更管理的目標是確保在變更實施過程中使用標準的方法和步驟,盡快地實施變更,以將由變更所導致的業務中斷對業務的影響減小到最低。

目標是:以受控的方式,確保所有變更得到評估、批準、實施和評審。

5、發布管理(Release Management)

發布管理是指對經過測試後導入實際應用的新增或修改後的配置項進行分發和宣傳的管理流程。發布管理以前又稱為軟件控制與分發。

目標是:在實際運行環境的發布中,交付、分發並跟蹤一個或多個變更。

實際工作場景中自動化工具舉例:

技術分享

CMDB

CMDB --Configuration Management Database 配置管理數據庫, CMDB存儲與管理企業IT架構中設備的各種配置信息,它與所有服務支持和服務交付流程都緊密相聯,支持這些流程的運轉、發揮配置信息的價值,同時依賴於相關流程保證數據的準確性。

在實際的項目中,CMDB常常被認為是構建其它ITIL流程的基礎而優先考慮,ITIL項目的成敗與是否成功建立CMDB有非常大的關系。 70%~80%的IT相關問題與環境的變更有著直接的關系。實施變更管理的難點和重點並不是工具,而是流程。即通過一個自動化的、可重復的流程管理變更,使得當變更發生的時候,有一個標準化的流程去執行,能夠預測到這個變更對整個系統管理產生的影響,並對這些影響進行評估和控制。而變更管理流程自動化的實現關鍵就是CMDB。 CMDB工具中至少包含這幾種關鍵的功能:整合、調和、同步、映射和可視化。
  • 整合是指能夠充分利用來自其他數據源的信息,對CMDB中包含的記錄源屬性進行存取,將多個數據源合並至一個視圖中,生成連同來自CMDB和其他數據源信息在內的報告;
  • 調和能力是指通過對來自每個數據源的匹配字段進行對比,保證CMDB中的記錄在多個數據源中沒有重復現象,維持CMDB中每個配置項目數據源的完整性;自動調整流程使得初始實施、數據庫管理員的手動運作和現場維護支持工作降至最低;
  • 同步指確保CMDB中的信息能夠反映聯合數據源的更新情況,在聯合數據源更新頻率的基礎上確定CMDB更新日程,按照經過批準的變更來更新 CMDB,找出未被批準的變更;
  • 應用映射與可視化,說明應用間的關系並反應應用和其他組件之間的依存關系,了解變更造成的影響並幫助診斷問題。

目前CMDB資產管理的實現有如下方式:

Paramiko類
1.基於CMDB中控機和SSH對遠程服務器執行命令實現

技術分享
import paramiko
   
# 創建SSH對象
ssh = paramiko.SSHClient()
# 允許連接不在know_hosts文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接服務器
ssh.connect(hostname=c1.salt.com, port=22, username=wupeiqi, password=123)
   
# 執行命令
stdin, stdout, stderr = ssh.exec_command(df)
# 獲取命令結果
result = stdout.read()
   
# 關閉連接
ssh.close()
View Code

2.SaltStack
基於SaltStack的master上的pillar以及遠程執行命令實現

技術分享
import salt.client
local = salt.client.LocalClient()
local.cmd(*, cmd.run, [whoami])
View Code

3.Puppet
基於Puppet的factor和report功能實現

技術分享
puppet中默認自帶了5個report,放置在【/usr/lib/ruby/site_ruby/1.8/puppet/reports/】路徑下。如果需要執行某個report,那麽就在puppet的master的配置文件中做如下配置:
 
######################## on master ###################
/etc/puppet/puppet.conf
[main]
reports = store #默認
#report = true #默認
#pluginsync = true #默認
 
 
####################### on client #####################
 
/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
View Code 技術分享
在 /etc/puppet/modules 目錄下創建如下文件結構: 

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

################ cmdb.rb ################
# cmdb.rb
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 (its 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


################ 配置 ################
/etc/puppet/puppet.conf
[main]
reports = cmdb
#report = true #默認
#pluginsync = true #默認 
自定義factor示例 技術分享
$LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__))
require "rubygems"
require pp
require json
require utils

def dmi_get_ram(cmd)

    ram_slot = []

    key_map = {
        Size => capacity,
        Serial Number => sn,
        Type => model,
        Manufacturer => manufactory,
        Locator => slot,
    }

    output = Utils.facter_exec(cmd)
    devices = output.split(Memory Device)

    devices.each do |d|
      next if d.strip.empty?
      segment = {}
      d.strip.split("\n\t").each do |line|
        key, value = line.strip.split(":")
        if key_map.has_key?(key.strip)
          if key.strip == Size
            segment[key_map[Size]] = value.chomp("MB").strip.to_i / 1024.0 # unit GB
          else
            segment[key_map[key.strip]] =  value ? value.strip : ‘‘
          end
        end
      end

      ram_slot.push(segment) unless segment.empty?
    end

    return ram_slot

end

Facter.add("ram") do
  confine :kernel => "Linux"
  setcode do

    ram_slot = []
    cmd = "dmidecode -q -t 17 2>/dev/null"
    ram_slot = dmi_get_ram(cmd)

    JSON.dump(ram_slot)

  end
end


Facter.add("ram") do
  confine :kernel => windows
  setcode do

    ram_slot = []

    if Facter.value(:manufacturer)  =~ /.*HP.*/i
      cli = C:\cmdb_report\dmidecode.exe
      cmd = "#{cli} -q -t 17"
      ram_slot = dmi_get_ram(cmd) if File.exist?(cli)

    else

      require facter/util/wmi
      Facter::Util::WMI.execquery("select * from Win32_PhysicalMemory").each do | item |

        if item.DeviceLocator
          slot = item.DeviceLocator.strip
        else
          slot = ‘‘
        end

        if item.PartNumber
          model = item.PartNumber.strip
        else
          model = ‘‘
        end

        if item.SerialNumber
          sn = item.SerialNumber.strip
        else
          sn = ‘‘
        end

        if item.Manufacturer
          manufactory = item.Manufacturer.strip
        else
          manufactory = ‘‘
        end

        ram_slot.push({
         capacity => item.Capacity.to_i / (1024**3), # unit GB
         slot => slot,
         model => model,
         sn => sn,
         manufactory => manufactory,
       })

      end
    end

    JSON.dump(ram_slot)

  end
end
內存信息

4.Agent
基於shell命令實現

技術分享

對於Agent的版本的實現思路:

    • Agent采集硬件資產
    • API提供相關處理的接口
    • 管理平臺為用戶提供可視化操作

CMDB開發(需求分析)