python CMDB项目

浅谈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资产管理的实现有如下方式:

    1. Paramiko类
      基于CMDB中控机和SSH对远程服务器执行命令实现
    2.  1 import paramiko
       2    
       3 # 创建SSH对象
       4 ssh = paramiko.SSHClient()
       5 # 允许连接不在know_hosts文件中的主机
       6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
       7 # 连接服务器
       8 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123')
       9    
      10 # 执行命令
      11 stdin, stdout, stderr = ssh.exec_command('df')
      12 # 获取命令结果
      13 result = stdout.read()
      14    
      15 # 关闭连接
      16 ssh.close()
      View Code

      SaltStack
      基于SaltStack的master上的pillar以及远程执行命令实现

    3. 1 import salt.client
      2 local = salt.client.LocalClient()
      3 local.cmd('*', 'cmd.run', ['whoami'])
      View Code

      Puppet
      基于Puppet的factor和report功能实现

    4.  1 puppet中默认自带了5个report,放置在【/usr/lib/ruby/site_ruby/1.8/puppet/reports/】路径下。如果需要执行某个report,那么就在puppet的master的配置文件中做如下配置:
       2  
       3 ######################## on master ###################
       4 /etc/puppet/puppet.conf
       5 [main]
       6 reports = store #默认
       7 #report = true #默认
       8 #pluginsync = true #默认
       9  
      10  
      11 ####################### on client #####################
      12  
      13 /etc/puppet/puppet.conf
      14 [main]
      15 #report = true #默认
      16    
      17 [agent]
      18 runinterval = 10
      19 server = master.puppet.com
      20 certname = c1.puppet.com
      21  
      22 如上述设置之后,每次执行client和master同步,就会在master服务器的 【/var/lib/puppet/reports】路径下创建一个文件,主动执行:puppet agent  --test
      View Code
       1 在 /etc/puppet/modules 目录下创建如下文件结构: 
       2 
       3 modules
       4 └── cmdb
       5     ├── lib
       6     │   └── puppet
       7     │       └── reports
       8     │           └── cmdb.rb
       9     └── manifests
      10         └── init.pp
      11 
      12 ################ cmdb.rb ################
      13 # cmdb.rb
      14 require 'puppet'
      15 require 'fileutils'
      16 require 'puppet/util'
      17   
      18 SEPARATOR = [Regexp.escape(File::SEPARATOR.to_s), Regexp.escape(File::ALT_SEPARATOR.to_s)].join
      19   
      20 Puppet::Reports.register_report(:cmdb) do
      21   desc "Store server info
      22     These files collect quickly -- one every half hour -- so it is a good idea
      23     to perform some maintenance on them if you use this report (it's the only
      24     default report)."
      25   
      26   def process
      27     certname = self.name
      28     now = Time.now.gmtime
      29     File.open("/tmp/cmdb.json",'a') do |f|
      30       f.write(certname)
      31       f.write(' | ')
      32       f.write(now)
      33       f.write("\r\n")
      34     end
      35   
      36   end
      37 end
      38 
      39 
      40 ################ 配置 ################
      41 /etc/puppet/puppet.conf
      42 [main]
      43 reports = cmdb
      44 #report = true #默认
      45 #pluginsync = true #默认 
      46 
      47 自定义factor示例
      自定义factor示例
        1 $LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__))
        2 require "rubygems"
        3 require 'pp'
        4 require 'json'
        5 require 'utils'
        6 
        7 def dmi_get_ram(cmd)
        8 
        9     ram_slot = []
       10 
       11     key_map = {
       12         'Size' => 'capacity',
       13         'Serial Number' => 'sn',
       14         'Type' => 'model',
       15         'Manufacturer' => 'manufactory',
       16         'Locator' => 'slot',
       17     }
       18 
       19     output = Utils.facter_exec(cmd)
       20     devices = output.split('Memory Device')
       21 
       22     devices.each do |d|
       23       next if d.strip.empty?
       24       segment = {}
       25       d.strip.split("\n\t").each do |line|
       26         key, value = line.strip.split(":")
       27         if key_map.has_key?(key.strip)
       28           if key.strip == 'Size'
       29             segment[key_map['Size']] = value.chomp("MB").strip.to_i / 1024.0 # unit GB
       30           else
       31             segment[key_map[key.strip]] =  value ? value.strip : ''
       32           end
       33         end
       34       end
       35 
       36       ram_slot.push(segment) unless segment.empty?
       37     end
       38 
       39     return ram_slot
       40 
       41 end
       42 
       43 Facter.add("ram") do
       44   confine :kernel => "Linux"
       45   setcode do
       46 
       47     ram_slot = []
       48     cmd = "dmidecode -q -t 17 2>/dev/null"
       49     ram_slot = dmi_get_ram(cmd)
       50 
       51     JSON.dump(ram_slot)
       52 
       53   end
       54 end
       55 
       56 
       57 Facter.add("ram") do
       58   confine :kernel => 'windows'
       59   setcode do
       60 
       61     ram_slot = []
       62 
       63     if Facter.value(:manufacturer)  =~ /.*HP.*/i
       64       cli = 'C:\cmdb_report\dmidecode.exe'
       65       cmd = "#{cli} -q -t 17"
       66       ram_slot = dmi_get_ram(cmd) if File.exist?(cli)
       67 
       68     else
       69 
       70       require 'facter/util/wmi'
       71       Facter::Util::WMI.execquery("select * from Win32_PhysicalMemory").each do | item |
       72 
       73         if item.DeviceLocator
       74           slot = item.DeviceLocator.strip
       75         else
       76           slot = ''
       77         end
       78 
       79         if item.PartNumber
       80           model = item.PartNumber.strip
       81         else
       82           model = ''
       83         end
       84 
       85         if item.SerialNumber
       86           sn = item.SerialNumber.strip
       87         else
       88           sn = ''
       89         end
       90 
       91         if item.Manufacturer
       92           manufactory = item.Manufacturer.strip
       93         else
       94           manufactory = ''
       95         end
       96 
       97         ram_slot.push({
       98          'capacity' => item.Capacity.to_i / (1024**3), # unit GB
       99          'slot' => slot,
      100          'model' => model,
      101          'sn' => sn,
      102          'manufactory' => manufactory,
      103        })
      104 
      105       end
      106     end
      107 
      108     JSON.dump(ram_slot)
      109 
      110   end
      111 end
      112 
      113 内存信息
      内存信息

      Agent   基于shell命令实现

    5. 对于Agent的版本的实现思路:

      • Agent采集硬件资产
      • API提供相关处理的接口
      • 管理平台为用户提供可视化操作
posted @ 2018-03-28 17:51  qiao1234  阅读(122)  评论(0)    收藏  举报