转到正文

OneCMDB中文

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

存档

作者存档

去年做的省公司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:沟通成本大

项目的参与沟通方可能很多,最多的情况下,可能包括:网络部门、系统部门、安全部门和各个业务部门。沟通的内容主要是配置采集的实施技术方式。其中采集的安全性,风险分析是最重要的部分;在部门多的情况下,面对多种选择的时候,逐一给项目各方说清所有方案,特别是讲清楚利弊是非常耗时的。在充分沟通了所有技术可能性之后,才能做出倾向性选择。逐一这是第一轮沟通,搞清楚了倾向性而已。

挑战2:决策成本大

特别是银行等金融企业,安全性要求特别高。安全风险方面的建议往往是最重要的,他们的建议对配置采集工具的实施具有决定性意义。在各方都充分理解了配置采集工具的架构和安全性之后,就是拍板定夺了。这种逐级的审批和决策是需要较长的周期。

挑战3:前导时间成本太大

在前导时间里,可能还没有部署正式的ADDM采集服务器。在这个阶段里,要配置网络,让以后的采集服务器能够处于能够扫描到所有目标服务器设备。还可能需要在每台服务器上配置相关的准备工作,主要是坚持主机的操作系统的账户、采集协议和安全配置等是否满足配置采集工具的要求。这写工作是一个群众性运动,需要让所有的系统管理员配合。此项工作的设计人员设备多,最好能尽早的开始。

挑战4:用户的期望太大

用户对配置工具的期望主要是集中在深度和细度方面。其实这也不为过,只是在实施的过程中,最好还能把发现工具的一下特有的功能和特殊推广给用户。如软件和硬件的EOL信息,一些开合即用的报表和图形化展示功能,全文搜索等等功能其实都可以给客户带去意想不到的价值 。

本文转自:MartinLiu的博客,原文地址:http://martinliu.cn/2010/04/cmdb-addm-tool-implement-good-practice.html

IT服务管理论坛(itSMF)香港分会制作了ITIL V3词汇对照表,该指南对在大中华地区工作的ITIL研究员很有帮助。

下载地址:

ITIL® V3 英/繁/简 词汇对照〔精装版〕 http://www.itsmf.org.hk/eng/dl/ITILV3GCRG-P2%20v1_0-200905.pdf

OneCMDB使用Hibernate作为数据访问层,默认是支持Oracle数据库的,只需要更改数据访问参数就可以了。

OneCMDB Core中有关数据访问的配置位于<WebAppRoot>/WEB-INF/classes/datasource.xml中,这里WebAppRoot是Web应用的根目录,默认是tomcat-5.5.17/webapps/ROOT,如果找不到搜索一下吧。

datasource.xml原来内容如下:

<bean id="dataSource"
        class="org.onecmdb.core.internal.storage.DataSourceWrapper"
        destroy-method="close" >
        <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
        <property name="url" value="jdbc:hsqldb:hsql://localhost" />
        <property name="username" value="sa" />
        <property name="password" value="" />

        <property name="initialSize" value="0" />
        <property name="maxActive" value="8" />
        <property name="minIdle" value="0" />
        <property name="maxIdle" value="8" />

        <property name="connectionProperties">
            <props>
                <prop key="shutdown">false</prop>
            </props>
        </property>
    </bean>

    <!--  Hibernate configuration taking the 'dataSoure' defintion  -->
    <!--  in account, specifically the dialect to use.              -->
    <!--                                                            -->
    <bean id="hibernateProperties" class="org.onecmdb.core.internal.storage.HibernateProperty">
        <property name="properties">
            <props>
                <prop key="hibernate.dialect">org.onecmdb.core.internal.storage.hibernate.hsql.HypersonicSQL18Dialect</prop>
                <prop key="show_sql">true</prop>
                <prop key="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
            </props>
        </property>
    </bean>

Oracle 10g和Oracle11g修改为下配置:

<bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url"
            value="jdbc:oracle:thin:@localhost:1521:Demo" />
        <property name="username" value="system" />
        <property name="password" value="demotest" />

        <property name="initialSize" value="0" />
        <property name="maxActive" value="8" />
        <property name="minIdle" value="0" />
        <property name="maxIdle" value="8" />

        <property name="connectionProperties">
             <props>
                   <prop key="shutdown">false</prop>
             </props>
        </property>
