转到正文

OneCMDB中文

研究和推广OneCMDB,传递ITIL&ITSM知识。

存档

标签: CI

去年做的省公司IT服务流程中设计了了一个“不可用CI”报告的功能,同时配置管理流程里面针对配置变更有“配置变更申请”功能,同事对这两个功能不能理解。因为在实际开发过程中,开发人员将“不可用CI”报告的功能最后操作定义成了直接更新CMDB,不需要走流程,而将“配置变更申请”功能需要走“CMDB控制和维护”流程。同事的疑问不可用CI是否会破坏流程性及用户误操作。我的意见是这两个功能都不可缺失。

配置管理员是配置管理流程中主要工作承担者,其职责为:通过手工或自动化操作增加及更改配置项,保证所负责的关键CI的关键属性、关键CI间的关键关系完整、准确。实际工作中由各专业技术人员分别担任配置管理员,维护各自所管的设备或应用。配置管理员可以按照基础架构的分类划分,也可以按照所属业务的类别进行划分。也就是说实际过程中配置管理员数量会是1+个。

配置管理和其他流程关联原则

  • 配置管理和变更管理的关联
    • 变更主管在变更计划阶段必须制定配置项更新计划,对计划修改的配置项进行说明
    • 变更实施完后,由变更主管汇总相应的配置项修改的情况,并通知相应的配置管理员,配置管理员接收到配置项修改请求后,与CI实体进行核对,核对无误后方可修改CI属性以及关系
    • 对于风险等级为高和重大的变更,CAB中应该包括配置经理,以确保对CMDB的适当控制
    • CI应与变更记录建立关联,从而对CI的变化情况进行记录
  • 和事件管理、问题管理的关联
    • CI应与事件记录、问题记录建立关联,从而确保对CI维护工作的统计和分析

从配置管理和其他流程关联关系来看,配置变更主要由变更管理流程发起,也就是需要提供“配置变更申请”功能给变更流程作为流程接入点,但是在实际中配置管理员需要对CMDB中数据准确性负责,然而在事件流程、问题流程或者其他流程过程中发现CMDB中记录的CI实例值更实际情况不符合(例如:CMDB中记录Sever1连接Switch1的23端口,但实际却是连接Switch2的3端口),这种情况怎么办呢?发起变更流程?工程师没有变更任何东西呀。这种情况下应该做出CI例外报告(HP这样的翻译实在不好),就设计了一个功能专门用于报告CI不可用的情况。

两个功能设计如下:

  • 不可用CI报告:用于其他流程运维人员提交CMDB中记录有误的情况,用于辅助配置管理员收集错误的CI。配置管理员在收到不可用CI报告时需进一步核实CI情况,以便修改CMDB数据或者发起配置变更申请。
  • 配置变更申请:为“CMDB控制和维护”子流程正常入口,用于变更流程或者配置管理员发起CI修改流程

在查看BMC Remedy IT Service Management功能之后,发现BMC中有一个“创建CI不可用性”的功能,名称好近似呀。不过BMC定义:CI 不可用性是指 CI 的实际宕机时间。您可以记录因某事件导致的意外情况引起的 CI 不可用性。看来在引入ITILV3后续流程后需要重新对不可用CI报告重新命名,以免误会。

 

注:转自Dominic.Xu’s 博客,原文地址:http://web2world.cn/article/2010/07/a146.html

目录

1. 概述

这个文档介绍了如何使用Web ServicesOneCMDB交互,这使得像Java这样的其他变成语言可以和OneCMDB交互。Web Services接口目的是要尽可能简单、实用和强大。

1.1. 一些OneCMDB概念

OneCMDB按照面向对象方式组织, 即对象从其他对象继承。这意味着所有配置项(CI)源于另外一个CI,所有CI都从一个已经存在的根派生。有两种风格的配置项:模板和实例,模板描述每个实例必须有什么属性、什么类型,也包含缺省值。实例包含模板中定义的属性对应的值。

  • CI 都有唯一的ID(人类不可读的),而且是不能改变的),他和后端存储紧密相关。
  • CI 具有唯一的别名。别名可以指定和修改,除非别名在别地地方使用。它经常用于OneCMDB XML定义中。
  • CI 具有一个显示名称,它定义CI作为一行文字如何呈现。显示名称通常一个或多个属性值的串联,它在需要显示时被计算。这样好处是CI不必有一个具体的名称,它将随相应值的变化而改变。
  • CI(模板和实例) (templates and instances) 可以在一个XML文档中描述,它可以从OneCMDB中导出,可以导入到OneCMDB中。

2. 范例模型

为了说明向OneCMDB提交的不同的查询和更新命令,定义了一个简单的带实例的模板模型,它用在所有范例中。

2.1. 模板模型

CI之间的继承用箭头表示。例如:NetworkDevice模板有CI模板中定义的所有属性,Router模板有NetworkDevice和CI的所有属性。

Image:TemplateDiagram.gif

2.2. 实例模型

在此图中箭头表示CI(实例)之间的关联关系。

Image:InstanceDiagram.gif

2.3. OneCMDB XML模型描述

上面的模板和实例模型可以由下面的XML文档定义。这个XML文档可以被导入到OneCMDB中。请注意这只是一个完整文档中的一部分。

<onemcdb>
	<templates>
		<!-- Definition of NetworkDevice Template -->
		<template alias=”NetworkDevice” displayName=”NetDevice ${primaryIp}>
			<derivedFrom><ref alias=Ci/></derivedFrom>
			<attribute attAlias=”primaryIp”>
				<simpleType>String</simpleType>
			</attribute>
		</template>

		<!-- Definiton of the Router
			Defines a Complex Attribute of Type Site and Reference Type Reference.
			It also defines the occurrence of values[0..1] meaning that it's not required to have site value
			but it can not have more than one site. Default policy are [1..1].-->

		<template alias=”Router”>
			<derivedFrom><ref alias=”NetworkDevice”/></derivedFrom>
			<attribute attAlias=”site”>
				<complexType>
					<ref alias="Site"/>
					<refType><ref alias="Reference"/></refType>
				</complexType>
				<policy>
					<minOccurs>0</minOccurs>
					<maxOccurs>1</maxOccurs>
				</policy>
			</attribute>
		</template>
		...
	</templates>
	<instances>
		<!-- Definition of an Router instance that has a reference to Site S1 -->
		<Router alias=”R1”>
			<primaryIp>192.168.1.2<//primaryIp>
			<site><ref alias=”S1”/></site>
		</Router>
		<Site alias=”S1”>
			...
		</Site>
		....
	</instances>
</onecmdb>

3. Web Service 接口(WSDL)

OneCMDB Core功能可以用Web Service访问,这使用户无需受编程语言限制与OneCMDB远程交互。下面的范例将展示如何使用PHP和Java实现交互。

Core 中像创建CI、更新CI、删除CI、查找CI、查询CI和查询CI变更历史功能是可用的。

其他OneCMDB 功能像任务和策略处理在服务没有实现。

