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、Agent (基于shell命令实现)

                  原理图

Agent方式,可以将服务器上面的Agent程序作定时任务,定时将资产信息提交到指定API录入数据库

优点:速度快 缺点:需要为每台服务器部署一个Agent程序

2、Paramiko类 (SSH形式,基于Paramiko模块)

中控机在获取未采集资产信息的服务器(服务器主机名,密码),依赖于Paramiko(py模块)通过SSH方式去获取

优点:无Agent 缺点:速度慢

如果在服务器较少的情况下,可应用此方法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

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()

3、SaltStack

  此方案本质上和第二种方案大致是差不多的流程,中控机在获取到未采集资产信息的服务器(主机名),再而将命令放入一个队列中,服务器来获取。服务器将结果放入另一个队列中,中控机获取将服务信息发送到API进而录入数据库。

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

1 2 3

import salt.client local = salt.client.LocalClient() local.cmd('*', 'cmd.run', ['whoami'])

优点:快,开发成本低 缺点:依赖于第三方工具

4、Puppet(ruby语言开发) 基于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 = 10 server = master.puppet.com certname = c1.puppet.com 如上述设置之后,每次执行client和master同步,就会在master服务器的 【/var/lib/puppet/reports】路径下创建一个文件,主动执行:puppet agent --test

1、自定义factor示例

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

在 /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 #默认

小结:

  • 采集资产信息有四种不同的形式(但puppet是具于ruby开发的)
  • API提供相关处理的接口
  • 管理平台为用户提供可视化操作

二、开发cmdb程序

开发程序设计为可插拔机制。(好处:扩展性强)

开发一套程序时,要使其有充分的扩展性。接下来可以写一些伪代码...

1、假设项目名为AutoClient, 目录结构如下:

AutoClient/
|-- bin/
|   |-- auto_client.py
|-- config/
|   |-- settings.py
|-- lib/
|   |--
|-- log/
|   |-- error.log
|   |-- run.log
|-- src/
|   |-- plugins/
|       |-- __init__.py
|       |-- base.py
|       |-- cpu.py
|       |-- ...
|   |-- scripts.py 
|-- README

例如,采集资产信息有三种形式,而将要做的一件事就是要让程序兼容这三种形式

2、获取内存信息

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

$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

三、CMDB数据库设计

四、CMDB总结

1. 三种采集资产方式 唯一标识 2. API API验证(tornado源码,加密cookie+时间限制+访问记录) 数据库表结构 3. 后台管理 告别CURD,公共组件(前端+后端配置)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HTTPS和SSL/TLS协议

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识。 1. 大致了解几个基本术语(HTTPS、SSL、TLS)的含义 2. 大致了解 HTTP ...

    菲宇
  • docker swarm 学习命令整理

    版权声明:欢迎交流,菲宇运维!

    菲宇
  • flask使用富文本编辑器ckeditor

    为了使用CKEditor,我们首先要在模板中引入CKEditor的JavaScript等资源文件。推荐的做法是自己编写资源引用语句,你可以在CKEditor提供...

    菲宇
  • 何恺明、吴育昕最新成果:用组归一化替代批归一化

    编译 | 阿司匹林 AI科技大本营按:近日,FAIR 团队的吴育昕和何恺明提出了组归一化(Group Normalization,简称 GN)的方法。其中,GN...

    AI科技大本营
  • xilinx verilog语法技巧(三)--RAM的初始化

    RAM可以通过以下方式初始化: 1,在HDL源代码中指定RAM初始内容; 2,在外部数据文件中指定RAM初始内容。 Verilog Coding Example...

    FPGA开源工作室
  • java环境搭建-走进java世界

    我来为大家演示jdk8的搭建,后面再讲一些jdk8和jdk10的一些区别。 为什么要安装jdk8版本呢,因为现在大多数软件的java环境是基于8版本的呢!

    小蓝枣
  • 由小见大-MySQL脚本部署中的一些策略

    在线上环境中部署脚本,可谓是常在河边走,哪有不湿鞋,所以大大小小的案例总结下来,还是会发现一些有趣的地方,这些可以作为操作时的一些参考,仅供参考而已。 第一类...

    jeanron100
  • 首次曝光:大厂都是这样过1024程序员节的,看的我都酸了

    据了解,1024程序员节 是中国程序员的共同节日。1024是2的十次方,二进制计数的基本计量单位之一。程序员(英文Programmer)是从事程序开发、维护的专...

    程序员追风
  • PhiloGL学习(6)——深情奉献:快乐的一家

     前言 话说上一篇文章结尾讲到这一篇要做一个地球自转以及月球公转的三维动画,提笔,不对,是提键盘开始写的时候脑海中突然出现了几年前春晚风靡的那首歌:蒙古族小丫头...

    魏守峰
  • Swift 视图抖动扩展二

    嗯。。。UIView 的 animation 方法里面的 options 还有个.repate,是的,就是动画重复,所以我们可以不用去自己算重复的动画次数。。s...

    韦弦zhy

扫码关注云+社区

领取腾讯云代金券