</bean>

    <bean id="hibernateProperties" class="org.onecmdb.core.internal.storage.HibernateProperty">
        <property name="properties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
                    <prop key="show_sql">true</prop>
                    <prop key="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
                    <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
                    <prop key="hibernate.hbm2ddl.auto">create-update</prop>
                </props>
        </property>
    </bean>

Oracle9i使用以下配置:

<bean id="dataSource"
        class="org.onecmdb.core.internal.storage.DataSourceWrapper"
        destroy-method="close" >
        <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:Demo" />
        <property name="username" value="system" />
        <property name="password" value="demotest" />

        <property name="initialSize" value="0" />
        <property name="maxActive" value="8" />
        <property name="minIdle" value="0" />
        <property name="maxIdle" value="8" />

        <property name="connectionProperties">
            <props>
                <prop key="shutdown">false</prop>
            </props>
        </property>
    </bean>

    <!--  Hibernate configuration taking the 'dataSoure' defintion  -->
    <!--  in account, specifically the dialect to use.              -->
    <!--                                                            -->
    <bean id="hibernateProperties" class="org.onecmdb.core.internal.storage.HibernateProperty">
        <property name="properties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
                <prop key="show_sql">true</prop>
                <prop key="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
                <prop key="hibernate.hbm2ddl.auto">create-update</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
            </props>
        </property>
    </bean>

其中黑体加粗斜体部分为修改的内容,修改好之后重新启动tomcat,即可重新在数据库中建立数据库结构。再次修改hibernate.hbm2ddl.auto属性为update,重启tomcat即可正常使用oracle数据库。

完成之后使用执行ROOT\WEB-INF\classes目录下create-index.sql中的语句建立索引(根据报错情况修改sql语句)。

或者使用附件中的sql文件完成表结构建立(hibernate.hbm2ddl.auto属性设置为update)。附件:onecmdb4Oracle.sql

2008和2009年间从面向服务架构(SOA)的角度建立的重要的一点是,SOA的成功与否可以通过制定可靠的治理策略进行预测。尽管SOA的成功不通 过实现治理策略也可以达成,但其可能性却可能因为潜在的错失了主要目标(开发一种单一的方案来交付服务)而有所折扣。因此,IT服务管理论坛的IT基础设 施库(ITIL)为IT服务管理定义了一系列的最佳实践框架指导,它是IT治理的一个框架,而它的第三个版本,尽管是专为IT而开发的,却可以用作SOA 治理的一般性策略。

那些仅仅熟知ITIL V2的人通常会嘲笑将ITIL用作SOA治理框架的这种思想。从他们这种角度出发,他们可能是对的,因为V2更多的关注在运作流程上而不是服务生命周期。 在ITIL V3中,该框架的重心已经转移,而这种转移只能用面向服务来真正描述。5本ITIL V3的核心书籍被恰如其分的命名为:服务策略、服务设计、服务转换、服务运营以及持续服务改进;证明了ITIL对于面向服务生命周期的理解。

治理在SOA中的角色

因为对于SOA并没有一个单一的,明确的资源,所以SOA这个术语被多方征用来代表他们的利益或安排,就像其它有计划而明确订立的标准一样的问题。然而, 这一主题有足够多的文献可以进行分析,并且从数据上可以得出SOA的两个站得住脚的立场:业务与IT对齐以及软件系统的开发。 在这两种情况中,松耦合,巩固以及共享等等相同的目标都是显而易见的。因为这些方面都是值得去做的,而且应用它们也的确能提升服务交付和整体的灵活性,因 此治理为确保所有的工作都能以这样的方式交付提供了必需的流程、政策、角色和工具。

治理不会魔幻地带来成功;它只是对于那些最容易造成瓶颈或阻碍SOA项目的问题提供了一个框架性的答案。治理提供了一种责任,并且针对与构建和交付服务相 关的决定提供了指导。举例来说,可以赋予治理流程一定的权力来决定业务是否需要投资某一类型的服务,以及这种服务是否符合合理的需求或机会。不仅如此,治 理流程还可以包括业务各个方面的个人,对于开发特定类型的正反两面都能提供更宽阔的视野。

