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 --Configuration Management Database 配置管理数据库, CMDB存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。
目前CMDB资产管理的实现有如下方式:
1、Paramiko类
基于CMDB中控机和SSH对远程服务器执行命令实现
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | importparamiko  # 创建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() | 
2、SaltStack
基于SaltStack的master上的pillar以及远程执行命令实现
| 1 2 3 | importsalt.clientlocal =salt.client.LocalClient()local.cmd(‘*‘, ‘cmd.run‘, [‘whoami‘]) | 
3、Puppet
基于Puppet的factor和report功能实现
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 =10server =master.puppet.comcertname =c1.puppet.com如上述设置之后,每次执行client和master同步,就会在master服务器的 【/var/lib/puppet/reports】路径下创建一个文件,主动执行:puppet agent  --test | 
4、写配置文件
1、自定义factor示例
在 /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 (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
################ 配置 ################
/etc/puppet/puppet.conf
[main]
reports = cmdb
#report = true #默认
#pluginsync = true #默认 
2、内存信息
$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
3、Agent
基于shell命令实现

对于Agent的版本的实现思路:
原文:http://www.cnblogs.com/nulige/p/6703160.html