puppet-ceilometer
本节作者:韩亮亮
建议阅读时间 1h
ceilometer服务
名称 | 说明 |
openstack-ceilometer-api | 用于调用和查看collector收集的数据 |
openstack-ceilometer-collector | 用于收集和记录polling和notification传过来的事件和计量数据 |
openstack-ceilometer-notification | 用于监听消息队列,把感兴趣的监听消息变成Events和Samples,并发送到pipeline。 |
openstack-ceilometer-polling | 用于获取openstack组件的信息,并生成监控数据,有三种启动类型:compute、central、ipmi。 |
ceilometer数据
名称 | 说明 |
Sample | 某一个时间点获取到的监控数据 |
Event | 就是一个事件、一个动作,如创建虚拟机、创建硬盘等。 |
ceilometer收集数据方式
名称 | 说明 |
Bus listener agent | 通过监听消息队列来获取信息,官方首选。 |
Polling agents | 通过调用API来收集信息。 |
先睹为快
由于ceilometer依赖很多服务,所以最好先部署一个openstack,我们可以使用下一站章节的puppet-openstack-integration或devstack部署一套简易版openstack。
部署ceilometer: 在examples/site.pp里添加下面的代码,因为默认的site.pp里没有创建endpoint,role。
然后执行以下命令
等一会ceilometer就安装完成了。 验证:
核心代码讲解
class ceilometer
class ceilometer中包括ceilometer组、用户的创建、软件包的安装,AMQP的选择及配置。
puppet-ceilometer中对rpc的选择主要提供了两种:RabbitMQ和amqp,所提供的参数如下:
ceilometer通过调用oslo的oslo::messaging::notifications和oslo::cache两个define 对oslo_messaging_notifications和cache两个section进行配置。
class ceilometer::api
在class ceilometer::api中先是定义了以下几个依赖关系:
在上面的代码中我们可以看到有两种符号'->'和'~>',这两者都是描述依赖,只不过不同的是‘->‘是在执行完前面的资源 之后执行后面的资源,而'~>'则是如果前面的资源有变动执行后面的资源。 同时,ceilometer api支持两种管理方式,独立启动服务和通过httpd管理,默认是独立启动,我们可以通过给class ceilometer::api传递service_name参数进行修改,代码如下:
其余代码则是对参数进行配置,略过。
class ceilometer::collector
class ceilometer::collector用于安装ceilometer的collector服务,依然是装包、配置文件、启动服务。 不过,在中间我们发现了一段代码,不是我们原先熟悉的package的方式安装,而是用了ensure_resource,这两种方式 的不同,在于当我们使用package的方式安装软件包,定义重复时会报错,而ensure_resource不会,代码如下:
class ceilometer::db
class ceilometer::db应该和db目录下的几个文件放在一起看,ceilometer默认使用MySQL数据库,首先ceilometer::db::mysql调用::openstacklib::db::mysql创建ceilometer的数据库,代码如下:
然后触发dbsync.而class ceilometer::db则调用oslo::db配置ceilometer中db相关参数。
class ceilometer::keystone::auth
ceilometer::keystone::auth模块是用来创建ceilometer的endpoint和role,其中有这么一段代码:
我们可以看到这里调用keystone::resource::service_identity这个define的时候前面有::符号,这就要讲到 puppet中的一个概念:域。 puppet中的域分为4种:顶级域、节点域、父域和本地域。在所有的类、定义或节点之外的就是顶级域,如在site.pp 中定义了一个$v的参数,那我们可以在任意位置之中使用$::v来调用它。 节点定义中节点名称后面的一对大括号就是节点域,节点域中定义的变量只能在该节点内调用。 父域和本地域的关系在于继承,如果class A通过关键字inherits引用了class B,如下:
那么我们可以在class B中通过$::A::variable的方式调用该变量.
返过来看我们这段代码, ::keystone::resource::service_identity 这个调用前面使用::是在顶级域中搜索 keystone模块,这么看是不是就清晰多了。
class ceilometer::agent::auth
class ceilometer::agent::auth用于配置ceilometer中的keystone配置,默认密码没有配置,所以在调用该 class的时候必需传该参数。在class里会把传进的参数传到ceilometer_config,在class ceilometer::config 里调用。
class ceilometer::agent::polling
class ceilometer::agent::polling用于安装ceilometer polling agent,当然主要的还是那三板斧, 安装软件包、配置参数、启动服务。除这之外我们可以看到根据central_namespace、compute_namespace、ipmi_namespace三个参数,进行了不同的配置,并且通过inline_template调用ruby把namespaces这个数组转换 为字符串。代码如下:
inline_template用于在代码里使用嵌入式ruby,它里面的所有参数都会被传递并执行,在<%=和%>分隔符之间的所有代码都以Ruby代码来执行。
class ceilometer::agent::notification
这个class用于配置ceilometer的notification agent,没有什么好讲的,三步:安装软件包,启动服务,配置参数。
小结
在puppet-ceilometer模块中还有一些其他的class,如:ceilometer::policy、 ceilometer::client、 ceilometer::config等,就留给读者自己去阅读了
动手练习
安装ceilometer,并且安装compute和central两个客户端
配置ceilometer运行在httpd下
使用amqp替换RabbitMQ
Last updated