有趣的是,说到提供服务这方面,许多业务都十分复杂因此该服务需要跨部门的参与。举例来说,保险公司对于检查他们是否会提供一项新的保险业务投入力度很 大。他们的决定从检查这个市场开始,分析客户以及之前的清算场景和潜在利润。这一研究的成果又会交给一个多方合作的小组,并对这一新服务从客户服务、会 计、财务管理和技术等角度提供反馈。最后,这个小组将会对有权力的运营执行官提供建议,由他们作出最终决定。

然而,被认为是部门内部的决定通常是由有限范围内的少数人决定的,通常是部门执行官,就算这样的决定将会影响其它部门的成果或能力也是一样。这就是说,如 果一个部门拥有整个服务供应,比如说IT部门,那么要扩展到其它的部门来对于将这一特定的服务提供给业务客户是否能为业务带来价值而作出决定就不太可能 了。当这发生在SOA中时,你最终得到的是狭隘的面向服务,很有可能不能满足业务的预期。

ITIL V3对SOA的支持

首先,ITIL关注于将IT作为服务交付,这抓住了SOA的经常缺失(或者被误解,被忽略)的真正本质之一。那就是,相对于那些将SOA看作是交付软件系 统的一种方法的人而言,ITIL关注的是服务本身。在ITIL中,服务包括了软件、基础设施、帮助台和资产管理等等。因此,这可能是一个治理框架的最佳表 现形式,因为它纯粹是从以服务为中心的角度去关注服务,而不是从技术的角度。

ITIL V3的核心是服务策略的概念,其重点是价值的创造。许多SOA的文献都推崇中间会合的SOA开发方法,以此不得罪任何一方特定的受众。中间会合的方法在设 计服务时,既关注自底向上,也关注自顶向下。然而,这样的自底向上是远远不够的,并且缺乏对业务质量的理解,因此如果包含这样的知识来开发实际上是对创建 新服务的一种损害。ITIL对于价值创造的关注意味着服务交付的第一步,要从一个策略观点出发,而不限制于过去提供这一服务的尝试而产生的结果。

ITIL V3同时还关注服务设计,它使用服务设计包的概念来封装所有的需求,处理依赖与延伸、架构、流程、衡量与矩阵。这一概念是思考如何组织一个SOA项目中产 出的所有工件的一种良好方式。 包含在服务设计中的是服务组合管理和服务目录管理的概念,这与SOA服务注册,服务目录,以及变更与授权的管理是一致的。

最后,服务转换,服务运营和服务提升,关注于将服务交付到市场的流程,保证它的运营性能并对服务进行持续的调整优化。那些通过技术的滤镜来看SOA的人们 会错失这些实践所带来的差别,因为这是在软件工程努力范围之外的。一个服务在部署后可以正确的得以管理的唯一方式就是支持与服务消费者的沟通和监控服务的 使用。再次强调的是,SOA是一个战略计划并需要许多业务人员的努力,它不应当一蹴而就。这一观点在下面的大SOA和小SOA一节中将得到更多说明。

此外,开发者通常假设测试与度量能够得以完成,而且服务本身不需要包括对这些活动的支持。这些短视之处正是着重于以SOA构建软件服务的人们需要运用 ITIL V3框架的原因,由它来保证服务开发不会因为软件工程的偏见而招致不好的后果。

ITIL V3不关注如何构建服务,虽然它本身也很重要。关于交付IT服务方面,有后续的更细节的标准可以遵循,比如TOGAF,ISO/IEC 20000,CMMI,COTIT以及Six Sigma。然而,V3可以指导服务本身的生命周期,这正是我们对SOA的期望,一个统一的达成一致的框架,来定义和指导整个服务的生命周期,从摇篮到坟墓。

大SOA,小SOA以及SOA治理

一个关于SOA治理的讨论如果不涉及关于大SOA和小SOA的争论的话就是不完全的。有一些人认为SOA可以通过一种战术的,IT为中心的方式来实现,即 “小SOA”这个术语的意义,而企业级的SOA就被称作“大SOA”。我相信将ITIL V3应用于SOA治理问题上将会一劳永逸的解决这个争端——只有一种SOA。就算一个组织决定实现以IT为中心的SOA,ITIL V3也证明了将IT作为一种服务交付仍然需要极大的努力和纪律来保证服务的消费者获得合理的服务,并且保证服务满足他们的需求。就算是比整个企业要小的一 个规模,它仍然要求业务实现遵循整个实践模型以确保成功。

