返回介绍

puppet-ceilometer

发布于 2025-02-18 00:20:47 字数 9394 浏览 0 评论 0 收藏 0

本节作者:韩亮亮

建议阅读时间 1h

ceilometer 是 openstack 的数据收集模块,它把收集 OpenStack 内部发生的大部分事件,为计费和监控以及其它服务提供数据支撑。ceilometer 的架构如下:

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。

  class  { 'ceilometer::keystone::auth':
    password      => 'tralalayouyou'        #这个参数是 puppet-openstack-integratioin 中默认的。
  }

然后执行以下命令

# puppet apply examples/site.pp

等一会 ceilometer 就安装完成了。 验证:

# source openrc
# ceilometer event-list

核心代码讲解

class ceilometer

class ceilometer 中包括 ceilometer 组、用户的创建、软件包的安装,AMQP 的选择及配置。

  package { 'ceilometer-common':
    ensure => $package_ensure,
    name   => $::ceilometer::params::common_package_name,
    tag    => ['openstack', 'ceilometer-package'],
  }

puppet-ceilometer 中对 rpc 的选择主要提供了两种:RabbitMQ 和 amqp,所提供的参数如下:

  if $rpc_backend in [$::os_service_default, 'ceilometer.openstack.common.rpc.impl_kombu', 'rabbit'] {
    oslo::messaging::rabbit {'ceilometer_config':
      rabbit_host                 => $rabbit_host,
      rabbit_port                 => $rabbit_port,
      rabbit_hosts                => $rabbit_hosts,
      rabbit_userid               => $rabbit_userid,
      rabbit_password             => $rabbit_password,
      rabbit_virtual_host         => $rabbit_virtual_host,
      rabbit_ha_queues            => $rabbit_ha_queues,
......
    }
  } elsif $rpc_backend == 'amqp' {
    oslo::messaging::amqp { 'ceilometer_config':
      server_request_prefix  => $amqp_server_request_prefix,
      broadcast_prefix       => $amqp_broadcast_prefix,
      group_request_prefix   => $amqp_group_request_prefix,
      container_name         => $amqp_container_name,
      idle_timeout           => $amqp_idle_timeout,
      trace                  => $amqp_trace,
......
    }
  } else {
    nova_config { 'DEFAULT/rpc_backend': value => $rpc_backend }
  }

ceilometer 通过调用 oslo 的 oslo::messaging::notifications 和 oslo::cache 两个 define 对 oslo_messaging_notifications 和 cache 两个 section 进行配置。

class ceilometer::api

在 class ceilometer::api 中先是定义了以下几个依赖关系:

  Ceilometer_config<||> ~> Service[$service_name]
  Class['ceilometer::policy'] ~> Service[$service_name]

  Package['ceilometer-api'] -> Service[$service_name]
  Package['ceilometer-api'] -> Class['ceilometer::policy']

在上面的代码中我们可以看到有两种符号'->'和'~>',这两者都是描述依赖,只不过不同的是‘->‘是在执行完前面的资源 之后执行后面的资源,而'~>'则是如果前面的资源有变动执行后面的资源。 同时,ceilometer api 支持两种管理方式,独立启动服务和通过 httpd 管理,默认是独立启动,我们可以通过给 class ceilometer::api 传递 service_name 参数进行修改,代码如下:

  if $service_name == $::ceilometer::params::api_service_name {
    service { 'ceilometer-api':
      ensure     => $service_ensure,
      name       => $::ceilometer::params::api_service_name,
      enable     => $enabled,
      hasstatus  => true,
      hasrestart => true,
      require    => Class['ceilometer::db'],
      tag        => 'ceilometer-service',
    }
  } elsif $service_name == 'httpd' {
    include ::apache::params
    service { 'ceilometer-api':
      ensure => 'stopped',
      name   => $::ceilometer::params::api_service_name,
      enable => false,
      tag    => 'ceilometer-service',
    }
    Class ['ceilometer::db'] -> Service[$service_name]

    # we need to make sure ceilometer-api/eventlet is stopped before trying to start apache
    Service['ceilometer-api'] -> Service[$service_name]
  } else {
    fail('Invalid service_name. Either ceilometer/openstack-ceilometer-api for running as a standalone service, or httpd for being run by a httpd server')
  }