本服务的WSDL描述,可以从 http://localhost:8080/webservice/onecmdb?wsdl 获取。

3.1. 设置Java环境

通过Java访问Web Service API可按照以下方法设置:

  • 在classpath中包含以下Jar文件。这些文件可以在目录install/tomcat*/webapps/onecmdb-desktop/WEB-INF/lib下找到
    • onecmdb-core-2.0.1.jar
    • activation-1.1.jar
    • commons-codec-1.3.jar
    • commons-httpclient.jar
    • commons-logging-1.0.4.jar
    • jdom-1.0.jar
    • jsr173_api-1.0.jar
    • wsdl4j-1.6.1.jar
    • wstx-asl-3.2.0.jar
    • xfire-all-1.2.6.jar

然后,创建Web Service接口如下:

import org.onecmdb.core.utils.wsdl.IOneCMDBWebService;
import org.onecmdb.core.utils.wsdl.OneCMDBServiceFactory;

public class OneCMDBClient {
	public static void main(String argv[]) {
		try {
			// 创建web service接口
			IOneCMDBWebService service = OneCMDBServiceFactory.getWebService("http://localhost:8080/webservice/onecmdb");

			// 身份认证
			String token = service.auth("admin", "123");
			System.out.println("Authenticated token=" + token);

			// ....

			// 退出
			service.logout(token);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

这里,提供了在System配置项的图形查询完整范例。

import org.onecmdb.core.utils.bean.CiBean;
import org.onecmdb.core.utils.graph.query.GraphQuery;
import org.onecmdb.core.utils.graph.query.constraint.AttributeValueConstraint;
import org.onecmdb.core.utils.graph.query.selector.ItemOffspringSelector;
import org.onecmdb.core.utils.graph.result.Graph;
import org.onecmdb.core.utils.wsdl.IOneCMDBWebService;
import org.onecmdb.core.utils.wsdl.OneCMDBServiceFactory;

public class OneCMDBClient {
	public static void main(String argv[]) {
		try {
			// 创建web service接口
			IOneCMDBWebService service = OneCMDBServiceFactory.getWebService("http://localhost:8080/webservice/onecmdb");
			String token = service.auth("admin", "123");
			System.out.println("Authenticated token=" + token);

			// 构成查询...
			GraphQuery query = new GraphQuery();
			ItemOffspringSelector sel = new ItemOffspringSelector();
			sel.setTemplateAlias("System");

			// 添加约束...
			AttributeValueConstraint constraint = new AttributeValueConstraint();
			constraint.setAlias("Name");
			constraint.setOperation(AttributeValueConstraint.LIKE);
			constraint.setValue("Al%");

			sel.applyConstraint(constraint);

			query.addSelector(sel);

			// 执行查询
			Graph result = service.queryGraph(token, query);
			result.buildMap();
			for (CiBean bean : result.fetchAllNodeOffsprings()) {
				System.out.println("System=" + bean.toStringValue("Name"));
			}

			// 退出
			service.logout(token);

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

3.1.1. 使用基本模型Java范例

  1. Create/Update CI’s

4. API 概述

有效Web Services 函数有:

auth(String username, String pwd) throws Exception : String

logout(String authToken) : void

history(String auth, CiBean vBean, RfcQueryCriteria criteria) : RFCBean[] 

historyCount(String auth, CiBean vBean, RfcQueryCriteria criteria) : int

search(String auth, QueryCriteria criteria) : CiBean[]

searchCount(String auth, QueryCriteria criteria) : int

query(String auth, String xPath, String attributes) : CiBean[]

update(String auth, CiBean localBeans[], CiBean baseBeans[]) : IRfcResult

findRelation(String auth, CiBean left, CiBean right) : String[]

evalRelation(String auth, CiBean root, String relationPath, QueryCriteria crit) : CiBean[]

evalRelationCount(String auth, CiBean root, String relationPath, QueryCriteria crit) : int

queryGraph(String token, GraphQuery q) : Graph

4.1. Auth函数

语法:

auth(String username, String pwd) throws Exception : String

OneCMDB中认证一个用户。返回的令牌在所有方法中使用,要结束会话则使用Logout函数。如果用户无法通过身份验证抛出异常。

4.2. GraphQuery函数

语法:

graphQuery(String auth, GraphQuery) : Graph

这是OneCMDB目前支持的最先进的查询方法。它可以查询源自不同模板的CI以及这些CI之间的关系,它也可以对每个模板支持分页和条件搜索(如属性值)。

欲了解更多信息和示例,请参阅 WSDL的图形查询(本站翻译文章:[译]WSDL的图形查询

4.3. Query函数

语法:

query(String auth, String xPath, String attributes) : CiBean[]

使用XPath语法查询OneCMDB,返回结果总是CiBean数组,见下文的CiBean数据类型的定义。

通用XPath:

  • /template/* – 列出所有模板。
  • /template/<alias> – 获取特定别名的模板。
  • /instance/<template-alias>/* – 列出某个模板的所有实例。
  • /instance/<template-alias>/<instance-alias> -获取特定的实例。

attributes参数可用于指定包含在结果CI中属性。它通过指定属性路径控制检索索引的深度。

范例

query(“xxx”, “/instance/Router/*”, “primaryIp site site/supervisor”); 

将返回所有路由器实例和应用的Site、Person配置项实例。

4.4. Update 函数

语法:

update(String auth, CiBean localBeans[], CiBean baseBeans[]) : IRfcResult

方法用于在OneCMDB中创建、更新、删除CI。这个方法有三个参数:auth会话的令牌、bean本地集合和bean的基准集合。CI的基准集合用于决定查询时哪些CI有效,CI的本地集合用户修改已经存在的CI或者新建不存在的CI。这是一个CVS做法,基准集合是签出点,本地集合是当前修改的条目。它实现了三方比较,该方法可以检测到冲突。目前只实现了删除CI和属性检测。(译者注:localBeans即bean本地集合相当于新值,baseBeans即bean基准集合相当于旧值。即在baseBeans上修改为localBeans。)

4.5 Search(Count) 函数

语法:

search(String auth, QueryCriteria criteria) : CiBean[]
searchCount(String auth, QueryCriteria criteria) : int

OneCMDB中搜索符合某些条件的CI。searchCount函数有同样的参数但只返回搜索结果中命中数量(忽略maxResult属性),它对实现大数据集的分页非常有用。search方法比query方法快一些,但是需要更复杂的参数。

典型搜索条件是:

  • 针对值、别名、描述的文本搜索。
  • 特定模板的实例。

search函数也支持结果集的分页,通过使用maxResult和firstResult属性组合实现,见下面范例。

4.6 History(Count) 函数

语法:

history(String auth, CiBean vBean, RfcQueryCriteria criteria) : RFCBean[]
historyCount(String auth, CiBean vBean, RfcQueryCriteria criteria) : int

查看CI的变更历史记录。OneCMDBCI所有变化都进行跟踪,并存储在一个RFC对象中。这些对象可以使用这个函数检索出来。

4.7 Relation 函数

语法:

findRelation(String auth, CiBean left, CiBean right) : String[]
evalRelation(String auth, CiBean root, String relationPath, QueryCriteria crit) : CiBean[]
evalRelationCount(String auth, CiBean root, String relationPath, QueryCriteria crit) : int

注意:这些函数还处于alpha状态和改变中。findRelation方法在OneCMDB 1.3.0中未实现。

Relation 函数用于浏览模型关系。一旦关系路径是已知的,就可能从一个指定的关系路径源获取关联的实例。关系路径语法如下:

direction cmd delimiter

这里

  • direction
    • > 正向
    • < 反向
  • cmd
    • $attr{alias} – 从指定别名属性出发正向关联
    • $template{alias} – 反向,意味着CI是从指定别名模板的实例关联
  • delimiter
    • 管道标志 |

范例 – 关联一个Person实例到一个Router实例

<$template{Site}|<$template{Router}

范例 – 关联一个Router实例到Person属性

>$attr{site}|>$attr{supervisor}

4.8 Logout 函数

语法:

logout(String authToken) : void

终止会话令牌。

4.9 范例

注意: 所有的例子使用上面描述的范例模型。

4.9.1 PHP范例

下面的PHP范例使用PHP5内建SOAP扩展,它默认没有启用,要启用它请在PHP网站http://www.php.net 查找更多信息。(Windows系统中通过在php.ini文件中添加extension=php_soap.dll启用它。)

4.9.1.1 范例 – 列出路由器的所有实例

<?php
  // 指定WSDL URL
  $wsdl_url = "http://localhost:8080/webservice/onecmdb?wsdl";

  // 创建Soap 客户端
  $client = new SoapClient($wsdl_url);

  // 通过OneCMDB身份认证
  $token = $client->auth(“admin”, “123”);

  // 查询路由器实例
  $routers = $client->query($token, “/instance/Router/*”, ”*”);

  // 退出
  $client->logout($token);

  // 显示转储结果
  print_r($routers);
?>

4.9.1.2 范例 – 搜索某个属性值

<?php

	// 范例 - 搜索指定属性值的CI
	// ========================================================

	// 使用PHP5 内部soap客户端创建Soap客户端
	$wsdl_url = "http://localhost:8080/webservice/onecmdb?wsdl";
	$client = new SoapClient($wsdl_url);
	try {
		$token = $client->auth("admin", "123");
	} catch (SoapFault $e) {
		print("Auth Error:::: $e");
	}

	// 设置搜索条件
	$criteria->offspringOfAlias = "Router";
	$criteria->textMatchValue = "true";
	$criteria->text = "192.168.1.2";

	// 映射到正确的命名空间
	$arg1 = new SoapVar($criteria, 0, "QueryCriteria", "http://model.internal.core.onecmdb.org"); 

	// 获取搜索结果数量
	$result = $client->searchCount($token, $arg1);
	print("Matched : $result CI");
	print("<br/>");

	// 搜索所有符合条件的CI
	$result = $client->search($token, $arg1);

	// 显示结果
	// 注意:如果返回数组中只有一个条目,它将不再是数组!
	if (is_array($result->CiBean)) {
		print("<ul>");
   		foreach ($result->CiBean as $bean) {
   			print("<li>");
   	  		print("Alias=$bean->alias displayName=$bean->displayName");
   			print("</li>");
   		}
   		print("</ul>");
	} else {
		$bean = $result->CiBean;
   		print("Alias=$bean->alias displayName=$bean->displayName");
   	} 

   	// 这样退出也不错
   	$client->logout($auth);
?>

4.9.1.3 范例 – 添加一个配置项模板和实例

<?php
// 该函数创建一个实例对象
function getInstance($alias) {
		$instance->alias = $alias;
		$instance->derivedFrom = "NewTemplate";		

		$attrValue->alias = "a1";
		$attrValue->value = "value for $alias";
		$instance->attributeValues[0] = new SoapVar($attrValue, 0, "ValueBean", "http://bean.utils.core.onecmdb.org");

		// 映射到正确的命名空间
		$soapArg =  new SoapVar($instance, 0, "CiBean", "http://bean.utils.core.onecmdb.org");
		return($soapArg);
}

	// 检查时间
	$start = time();

	/**
	 * 范例 - 添加一个配置项模板和实例
	 */
	$wsdl_url = "http://localhost:8080/webservice/onecmdb?wsdl";

	$client = new SoapClient($wsdl_url);
	try {
		$token = $client->auth("admin", "123");
	} catch (SoapFault $e) {
		print("Auth Error:::: $e");
	}

	$template->alias = "NewTemplate";
	$template->derivedFrom = "Root";
	$template->displayNameExpression = "Test PHP CI";
	$template->description = "Testing template creating from PHP";
	$template->template = "true";

	$attr1->alias = "a1";
	$attr1->type = "xs:string";
	$attr1->description = "Test attribute";
	$template->attributes[0] = new SoapVar($attr1, 0, "AttributeBean", "http://bean.utils.core.onecmdb.org");

	// 映射到正确的命名空间
	$arg1[0] =  new SoapVar($template, 0, "CiBean", "http://bean.utils.core.onecmdb.org");

	// 创建100个实例
	for ($i = 0; $i < 100; $i++) {
		// 产生实例
		$arg1[] = getInstance("instance-$i");
	}

	$count = count($arg1);
	print("<h1>Example - Create/Delete $count CI:s</h1>");
	$updateStart = time();

	// 创建所有配置项
	$result = $client->update($token, $arg1, Null);
	$updateStop = time();
	$dtUpdate = $updateStop-$updateStart;
	$stop = time();
	$dt = $stop-$start;
	print("<h2>Create/Update Request took $dt [s], call to server $dtUpdate [s]</h2>");

	// 删除所有已经创建的配置项
	$startDelete = time();
	$result = $client->update($token, Null, $arg1);
	$stopDelete = time();
	$dtDelete = $stopDelete - $startDelete;
	print("<h2>Delete Request ($result->rejected) took $dtDelete [s]</h2>");
?>

4.9.1.4 范例 – 显示某个配置项历史

<?php

function showRFC($rfc) {

	print("<td>$rfc->ts</td>");
	print("<td>$rfc->issuer</td>");
	print("<td>$rfc->summary</td>");

}
	/**
	 * 范例 - 显示CI历史
	 */
	$wsdl_url = "http://localhost:8080/webservice/onecmdb?wsdl";

	$client = new SoapClient($wsdl_url);
	try {
		$token = $client->auth("admin", "123");
	} catch (SoapFault $e) {
		print("Auth Error:::: $e");
	}

	try {
		// 请求最后的变更 	
		$rfcQuery->fetchAttributes = "true";
		$rfcQuery->maxResult = "20";
		$rfcQuery->descendingOrder = "true";
		// 绑定参数的命名空间
		$arg1 = new SoapVar($rfcQuery, 0, "RfcQueryCriteria", "http://ccb.internal.core.onecmdb.org");

		$result = $client->history($token, Null, $arg1);

		// 用表格显示结果
		print("<table border=\"1\">");
		print("<tr>");
		print("<th>Date</th>");
		print("<th>Issuer</th>");
		print("<th>Summary</th>");
		print("</tr>");

		// 注意:如果返回数组中只有一个条目,它将不再是数组!
		if (is_array($result->RFCBean)) {

			foreach($result->RFCBean as $rfc) {
				print("<tr>");
				showRFC($rfc);
				print("</tr>");
			}

		} else {
				print("<tr>");
				showRFC($result->RFCBean);
				print("</tr>");
		}
		print("</table>");

	} catch (SoapFault $e) {
		print("Auth Error:::: $e");
	}
?>

4.9.2 使用XFire客户端的Java语言范例

4.9.2.1 范例 – 转储配置项模板到XML

/**
 * <code>范例1</code> 取得所有配置项模板,并生成XML输出
 */
public class Example1 {

	public static void main(String argv[]) {
		// 注意: 这里不需要?wsdl
		String url = "http://localhost:8080/webservice/onecmdb";
		String username = "admin";
		String pwd = "123";
		String path = "/template/*";

		try {
			// 创建服务
			Service serviceModel = new ObjectServiceFactory().create(IOneCMDBWebService.class);

			// 创建IOneCMDBWebService代理实例
			IOneCMDBWebService service = (IOneCMDBWebService)
			    new XFireProxyFactory().create(serviceModel, url);

			// 通过OneCMDB身份认证
			String token = service.auth(username, pwd);

			// 查询所有模板
			CiBean[] beanArray = service.query(token, path, "*");
			List<CiBean> beans = Arrays.asList(beanArray);

			// 产生所有模板的XML文本到标准输出
			XmlGenerator gen = new XmlGenerator();
			gen.setBeans(beans);
			gen.transfer(System.out);
		} catch (Exception e) {
			System.err.println("ERROR:" + e.toString());
			e.printStackTrace();
		}
	}
}

4.9.2.2 范例 – 从XML文件导入配置项

/**
 * <code>范例2</code> 导入XML文件(myModel.xml)并更新OneCMDB
 *
 */
public class Example2 {
	public static void main(String argv[]) {
		String url = "http://localhost:8080/webservice/onecmdb";
		String username = "admin";
		String pwd = "123";
		String myFile = "file:myModel.xml";

		try {
			Service serviceModel = new ObjectServiceFactory().create(IOneCMDBWebService.class);

			IOneCMDBWebService service = (IOneCMDBWebService)
			    new XFireProxyFactory().create(serviceModel, url);

			String token = service.auth(username, pwd);

			XmlParser provider = new XmlParser();
			provider.addURL(myFile);

			// 解析XML文件
			CiBean beans[] = provider.getBeans().toArray(new CiBean[0]);

			// 更新OneCMDB.
			IRfcResult result = service.update(token, beans, null);

			// 检查是否更新成功
			if (result.isRejected()) {
				System.out.println("Error importing, cause : " + result.getRejectCause());
			} else {
				System.out.println("Import completed");
			}
		} catch (Exception e) {
			System.err.println("ERROR:" + e.toString());
			e.printStackTrace();
		}
	}
}

4.9.2.3 范例 – 搜索配置项并分页

/**
 * <code>范例3</code> 在OneCMDB中搜索实例并分页
 */
public class Example3 {
	public static void main(String argv[]) {

		String url = "http://localhost:8080/webservice/onecmdb";
		String username = "admin";
		String pwd = "123";

		try {
			Service serviceModel = new ObjectServiceFactory().create(IOneCMDBWebService.class);

			IOneCMDBWebService service = (IOneCMDBWebService)
			    new XFireProxyFactory().create(serviceModel, url);

			String token = service.auth(username, pwd);

			int pageSize = 5;
			int offset = 0;
			// 列出所有路由器
			QueryCriteria criteria = new QueryCriteria();
			criteria.setOffspringOfAlias("Router");
			criteria.setMatchCiInstances(true);
			criteria.setMaxResult(pageSize);

			int count = service.searchCount(token, criteria);
			System.out.println("Total router instances : " + count);

			// 搜索配置项并分页
			while(offset < count) {
				criteria.setFirstResult(offset);
				CiBean[] beanArray = service.search(token, criteria);
				System.out.println("Retrieved " + beanArray.length + " routers");
				offset += pageSize;
			}

		} catch (Exception e) {
			System.err.println("ERROR:" + e.toString());
			e.printStackTrace();
		}
	}
}

4.9.2.4 范例 – 删除配置项

/**
 * <code>范例4</code> 从OneCMDB中删除CI
 */
public class Example4 {
	public static void main(String argv[]) {

		String url = "http://localhost:8080/webservice/onecmdb";
		String username = "admin";
		String pwd = "123";

		try {
			Service serviceModel = new ObjectServiceFactory().create(IOneCMDBWebService.class);

			IOneCMDBWebService service = (IOneCMDBWebService)
			new XFireProxyFactory().create(serviceModel, url);

			String token = service.auth(username, pwd);

			// 创建10个路由器实例
			List<CiBean> list = new ArrayList<CiBean>();
			for (int i = 0; i < 10; i++) {
				list.add(new CiBean("Router", "ri-" + i, false));
			}

			// 更新OneCMDB
			IRfcResult result = service.update(token, list.toArray(new CiBean[0]), null);
			if (result.isRejected()) {
				System.out.println("Can't add instances cause " + result.getRejectCause());
				System.exit(-1);
			}
			System.out.println("Instances added");

			// 现在删除这些实例
			// 注意作为最后一个参数的列表
			result = service.update(token, null, list.toArray(new CiBean[0]));
			if (result.isRejected()) {
				System.out.println("Can't delete instances cause " + result.getRejectCause());
				System.exit(-1);
			}
			System.out.println("Instances deleted");

		} catch (Exception e) {
			System.err.println("ERROR:" + e.toString());
			e.printStackTrace();
		}
	}
}

4.9.2.5 范例 – 查看最近修改的配置项ed CI.

译者注:英文Wiki文章这里并没有代码

5 Web Service 数据类型描述

Web Service接口中使用参数对象简介,每个数据类型更详细描述可以在WSDL找到。

5.1 CiBean

范围:输入和输出

命名空间 http://bean.utils.core.onecmdb.org

定义配置项,包含属性和值的列表

属性:

id
配置项后端ID,只读。
alias
CI的别名
derivedFrom
采用模板的别名
template
是模板还是实例
description
配置项的详细描述
displayNameExpression
显示名称的表达式,没有经过计算的。
displayName
经过计算的显示名称。(只读)
attributes
CI所有继承的、自身属性列表。当CI是一个模板时有值。
attributeValues
CI所有属性的值列表。

5.2 AttributeBean

范围:输入和输出

命名空间:http://bean.utils.core.onecmdb.org

定义CI的属性定义。

属性:

alias
属性的别名。
displayName
属性的显示名称。
complexType
如果 complexType 值为 true,其之就是到另外CI的引用(别名)。
type
类型别名。
refType
引用类型别名,如果没有需要的引用类型,则为null。
maxOccurs
该属性出现最多次数。
minOccurs
该属性出现最少次数。
description
属性的详细描述。
id
后端ID。(只读)
derived
属性是否在这个模板中定义。(只读)

5.3 ValueBean

范围:输入和输出

命名空间:http://bean.utils.core.onecmdb.org

定义CI的值。

属性::

id
后端ID,只读。 
alias
属性的别名
value
实际值,可以是复杂类型,那意味着它是别名。
complexValue
指示值是否是复杂类型。
beanValue
值是另外一个 CiBean。

5.4 RfcQueryCriteria

范围: 输入

命名空间:http://ccb.internal.core.onecmdb.org

用于查询OneCMDBCI变更情况对象。

属性:

rfcClass
查询中应该包含一个RFC类型(类),这个变更类有如下这些类可用(如果没有设置将查询所有变更):
org.onecmdb.core.internal.ccb.rfc.RFCNewCi
org.onecmdb.core.internal.ccb.rfc.RFCNewAttribute
org.onecmdb.core.internal.ccb.rfc.RFCDestroy
org.onecmdb.core.internal.ccb.rfc.RFCModifyAlias
org.onecmdb.core.internal.ccb.rfc.RFCModifyAttributeType
org.onecmdb.core.internal.ccb.rfc.RFCModifyAttributeReferenceType
org.onecmdb.core.internal.ccb.rfc.RFCModifyDerivedAttributeValue
org.onecmdb.core.internal.ccb.rfc.RFCModifyAttributeValue
org.onecmdb.core.internal.ccb.rfc.RFCModifyDescription
org.onecmdb.core.internal.ccb.rfc.RFCModifyIsTemplate
org.onecmdb.core.internal.ccb.rfc.RFCModifyDescription
org.onecmdb.core.internal.ccb.rfc.RFCModifyDisplayNameExpression
org.onecmdb.core.internal.ccb.rfc.RFCModifyMaxOccurs
org.onecmdb.core.internal.ccb.rfc.RFCModifyMinOccurs
fromDate
变更发生的起始时间。
toDate
变更发生的结束时间。
descendingOrder
按时间对结果排序,缺省为false。
maxResult
每次返回多少变更记录。和firstResult一起使用实现分页。
firstResult
每次跳过多少变更记录。和maxResult一起使用实现分页。
fetchAttributes
查询CI所有属性变更,缺省只查询CI的变更。
attributeAlias
查询指定别名的属性的变更。

5.5 RFCBean

范围: output

命名空间:http://wsdl.utils.core.onecmdb.org

为查询CI历史时的结果。

id
对应RFC后端ID。
issuer
提交变更的用户。
ts
发生变更的时间。
summary
变更摘要。
transactionId
封闭事务的后端ID。

5.6 QueryCriteria

范围: 输入

命名空间:http://model.internal.core.onecmdb.org

用于在OneCMDB中查询CI的对象。支持分页和自由文本搜索。

属性描述:

offspringOfId
只搜索某ID的后代。
offspringOfAlias
只搜索某别名的后代。
matchCiTemplates
匹配CI模板。
matchCiInstances
匹配CI 实例。
matchAttributeTemplates
匹配属性模板,意味着属性的定义。
matchAttributeInstances
匹配属性实例,意味着属性的值。
maxResult
返回总数。
firstResult
跳过条数直到firstResult值对应的记录。
matchAttribute
在属性中匹配
matchCi
CI中匹配
text
搜索的自由文本,将使用通配符前后匹配。
textMatchAlias
在别名上匹配文本。
textMatchValue
在值上匹配文本。
textMatchDescription
在描述上匹配文本。

5.7 IRfcResult

范围: 输出

命名空间:http://core.onecmdb.org

执行更新命令之后的结果。

属性描述:

rejected
反映一个提交的变更是否被拒绝。如果被拒绝,rejectCause将包含一个拒绝原因。
rejectCause
拒绝的主要原因,如果没有拒绝则返回null。

原文见:http://www.onecmdb.org/wiki/index.php?title=OneCMDB_Web_Services_V2.0,由OneCMDB中文站翻译,完成于2010年01月12日。

OneCMDB 提供了一些Java接口,这些接口不是供远程访问使用的。我们打算发布语言独立的远程访问API

目录

1. 设置

OneCMDB Core使用Spring框架启动和实例化核心对象。下面的xml bean定义文件控制OneCMDB怎样被启动。 

  • Datasource.xml 定义使用的后台数据。
  • Provider.xml 定义加载的缺省模型。
  • Onecmdb.xml 定义下面描述的核心接口。

TODO: 描述jar包依赖关系。

2. OneCMDB概述

Image:ApiOverview.png

2.1 上下文

Image:ApiContextClassDiagram.png

Onecmdb.xml 定义了这个IOneCmdbContext。这个上下文配置了一些服务对象,这些服务对象用来管理模型对象。从上下文中检索服务的方式是通过创建一个Isession对象并使用通过认证的凭据,目前还没有定义验证模块,因此任何用户名密码都可以访问。

2.2 服务

Image:ApiIModelClassDiagram.png
OneCMDB服务增强了OneCMDB核心的功能。 以下各节描述了现有的服务。

2.2.1 IModelService

查询模型,获取Root模型对象。

2.2.2 ICcb

控制模型的修改。

2.2.3 IReferenceService

定义模型对象之间的引用类型对象。

2.2.4 IPolicyService

定义策略。

2.2.5 ICiService

获取CI模型对象的引用。

2.2.6 IContainerService

[当前没有使用]
增加了对容器对象的支持。

2.2.7 IJobService

增加了运行中OneCMDB处理调度任务的支持。

2.3 模型 – 配置项

Image:ApiICiClassDiagram.png

配置项是OneCMDB的核心部分。配置项按照等级次序组织,这意味着所有配置项有且仅有一个Root对象。

3. 代码范例

3.1 开始使用

	// 指定OneCMDB Spring bean的定义文件
	String[] resources = {"onecmdb.xml"};
	ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(resources);

	// 获取OneCMDB上下文
	final IOneCmdbContext cmdb = (IOneCmdbContext) appContext.getBean("onecmdb");

	// 说明你是谁
	ISession session = cmdb.createSession("some_user", "mypassword");

	// 该Session包含的所有服务的引用。
	IModelService modelsvc = (IModelService) session.getService(IModelService.class);

3.2 查找 Root 模型对象

        // 使用模型服务查询模型
	ModelService modelsvc = (IModelService) session.getService(IModelService.class);

        // 取得Root模型对象
	ICI root = modelsvc.getRoot();

	// 取得它的后代
	Set<ICI> offsprings = root.getOffsprings();

	// 打印出来
	for (ICi ci: offsprings) {
		System.out.println(“-->ci.getDisplayName()”);
	}

3.3 查询对象模型

	// 查找特定别名的CI,不支持表达式
	ICi ci = modelsvc.findCi(new Path<String>("IP"));
	if (ci == null) {
		System.out.println("No ci with alias name IP found!");
		return;
	}

	// 查新IP配置项的后代并分页
	QueryCriteria criteria = new QueryCriteria();

	// 设置模板ID
	criteria.setOffspringOfId(ci.getId());

	// 设置前10条
	criteria.setFirstResult(0);
	criteria.setMaxResult(10);
	QueryResult<ICi> result = modelsvc.query(criteria);

	// 设置下一页
	criteria.setFirstResult(10);
	criteria.setMaxResult(10);
	result = modelsvc.query(criteria);

3.4 修改模型

	ISession session = new Setup().getSession("user", "passwd");
	ICcb ccb = (ICcb) session.getService(ICcb.class);
	IModelService modelSvc = (IModelService)session.getService(IModelService.class);

	// 查找模板配置项
	ICi ci = modelSvc.findCi(new Path<String>("IP"));

	// 从一个IP模板创建一个实例
	ICmdbTransaction tx = ccb.getTx(session);
	{
		ICiModifiable rootTemplate = tx.getTemplate(ci);
		ICiModifiable ipTemplate = rootTemplate.createOffspring();

		// 注意: 这个方法应该被命名为setTemplate(boolean);
		ipTemplate.setIsBlueprint(false);

		// 设置IpAddress属性,它是一个简单属性
		ipTemplate.setDerivedAttributeValue("ipAddress",
					0, SimpleTypeFactory.STRING.parseString("192.168.1.1"));
	}

	// 所有的修改都是异步执行
	ITicket ticket = ccb.submitTx(tx);

	// 等待完成
	IRfcResult result = ccb.waitForTx(ticket);

	// 检查结果
	if (result.isRejected()) {
		System.out.println("Request was rejected, cause " + result.getRejectCause());
		return;
	}

	// 问题: 结果不包含新近创建的ICi任何信息
	// 这个问题是因为事务可以包含多余一个修改。
	System.out.println("Instance added ok.");

原文见:http://www.onecmdb.org/wiki/index.php?title=OneCMDB_Core_Java_API_V2.0,由OneCMDB中文站翻译,完成于2010年01月08日。

后台数据库中包含四个表。

  1. CI 和ATTRIBUTE – 存储所有有关配置项当前状态和属性信息。
  2. CMDBX 和RFC – 存储所有历史信息。

CI 和 ATTRIBUTE 表结构

OneCMDB-DBModel-CI-ATTRIBUTE

CMDBTX 和 RFC 表结构

RFC表用于hibernate中每个子类映射继承的辨别标志discriminator )。这个辨别标志(discriminator )值作为每个RFC子类的类名显示。每个类型的有效列在该类中描述。

一个CI的更改过程如下:

  • 比较一下当前CI和RFC中生成的修改。所有RFC被打包在一起形成一个CMDBTX对象,该CMDBTX对象存储了谁做出的改变的信息。
  • CCB服务可以通过使用RFC辅助功能根据RFC信息执行变更。在这些辅助功能中,策略可以被加载用于拒绝变更。如果同一个CMDBTX中变更中任何一个变更被拒绝,整个CMDBTX也会被拒绝。(译者注:原文中RFC Workers,本处将worker翻译成辅助功能)
  • 所有通过RFC辅助功能的变更对象将被送到后端数据库存储起来,所有RFC信息也被存储起来。

OneCMDB_DBModel-TX-RFC

原文见:http://www.onecmdb.org/wiki/index.php?title=Database_Schema,由OneCMDB中文站翻译,完成于2010年01月04日。

目录

1. 概述

这个文档介绍了如何使用HTTP请求和Web ServicesOneCMDB交互,这使得像Java这样的其他变成语言可以和OneCMDB交互。HTTP和Web Services接口目的是要尽可能简单、实用和强大。

1.1 一些OneCMDB概念

OneCMDB按照面向对象方式组织, 即对象从其他对象继承。这意味着所有配置项(CI)源于另外一个CI,所有CI都从一个已经存在的根派生。有两种风格的配置项:模板和实例,模板描述每个实例必须有什么属性、什么类型,也包含缺省值。实例包含模板中定义的属性对应的值。

  • CI 都有唯一的ID(人类不可读的),而且是不能改变的),他和后端存储紧密相关。
  • CI 具有唯一的别名。别名可以指定和修改,除非别名在别地地方使用。它经常用于OneCMDB XML定义中。
  • CI 具有一个显示名称,它定义CI作为一行文字如何呈现。显示名称通常一个或多个属性值的串联,它在需要显示时被计算。这样好处是CI不必有一个具体的名称,它将随相应值的变化而改变。
  • CI(模板和实例) (templates and instances) 可以在一个XML文档中描述,它可以从OneCMDB中导出,可以导入到OneCMDB中。

2. 范例模型

为了说明向OneCMDB提交的不同的查询和更新命令,定义了一个简单的带实例的模板模型,它用在所有范例中。

2.1 模板模型

CI之间的继承用箭头表示。例如:NetworkDevice模板有CI模板中定义的所有属性,Router模板有NetworkDevice和CI的所有属性。

TemplateDiagram

2.2 实例模型

在此图中箭头表示CI(实例)之间的关联关系。

InstanceDiagram

2.3. OneCMDB XML模型描述

上面的模板和实例模型可以由下面的XML文档定义。这个XML文档可以被导入到OneCMDB中。请注意这只是一个完整文档中的一部分。

<onemcdb>
    <templates>
        <!-- Definition of NetworkDevice Template -->
        <template alias=”NetworkDevicedisplayName=”NetDevice ${primaryIp}>
            <derivedFrom><ref alias=”Ci/></derivedFrom>
            <attribute attAlias=”primaryIp>
                <simpleType>String</simpleType>
            </attribute>
        </template>

        <!-- Definiton of the Router 
            Defines a Complex Attribute of Type Site and Reference Type Reference.
            It also defines the occurrence of values[0..1] meaning that it's not required to have site value 
            but it can not have more than one site. Default policy are [1..1].-->

        <template alias=”Router>
            <derivedFrom><ref alias=”NetworkDevice/></derivedFrom>
            <attribute attAlias=”site>
                <complexType>
                    <ref alias="Site"/>
                    <refType><ref alias="Reference"/></refType>
                </complexType>
                <policy>
                    <minOccurs>0</minOccurs>
                    <maxOccurs>1</maxOccurs>
                </policy>
            </attribute>
        </template>
        ...
    </templates>
    <instances>
        <!-- Definition of an Router instance that has a reference to Site S1 -->
        <Router alias=”R1>
            <primaryIp>192.168.1.2<//primaryIp>
            <site><ref alias=”S1/></site>
        </Router>
        <Site alias=”S1>
            ...
        </Site>
        ....
    </instances>
</onecmdb>

原文见:http://www.onecmdb.org/wiki/index.php?title=OneCMDB_Concepts,由OneCMDB中文站翻译,完成于2010年01月03日。

[译]OneCMDB特点

十二 30
文档翻译 OneCMDB探索

概述

一个独特的CMDB

使用OneCMDB不需要任何数据库模型相关知识。

OneCMDB从配置项(CI)如何储存中提炼出CMDB设计器,这个设计器让我们更关注配置项的组织和他们的属性和关系,而不是SQL查询和类似的C/C++/Java代码。配置项、属性、关系等等都可以在一个图形用户界面中管理。模板的使用和近似面向对象过程使得设计和维护CMDB更容易。最后,CMDB的结构在投入使用后以后也能够很容易扩展和修改。

OneCMDB由一个后端服务(OneCMDB Core)和一个基于Web的用户界面(OneCMDB Desktop)组成。用户界面允许用户查看、修改、浏览CMDB,也允许设计者管理CMDB的数据模型。

OneCMDB有开放的API,则使得他很容易被其他应用(向服务台、变更管理)程序使用。作为开发者,OneCMDB让你专心于应用程序开发,而不是考虑数据库接口和SQL语句。

为什么选择 OneCMDB

开放源代码

容易且完全可配置

  • OneCMDB允许你创建和使用最适合你的CMDB模型。OneCMDB也有一些现成的数据模型,并且都可以改动。

简单而不复杂

  • OneCMDB能让ITIL开发者更快速、更容易开始工作。OneCMDB新引进一个近似面向对象特性到配置管理中,开发者不需要写一行代码就可以创建一个CMDB模型。OneCMDB将开发者从 底层存储配置项关系数据库中解放出来,而不需要任何一个SQL语句。

可选择的数据库

  • OneCMDB能够使用不同类型的关系数据库。

最佳技术方案

  • OneCMDB使用像Spring、Hibernate这样成熟框架用Java语言完成开发。

原文见:http://www.onecmdb.org/wiki/index.php?title=Features,本文为OneCMDB中文站翻译,完成于2009-12-30。

文章目录

OneCMDB是一个为数据中心提供服务的配置管理数据库(configuration management database ,简称CMDB)。存储在数据库中的配置信息可以是硬件、软件、服务、客户、事件、问题、变更请求、文档等等。OneCMDB符合ITIL中描述的IT管理最佳实践要求。

你既可以直接将OneCMDB投入使用,你也可以通过扩展OneCMDB的功能来开发自己的应用程序,例如:开发专属的图形化用户界面、添加修改业务逻辑、第三方应用系统接口程序等等。但需要包含OneCMDB软件的分发授权和额外的工作内容。

OneCMDB 由两个主要部分组成:

  • OneCMDB核心程序(Core)
  • OneCMDB 桌面应用程序(Desktop)

核心程序是一个后台服务程序,它实现所有业务逻辑和数据存储,而桌面应用程序提供一个基于Web的图形化界面去访问核心程序。
Image:OneCMDBoverview.jpg

2 OneCMDB 核心程序(Core)

核心程序实现OneCMDB中业务逻辑和后端数据存储。
Image:OneCMDBCore.jpg

2.1 配置项

一般情况下,通过创建配置项(configuration items,简称CI)的方式将数据保存到CMDB中。一个常见的CI是数据中心中的服务器或者软件。更抽象的CI是某个客户的SLA(service level agreement 服务级别协议,简称SLA)。一个CI可以连接(或引用)其他CIOneCMDB中支持多种引用关系。通过使用CI之间的引用关系,CMDB就可以描述CI之间如何互相联系并以此提供一个环境上下文。并且多个CI都使用的数据可以被存储在一个CI中,其他CI可以引用它。从此,数据可以在同一个地方集中维护了。
Image:OneCMDBCoreCis.jpg
每个配置项都有一组属性,属性用于存储CI的书。一般有两类属性:

  • 固有属性
  • 自定义属性

Image:Ciattr.jpg

2.1.1 固有属性

固有属性是每个配置项都有的属性,他们帮助我们保持对配置项的跟踪。固有属性的值是在创建配置项时产生的,他们很少被修改。

Image:Ciattrident.jpg

  1. Id 是每个配置项的永远不会改变的唯一的字符串,它由OneCMDB系统产生。
  2. Alias 用于导入导出配置项时、用户界面不同的菜单中识别不同的配置项。Alias不能包含特殊的字符和空白分隔符。
  3. Displayname 用于用户界面中显示配置项意义的简短表述,它可以包含有效字符和空白分隔符。
  4. Description 用于用户界面中显示配置项意义的完整表述。
  5. Template 选项 模板标记。即:该属性被设置则这个配置项就是一个模板,template 选项不会显示在用户界面中。
  6. Icon 用于用户界面图形化展示配置项,如果配置项是模板则这个图标会显示成一个字符’T'。

2.1.2 自定义属性

为了利用配置项存储数据,你首先需要添加你自己的属性给配置项。什么属性对你来说是完整的,你就需要存储什么属性到CMDB中。下图是一个关于服务器配置项的简单示例:
Image:Ciattruserdef.jpg

2.1.3 属性值类型

当创建一个类型的时候需要给该类型制定一个值类型,支持以下两类:

  • 简单类型
  • 复杂类型

简单类型是基本的数据类型,例如:字符串、数字等等。
Image:Ciattrtypebuiltin.jpg

复杂类型 是一个到其他配置项连接(或引用),用来进一步描述某个属性。
Image:Ciattrtyperef.jpg

2.1.4 属性值列表

简单类型和复杂类型的属性值都可以构成属性列表,一个叫做“Ip_addresses”的属性实例可以包含一个字符串列表,一个叫做“Harddisks”的属性实例可以包含到harddisk配置项引用列表。

Image:Ciattrlist.jpg

2.2 引用

引用时到其他配置项的连接。有如下几个原因我们需要使用引用:

  • 维护多个配置项中相同的数据是非常困难的,替代办法是:将数据放到一个单一的配置项中病让所有其他的配置项引用它。如果需要修改数据,只需要在OneCMDB中修改这个共用的配置项即可。
  • 查看哪些设施依赖于某一配置项。假如你想重启某个网络交换机,哪些计算机将会受到影响呢?让交换机配置项引用所有连接到它的计算机,OneCMDB将帮助你自动列出所有依赖该交换机的服务器。
  • 发现数据中心中的配置错误。假如一台服务器只能使用一个全局IP地址,我们将IP地址存在它自己的配置项中,并让每个服务器指向它使用的IP地址(IP 地址配置项),OneCMDB将通过计算每个IP地址配置项引用次数来帮助你发现哪个IP地址同时被几个服务器使用。

OneCMDB能处理很多不同的引用类型 ,例如:安装于(Installed On)和依赖于(Depends On)。引用类型在OneCMDB模型文件中的模板里面描述,也可以自己定义引用类型,有如下几个原因我们需要定义不同的引用类型:

  • 影响范围分析,典型应用在处理变更请求时或者事件解决前。例如:想区分“某个服务正常工作依赖于该系统”和“该子系统支持某个服务”。(译者注:一个表示必须,一个表示有用)
  • 过滤关联。如果你设法直观显示不同CI集的关联关系,你可能会发现从错综复杂的图片中找到你需要的关联是困难的。定义不同关联之后你可以选择只显示和硬件实例关联的CI项,并且图片不会过于复杂。

2.3 策略

策略控制着OneCMDB怎样处理配置项的变更。系统有三种不同的策略:

  1. CI策略
  2. 属性策略
  3. 事件策略

策略触发器用于在特定配置项上启用预先定义的策略。需要注意的是要使更改过后策略生效,仅仅点击[Apply]按钮是不够的,你必须重新启动OneCMDB

请注意当前不能在OneCMDB Desktop定义和管理策略。如果你想使用策略,你必须在System View中手工编辑策略对象。

2.3.1 CI策略

控制配置项修改行为,例如:创建、删除、添加属性等等。

2.3.2 属性策略

控制属性的修改行为。

2.3.3 事件策略

用户开发的策略,意味着调用某个Java类中的方法。这一点给了足够的自由度让策略能够处理更多内容。

2.3.4 策略触发器

它是多个策略(CI策略、属性策略或者事件策略)和特定配置项模板之间的连接桥梁。策略将被应用到该模板的所有配置项和所有子配置项。

在当前OneCMDB发布版本中策略触发器只能分配到模板不能分配到实例。 这一点在后续版中考虑。

2.4 作业及触发

作业(Job)是OneCMDB为了执行若干任务而调用的外部程序,一个作业的输入参数被存储在某个配置项中,一个作业的输出可以回填到数据库中新配置项或者已有配置项。

作业在OneCMDB模型文件中定义,因此,OneCMDB中一个作业是否有效取决于哪个数据模型被使用。

作业可以通过手工或者调度的方式触发。

2.5 变更日志

配置项每个单一的变更都会被OneCMDB自动记录并保存在变更日志中。每个变更都分配了一个唯一的RFC-ID(变更请求ID)。当CMDB中同一时间有一系列的变更时,这些变更将被分配一个共同的事务ID(TX-ID)。

2.6 模板

模板充当创建其他配置项的蓝图。
Image:Template.jpg

使用模板有以下几个好处:

  • 使得创建新配置项更简单,因为你不必每次都从头开始。
  • 使得成批更新配置项更简单,因为在模板和基于模板创建的配置项之间有永久的绑定。例如:当你给模板添加一个属性时,所有只要基于该模板创建的已有配置项都会添加这个属性。
  • 让你容易在不同组配置项之间设置限制条件。

2.6.1 继承

继承意味着当一个新配置项被创建时模板中所有属性都会被复制给它,也意味着模板的任何修改都会传递给所有基于它的配置项。像前面描述那样,这个严格的行为通过配置策略来控制。

使用继承有如下几个规则:

  • 一个配置项只能继承一个模板。
  • 一个配置项只能从一个模板继承。
  • 一个模板可以从另外一个模板继承。

请注意在手册和GUI中关于继承特性有几个不同的描述词语,有时候我们说基于(based on),有时候是后代(descendant )或子孙(offspring)。

2.7 模型

2.7.1 模型的概念

OneCMDB使用模型定义CMDB的结构,每个模型能够包含几个部分 、定义模板、引用、实例等等。CMDB系统将要做什么包含什么取决于你可以导入的一个或者几个模型。你可以飞速添加带有更多配置项(含数据)或者新结构或新功能的模型。你也可以导出模型作为备份和在其他地方安装OneCMDB时重复使用。

OneCMDB也有一些关于系统相关信息和系统配置信息的模型,这些模型会被自动加载,用户不用担心他们,只有当你扩展OneCMDB功能或者基于OneCMDB构建自己的应用程序时,你可能对这些模型感兴趣。

2.7.2 模型文件

每个模型用XML语法定义在一个文本文件中。因此,如果有必要可以使用任何文本编辑器来阅读和编辑它。当然也可以通过OneCMDB Desktop来管理它。模型文件格式在开发人员手册V2.0中描述。

一个OneCMDB模型可以在一个或者几个模型文件中定义,这使得实际上可以在一个模型文件中定义模板,而在另一个模型文件中定义配置实例。

2.7.3 可供选择的模型

当前OneCMDB分发文件中包含一个基本的模型,基于这个模型可以对CMDB项目有一个好的开端。分发文件中也包含一个开发好的可以喝NMAP发现系统共同工作的模型,一个开发好的可以和Nagios网络监控系统共同工作的模型。

有关模型的更多信息你可以在模型(本站翻译文章:[译]OneCMDB 模型)文章找到。

原文见:http://www.onecmdb.org/wiki/index.php?title=OneCMDB_Overview_And_Concepts,本文为OneCMDB中文站翻译,完成于2009-12-29。

ITIL v3以后,配置管理进化为“服务资产和配置管理SACM”,换句话说,资产和配置管理不分家。两个流程应该是融合的。从微观上看资产管理设计到CI的所有生命周期状态,而这个服务资产在CMDB中出现的状态为整个生命周期中的一部分。

Lifecycle3large

最好能通过资产管理为统一入口,来完成对CMDB中资产的生命周期管理。例如:一台服务器在到货以后,完成资产入库后,就应该在CMDB中自动创建CI,在上架部署了软件后,有配置资产自动采集工具,采集回详细配置信息后,资产状态就自动变为“部署”,当在运行维护中服务器宕机或者维护时,在资产管理中也能看到更新的信息。下面是建议的服务资产的生命周期状态:

编号 状态名称 状态描述
1 到货 表示为CI的物品在采购以后,被相关部门签收。
2 组装 设备的组件在被组装的过程中
3 维护 该设备处于宕机后的维护状态
4 宕机 该设备处于宕机状态,还未对其进行维护
5 终止 不在处于被部署的状态
6 转移 该设备正在被转移到其它的地点或者机房途中
7 删除 配置项被标记为删除状态
8 库存 设备处于库存中,还没有被部署
9 借出 已被其他单位或者部门借走
10 处理 该设备已经被拆卸,其本身已经不可用
11 保留 该设备已经被某单位或者部门预订,已经不再库存中了
12 返厂 由于设备已经被损坏或者过保,必须被退回厂商
13 部署 CI的默认状态,表示设备处于正常的生产运行状态
14 订购 该设备已经被订购,还未到货,仍然不可用

配置项管理和资产管理的联系和区别。

Service Asset and Configuration Management (SACM) = Configuration Management + Asset Management

Configuration Management
@The Process responsible for maintaining information about Configuration Items required to deliver an IT Service, including their Relationships
@This information is managed throughout the Lifecycle of the CI

Asset Management
@Asset Management is the Process responsible for tracking and reporting the value and ownership of financial Assets throughout their Lifecycle.

本文转自Martin Liu’s Blog,原文地址:http://martinliu.cn/2009/12/13/service-asset-ci-life-cycle/