任何小规模的SOA都把重点放在应用开发上,并换了一种说法用SOA来表示组件软件架构。最终,这将不是SOA,因为它并没有关注服务的生命周期,而是关 注在定义软件组件间接口和支持模块化的方法。模块化与SOA不是同义的,而其结果与ITIL V3治理驱动下的SOA也是截然不同的。

总结

对于SOA治理解决方案的关注和投资一直都很火爆。在许多这样的情况中,业务都想要找到对于它们自身的SOA而言的最好的治理方法——其中一些疑惑仍然来 自于对SOA本身的疑惑。ITIL V3提供了一个综合的方案来治理一个服务的创建、设计、开发、部署、运营、变更管理以及最后的终止。

作者 JP Morgenthal 译者 黄璜

关于作者

JP Morgenthal是QinetiQ North America的Misson System Group的资深架构主任,为联邦民用事务提供SOA架构指导,同时也是一名独立的分析师。在加入QinetiQ NA以前,JP创立了Avorcor,开发基于SOA的零售/制造业PaaS,这成为了三个获奖的业界解决方案的根基。他同时也经常写关于企业架 构,SOA,云计算等主题方面的博客和文章。Morgenthal也是"企业信息集成:一种实用的方式"一书的作者,该书介绍了使用SOA和语义来简化集 成的方法论。

查看英文原文Using ITIL V3 as a Foundation for SOA Governance

本文转自InfoQ中文站,原文地址:InfoQ: 使用ITIL V3作为SOA治理的基石

车辆历史信息供应商CARFAX、大型零售商、基础架构服务供应商这些全然不同的企业之间有什么共同之处?答案就是他们都遵循IT基础架构库(ITIL)服务管理最佳实践,采用自动化IT管理解决方案以实现重要的业务目标,包括减少服务中断、降低成本、提高IT效率、促进合规遵从等。

对每个公司而言,IT管理战略的核心都是配置管理数据库(CMDB)。CMDB将IT基础架构的所有组件储存为配置项,不仅能维护每个配置项的详细数据,而且能维护各配置项之间的关系数据。同时,CMDB能维护各配置项中包括其事件和变更历史在内的管理数据。通过将这些数据整合到中央存储库,CMDB可为企业洞察管理数据类型之间的因果关系提供保障。

CMDB可实现IT服务支持、IT运维及IT资产管理内部及三者之间的流程整合与自动化。因而,CMDB为业务服务管理(BSM)这全面、统一的IT运行平台奠定了坚实基础。

CMDB所提供的整合服务使工作群组之间的工作流程更加流畅,并实现了端到端的流程自动化。这可以帮助IT提高服务质量,更有效地管理服务,实现持续性合规遵从。为实现这种高水平的集成度和自动化,CMDB所建于的基础架构需满足以下六条重要标准,即联合、灵活的信息模型定义、标准合规、支持内置政策、自动发现和严格的访问控制。

1.联合

CMDB提供IT环境的单一精准信息源,因此,可以将它看做是一个记录IT基础架构数据的中央存储库。但是,将所有基础架构信息存放在一个数据库中很难实现,因为基础架构的类型、各类元素类型及管理数据的类型种类繁多,且各数据类型中也存在着不同的粒度水平。

比较可行的方法是将各个CMDB和其他的数据存储统一到ITIL所定义的配置管理系统(CMS)中。这样,根据IT基础架构和运维管理的不同功能所创建的各个CMDB数据集将共同形成一个整体的企业CMDB

统一多个数据存储需要采用一种联合的方法,并且在创建企业CMDB架构时就须设计考虑到这种联合方法,而不能事后补入。建立在联合架构中的CMDB能接入广泛的信息,而无需将所有数据移动或复制到CMDB中。为确保该方法有效实行,整体企业CMDB中的各个数据存储必须清晰地隶属于不同的功能领域,且满足数据交换、数据核实和数据访问三方面要求。

举例而言,在一家大型服装零售店里, CMDB存储了IT环境的基本信息,并为其他关键、详细的数据存储提供指引。配置项关系和管理信息使工作人员能够将资产与事件和问题相关联,理清事件之间的相互关联信息,从而能从根源上分析事件和问题产生的原因。通过联合方法,CMDB向工作人员提供所需信息,让他们更有效地管理资产生命周期。这将有助于确保企业不会浪费资金,继续支持维护已经过期的资产。