其余代码则是对参数进行配置,略过。

class ceilometer::collector

class ceilometer::collector 用于安装 ceilometer 的 collector 服务,依然是装包、配置文件、启动服务。 不过,在中间我们发现了一段代码,不是我们原先熟悉的 package 的方式安装,而是用了 ensure_resource,这两种方式 的不同,在于当我们使用 package 的方式安装软件包,定义重复时会报错,而 ensure_resource 不会,代码如下:

  ensure_resource( 'package', [$::ceilometer::params::collector_package_name],
    { ensure => $package_ensure }
  )

class ceilometer::db

class ceilometer::db 应该和 db 目录下的几个文件放在一起看,ceilometer 默认使用 MySQL 数据库,首先 ceilometer::db::mysql 调用::openstacklib::db::mysql 创建 ceilometer 的数据库,代码如下:

  ::openstacklib::db::mysql { 'ceilometer':
    user          => $user,
    password_hash => mysql_password($password),
    dbname        => $dbname,
    host          => $host,
    charset       => $charset,
    collate       => $collate,
    allowed_hosts => $allowed_hosts,
  }

然后触发 dbsync.而 class ceilometer::db 则调用 oslo::db 配置 ceilometer 中 db 相关参数。

  oslo::db { 'ceilometer_config':
    db_max_retries => $database_db_max_retries,
    connection     => $database_connection,
    idle_timeout   => $database_idle_timeout,
    min_pool_size  => $database_min_pool_size,
    max_retries    => $database_max_retries,
    retry_interval => $database_retry_interval,
    max_pool_size  => $database_max_pool_size,
    max_overflow   => $database_max_overflow,
  }

class ceilometer::keystone::auth

ceilometer::keystone::auth 模块是用来创建 ceilometer 的 endpoint 和 role,其中有这么一段代码:

  ::keystone::resource::service_identity { $auth_name:
    configure_user      => $configure_user,
    configure_user_role => $configure_user_role,
    configure_endpoint  => $configure_endpoint,
    service_type        => $service_type,
    service_description => $service_description,
    service_name        => $service_name_real,
    region              => $region,
    password            => $password,
    email               => $email,
    tenant              => $tenant,
    roles               => ['admin', 'ResellerAdmin'],
    public_url          => $public_url_real,
    admin_url           => $admin_url_real,
    internal_url        => $internal_url_real,
  }

我们可以看到这里调用 keystone::resource::service_identity 这个 define 的时候前面有::符号,这就要讲到 puppet 中的一个概念:域。 puppet 中的域分为 4 种:顶级域、节点域、父域和本地域。在所有的类、定义或节点之外的就是顶级域,如在 site.pp 中定义了一个$v 的参数,那我们可以在任意位置之中使用$::v 来调用它。 节点定义中节点名称后面的一对大括号就是节点域,节点域中定义的变量只能在该节点内调用。 父域和本地域的关系在于继承,如果 class A 通过关键字 inherits 引用了 class B,如下:

class  A{
  $variable = 'v1'
  ...
}
class  B inherits A {
  ...
}

那么我们可以在 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 这个数组转换 为字符串。代码如下:

  $namespaces = [$central_namespace_name, $compute_namespace_name, $ipmi_namespace_name]
  $namespaces_real = inline_template('<%= @namespaces.find_all {|x| x !~ /^undef/ }.join "," %>')

inline_template 用于在代码里使用嵌入式 ruby,它里面的所有参数都会被传递并执行,在<%=和%>分隔符之间的所有代码都以 Ruby 代码来执行。

class ceilometer::agent::notification

这个 class 用于配置 ceilometer 的 notification agent,没有什么好讲的,三步:安装软件包,启动服务,配置参数。

小结

在 puppet-ceilometer 模块中还有一些其他的 class ,如:ceilometer::policy、 ceilometer::client、 ceilometer::config 等,就留给读者自己去阅读了

动手练习

  1. 安装 ceilometer,并且安装 compute 和 central 两个客户端
  2. 配置 ceilometer 运行在 httpd 下
  3. 使用 amqp 替换 RabbitMQ

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文