采用联合方法的一项关键要求是具备强大的数据调和能力,以确保多源数据的准确性和一致性。数据调和不仅能消除重复数据,使各部分有且仅有一个配置项,还能确保多源数据连接到正确的配置项。

2.灵活的信息模型定义

CMDB信息模型有两种不同的方式。一种是自上而下,即先有一个宏观的企业视图,在CMDB中为该视图部署一个元数据模型,然后确保所有管理应用程序符合元数据模型。另一种方式是自下而上,即把低层的数据集进行标准化,依此开发元数据模型。

大多数IT机构会选择自下而上的方式。因为采用这种方式,现有的管理数据集能轻松地并入元数据模型中,减少部署工作,加快产生价值。由此产生的元数据模型与具体的管理功能和应用无关,因而比实际上的低层次数据集更易操控,而那些低层次数据集则受制于具体应用所引发的具体管理功能。自下而上方式的另一项优点在于它更易被接受,因为与自上而下的方法不同,它无需破坏企业的组织架构和文化。精心架构的CMDB可同时支持这两种方式,满足IT要求并提供部署CMDB所需的IT灵活性。

3.标准合规

联合架构包含多个CMDB,也就意味着出现多个数据集,因此必须实现各个CMDB之间及数据集之间的互操作性。这就需要标准化的数据交换机制,以确保数据准确,保护数据安全,实现有控制的访问。所以,CMDB架构须在网络服务方面支持如XML和SOA等开放标准。通过标准支持,可实现不同数据存储之间的相互操作,同时确保数据不违反IT部门为其企业CMDB开发的元数据定义的整体性。

4.支持内置政策

精心架构的CMDB可以涵括政策,记录服务及服务相关辅助组件的创建、更新、实施、持续合规追踪等环节中用到的标准。这些服务可以是应用、中间件、系统可用性、数据库、网络设备和操作系统等。服务相关辅助组件可以是网络服务器、数据库服务器、应用服务器、网络设备、客户机等。标准中必须包括数据集的详细信息,如配置、安装、性能和运行时间。政策可能是动态的,并且可能因时间、用户数和服务水平协议(SLA)等因素而变动。

精心架构的CMDB还可涵括流程模型。由于IT环境通常随时间变化而发生变更,那么这些流程模型必须也是动态的,以自动适应这些变更。

由于能够涵括政策和流程模型,CMDB在基于政策的流程自动化中发挥着十分重要的作用。这种自动化能大幅加快流程执行,同时执行最佳实践流程应用。例如,一家专注于卡式支付交易服务、电子支付系统和国际金融信息的基础架构服务供应商应用了CMDB之后,称CMDB可以帮助IT部门在极短时间内高质量高水平地执行所有发布、变更和SLA管理等主动的、前瞻性的流程。

5.自动发现

CMDB须自动发现IT基础架构中的所有资产及其详细信息、各项资产之间的物理和逻辑关系,以及资产与其支持的服务之间的关系。联合方法可以支持自动发现,因为该方法能获得基础架构中任何一项组件的详细信息。

车辆历史信息领先供应商CARFAX依靠自动化工具来发现IT环境中的配置项并将其反馈到CMDB。这些工具还能捕捉组件之间的逻辑依赖关系,并识别哪些IT组件包含企业应用。

传统上,IT利用自动发现功能快速传播库存信息。最新一代的自动发现方案还可定期扫描IT环境,提供特定组件在不同时间点的实时配置信息。对于任何针对组件及其支持的服务所进行的分析而言,实时发现加之按时间顺序产生的一系列实时信息,将有着十分重要的意义。

6.严格的访问控制

在IT领域,未经授权或未预料到的访问和变更会导致服务中断或宕机。因此,安全和访问控制在CMDB设计和部署中发挥着必不可少的作用。访问政策可用于用户和工作群创建资料介绍和访问控制。

CMDB必须符合安全标准,以防止对数据集执行任何未经授权的变更。这些标准可以通过目录进行归档,以确定各个数据集的各自授权访问人员,以及访问人员的数据集操作权限。CMDB具有这种内置的、基于角色的访问控制之后,就可以通过目录访问权限来实现用户身份验证。

配置自动化的基础

精心架构的CMDB能为IT部门奠定坚实的基础,提高服务基础架构的透明度、可靠性以及可控性。结合发现与决策支持应用,CMDB能为构建一个完整的平台提供基础。该平台将能自动化服务配置管理,同时确保IT运维持续遵从企业政策、政府法规、行业标准和最佳实践。(文/万纬科(Vick Vaishnavi),BMC软件公司企业服务管理全球市场副总裁)

本文转自eNetCIO频道:衡量有效CMDB架构的六大标准

建立、实施CMDB应该注意什么?

本人负责并参与过ITIL相关评估与研讨,配置管理与CMDB的建立一直是ITIL建设的核心与难点,在这里谈谈我个人的看法,供大家参考,并希望共同探讨!

首先强调一下配置管理的核心地位:

事件管理、问题管理、变更管理、发布管理都是与配置管理紧密相关的,试想如果CMDB对故障设备的hostname与location提供了错误描述,事件能够得到及时解决吗?如果没有配置管理的同类故障统计分析支持,如何实现主动的问题管理?如果没有配置管理提供CI之间的关系作为依据,如何针对将要进行变更的CI做风险评估?ITIL实施的难点之一就是因为这些管理,并不是相互孤立的,而是相互关联并且相互制约的,而配置管理恰恰就是这些关联的枢纽与核心。

要建立与实施配置管理,要清晰配置管理的相关概念,并避免几个误区

这些概念包括什么是配置管理、什么是CI、什么是CMDBCMDB与DSL/DHS (V3用的是DML)的关系等,建议准备真正实施ITIL的人一定要熟练掌握(个人感觉V3的SACM(服务资产与配置管理)的相关定义比V2描述的更加清晰),在这里我不会具体赘述概念本身,但强调一些大家可能会有的误区。
误区一CMDB= Asset DB,准确说CMDB> Asset DB, 这个大于有两层含义,一 CMDB中的CI包含所有服务资产与IT组建,如设备、服务、系统、人、知识、文档等,远远大于asset db中的设备; 二CMDB是一个更大的逻辑库,更侧重CI组建的逻辑映射与关联,这些关联必定会很立体并远远复杂于Asset DB。
误区二 配置管理=CMDB,这也是很多实施ITIL的人容易有的误区,务须置疑CMDB是配置管理的核心, CMDB的范围与深度,理论上说其实是可以无限扩展和细化的。但是评估配置管理,不是要评估其CMDB有多么多么准确与详尽,而是要看,根据其当前现状(IT资源与运行状况)与管理(范围与深度)的要求,是否去规划、识别、控制、监控、验证各配置项的版本以及相互之间的关系,从而确定基础架构或服务的逻辑模型。所以配置管理CMDB,而是围绕CMDB开展的一系列动作

那么,建立、实施CMDB应该注意些什么?常用工具有哪些?

第一 不要急于求成

要认识到,“罗马不是一天建成的”,实施ITIL、建立“完善”的CMDB永远是一个需要永不停息的追求过程,要充分认识到其艰难性,要做好打持久战的准备。

第二 管理范围要合理、粒度要适度

粒度要适度,是指CI的定义不能过粗,也不宜过细,如何界定过粗、过细的原则和标准呢?说到底是要应该基于管理要求出发(当然管理要求如果越高,投入CMDB初期建设的精力与成本也一定会水涨船高),例如本人在做一家知名网络公司的评估时,发现其管理要求是要细化到硬盘部件级,那CI就一定要细化到部件级,而不能是系统级(整机级)。

第三 CMDB界面要友好

何为友好,就是要可视化、易检索;

第四 要可调和、可联邦

这个有点术语话了,简单解释一下,大家如果看过V3的书会发现V3用CMDB1、CMDB2….替代了V2的CMDB,这也是实际实施ITIL中的现实情况,这就要求不同的CMDB要有集成能力(向下调和),同时要有共享能力(向上联邦)

第五 可维护、可扩展、可更新

没有绝对“完善”的CMDB,但不完善的CMDB要能够通过不断扩展、更新、验证等步骤实现相对的逐步完善。

第六 注意安全保障

无论如何针对记录了完全核心内容的CMDB,一定要注意安全保障,如设定严格的权限访问控制等。

关于CMDB模型与工具,给大家推荐BMC 的 Atrium CMDB模型,是业界普遍认可的理想CMDB模型。

本文转自:智朴人生 – 畅享博客,原文地址: [原创]关于配置管理—建立、实施CMDB应该注意什么?

目录

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的变更历史记录。OneCMDB对CI所有变化都进行跟踪,并存储在一个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

用于查询OneCMDB中CI变更情况对象。

属性:

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日。

参数

实例概览Widget是一个小部件,最复杂的部件。可以配置如下内容:

  • 表格
    • 可见与否
    • 属性顺序
    • 排除/包含 哪些属性
    • 列宽
    • 可见与否
  • 图形
    • 可见与否

这个小部件params 部分支持以下内容:

	<params>
		<rootCI asSimpleList="true">NAGIOS_Host</rootCI>
		<table>
			<visible>true</visible>
			<ColumnFilter asList="true" alias="NAGIOS_Host">
				<Column attAlias="host_name" asList="true" include="true">
					<include>true</include>
					<width>300</width>
				</Column>
				<Column attAlias="address" asList="true">
					<include>true</include>
					<width>300</width>
				</Column>
				<order asSimpleList="true">host_name</order>
				<order asSimpleList="true">address</order>
			</ColumnFilter>
		</table>
		<tree>
			<visible>true</visible>
		</tree>
		<graph>
			<visible>true</visible>
			<applet definitions>
			....
		</graph>			

这个配置将在左侧模板面板中只显示Nagios_Host 模板。

可见列是 host_name 和 address,列宽300像素。显示顺序是先 host_name 后 address。

列可以设置 include为true 或者 exclude为true。如果列过滤器中有任何列标记include为"true" ,则只显示这些列;如果一个或者多个列标记exclude为"true",则这些列将被隐藏而其他列还是可见。

order 指定列显示的顺序,如果并不是所有列指定了顺序,那么剩余的列将在顺序显示列之后按照随机顺序显示。

下面是Nagios 试图的完整范例。

<?xml version="1.0"?>
<CustomView>
	<widgets>
		<widget asList="true" id="cmdb-model-instance-overview">
			<heading>Nagios View</heading>
			<width>650px</width>
			<height>600px</height>
			<params>
				<rootCI asSimpleList="true">NAGIOS_Host</rootCI>
				<rootCI asSimpleList="true">NAGIOS_Hostgroup</rootCI>
				<rootCI asSimpleList="true">NAGIOS_Service</rootCI>
				<rootCI asSimpleList="true">NAGIOS_Servicegroup</rootCI>
				<rootCI asSimpleList="true">NAGIOS_Command</rootCI>
				<rootCI asSimpleList="true">NAGIOS_Timeperiod</rootCI>
				<table>
					<visible>true</visible>
					<ColumnFilter asList="true" alias="NAGIOS_Host">
						<Column attAlias="host_name" asList="true" include="true">
							<include>true</include>
							<width>300</width>
						</Column>
						<Column attAlias="address" asList="true">
							<include>true</include>
							<width>300</width>
						</Column>
					</ColumnFilter>

					<ColumnFilter asList="true" alias="NAGIOS_Service">
							<Column asList="true" attAlias="host_name">
								<include>true</include>
								<width>150</width>
							</Column>
							<Column asList="true" attAlias="service_description">
								<include>true</include>
								<width>200</width>
							</Column>
							<Column asList="true" attAlias="check_command">
								<include>true</include>
								<width>200</width>
							</Column>
							<Column asList="true" attAlias="max_check_attempts">
								<include>true</include>
								<width>50</width>
							</Column>
							<Column asList="true" attAlias="normal_check_intervall">
								<include>true</include>
								<width>50</width>
							</Column>
							<Column asList="true" attAlias="retry_check_intervall">
								<include>true</include>
								<width>50</width>
							</Column>
							<Column asList="true" attAlias="check_period">
								<include>true</include>
								<width>200</width>
							</Column>
							<Column asList="true" attAlias="notification_period">
								<include>true</include>
								<width>150</width>
							</Column>
					</ColumnFilter>
				</table>

				<tree>
					<visible>true</visible>
				</tree>

				<graph>
					<visible>true</visible>
					<code>org.onecmdb.rest.graph.utils.applet.AppletLaunch.class</code>
					<archive>onecmdb/content/Content/applet/onecmdb-applet.jar, onecmdb/content/Content/applet/onecmdb-applet-dependencies.jar</archive>
					<param>
						<url>${baseURL}/onecmdb/query</url>
						<rootCI>Ci</rootCI>
						<appletlaunch.callcode>org.onecmdb.rest.graph.applet.InstanceViewApplet</appletlaunch.callcode>
						<appletlaunch.color.background>FFFFFF</appletlaunch.color.background>
						<appletlaunch.splash>onecmdb/content/Content/applet/applet-loading.gif</appletlaunch.splash>
						<appletlaunch.splasherror>onecmdb/content/Content/applet/applet-error.gif</appletlaunch.splasherror>
						<appletlaunch.version>1.5.0</appletlaunch.version>
						<iconURL>${baseURL}/onecmdb/icon</iconURL>
						<graphBackgroundColor>0x454545</graphBackgroundColor>
					</param>
				</graph>
			</params>
		</widget>
	</widgets>
</CustomView>

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

译者注:这是OneCMDB 1.3.0版本之后的文章,不一定适用新版本OneCMDB

目录

PHP 范例程序

PHP范例程序用表格显示用户定义的CI,这个表格的列是可以配置和编辑的。它们都是用PHP语言编写,并使用OneCMDB 1.3.0 中引入的WebService接口。代码可以在SourceForge下载到。(译者注:直接下载地址是http://sourceforge.net/projects/onecmdb/files/onecmdb%20%28older%20versions%29/1.3.0/php-example-application-0.0.2.zip/download

欲了解更多有关Web Service APIOneCMDB文档,请参考Web ServicesTutorial。(译者注:这里写的Web Services连接页面并没有文章,对应的可参考本站翻译文章:[译]OneCMDB Web Services V2.0。这里的Tutorial连接页面也没有文章,对应的可参考本站翻译文章:[译]OneCMDB 教程V2.0。)

1. 前提条件

  • PHP 5并启用SOAP。
  • http服务器,例如Apache,并做好PHP环境配置。
  • OneCMDB 1.3.0 安装完成。

2. 设置

  • 解压tar文件,并让http服务器可以访问到。
  • 如果OneCMDB不是安装在本机,指定OneCMDB安装位置。
    • 编辑文件onecmdb-tool.php中getOneCMDB_URL()函数。

3. 开始使用

  • 打开页面 http://localhost/onecmdb-php-example/login.php,或者 http服务器安装位置。
  • 登录为用户名admin,密码123。
  • 点击Table View Configuration配置表格。
  • 一旦表格配置好,它将在主页中列出。

3.1 配置表格视图

要添加一个新表,按[添加],然后按下[编辑]进行编辑。

配置一个表格需要填写四个字段。

  • Image
    • 标题中显示的图片URL地址。
  • Title
    • 表格的标题,将显示在主页中。
  • Template
    • 所有这个模板的实例将显示在表格中。
  • Columns
    • 指定要显示的列的表达式,见下文。

3.2 列字段

列字段语法如下:

[ColHeader1,Expr1];[ColHeader2,Expr2];...

这里:

ColHeaderN 将显示在列标头中

ExprN 根据每一行(实例)计算。表达式可以是CI的属性,也可以是CI实例到另外CI的引用。

3.2.1 表达式

对于CI及属性基本的了解,请阅读Web ServicesTutorial 获取更多信息。(译者注:和前面一样,请参阅本站翻译文章[译]OneCMDB Web Services V2.0[译]OneCMDB 教程V2.0。)

  • 简单属性
    • ${alias} CI的别名。
    • ${displayName} CI的显示名称。
    • ${attrAlias} 属性别名的值。
  • 复杂属性(引用)
    • $>attr{attrAlias}|>attr{attrAlias2}
      • 将显示路径attrAlias.attrAlias2的引用CI,该|标志被视为分隔符。
    • <$template{templateAlias}
      • 将显示所有引用此CI的CI。
  • 注意: >attr{alias} 和<template{alias} 可以再同一个表达式组合使用。

3.2.2 范例

列出所有Hadware实例,并带有displayName、Name、Type属性和softwares引用,输入如下内容:

template: Hardware
columns: [ID,${displayName}];[Name,${A_Name}];[Type,${A_Type}];[Software,${K_Software}]

列出所有软件和运行它的硬件,输入如下内容:

template: Software
columns: [ID,${displayName}];[Name,${A_Name}];[Hardware,$<template{Hardware}]

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