puppet-aodh模块

  1. 基础知识 - 理解Aodh
  2. 先睹为快 - 一言不合,立马动手?
  3. 核心代码讲解 - 如何管理Aodh服务?
  4. 小结
  5. 动手练习 - 光看不练假把式

0.理解Aodh

Aodh是Openstack告警项目,最初在Havana版本中作为Ceilometer项目的一个组件(ceilometer-alarm)出现在Ceilometer项目中,在Liberty版本中演变成了独立项目Aodh,用户可以为独立事件或者样本设置阈值和告警机制。

Aodh服务由以下组件组成:

名称 说明
openstack-aodh-api 为告警数据的存储和访问提供接口
openstack-aodh-evaluator 根据统计的数据,来评估是否需要触发告警
openstack-aodh-notifier 根据配置的告警方式,发出告警
openstack-aodh-listener 监听事件,触发事件相关的告警

各个组件之间的关系如下图所示:
puppet-aodh模块 - 图1

1.先睹为快

不想看下面大段的代码解析,已经跃跃欲试了?

OK,我们开始吧!

打开虚拟机终端并输入以下命令:

  1. $ puppet apply examples/aodh.pp

等待命令执行完成,Puppet完成了对Aodh服务的安装。

注:部署Aodh服务,依赖于Keystone服务。

2.核心代码讲解

class aodh

class aodh完成了以下三项任务:

  • Aodh common包的安装
  • Aodh配置文件的清理
  • RabbitMQ和AMQP选项的管理

其中rabbit和AMQP相关的选项管理均是通过oslo::messaging::rabbit和oslo::messaging::amqp来管理,关于puppet-oslo模块,将会在下一个章节详细介绍。

  1. oslo::messaging::rabbit { 'aodh_config':
  2. rabbit_userid => $rabbit_userid,
  3. rabbit_password => $rabbit_password,
  4. rabbit_virtual_host => $rabbit_virtual_host,
  5. rabbit_host => $rabbit_host,
  6. rabbit_port => $rabbit_port,
  7. rabbit_hosts => $rabbit_hosts,
  8. rabbit_ha_queues => $rabbit_ha_queues,
  9. heartbeat_timeout_threshold => $rabbit_heartbeat_timeout_threshold,
  10. heartbeat_rate => $rabbit_heartbeat_rate,
  11. rabbit_use_ssl => $rabbit_use_ssl,
  12. kombu_reconnect_delay => $kombu_reconnect_delay,
  13. kombu_ssl_version => $kombu_ssl_version,
  14. kombu_ssl_keyfile => $kombu_ssl_keyfile,
  15. kombu_ssl_certfile => $kombu_ssl_certfile,
  16. kombu_ssl_ca_certs => $kombu_ssl_ca_certs,
  17. kombu_compression => $kombu_compression,
  18. amqp_durable_queues => $amqp_durable_queues,
  19. }

在package资源中,有一个元属性tag:

  1. package { 'aodh':
  2. ensure => $package_ensure_real,
  3. name => $::aodh::params::common_package_name,
  4. tag => ['openstack', 'aodh-package'],
  5. }

tag顾名思义就是标签,资源、类和定义都可以对其标记,一个资源可以有任意数量的标记。有多种标记资源的方式,以上代码是使用了元参数tag,对aodh package资源
添加了2个tag:’openstack’,’aodh-package’。这些tag会在aodh::deps中使用,用于收集标记为aodh-package的package资源:

  1. anchor { 'aodh::install::begin': }
  2. -> Package<| tag == 'aodh-package'|>
  3. ~> anchor { 'aodh::install::end': }

class aodh::api

api的主要是提供数据的接口,为告警数据的提供存储和访问。在class aodh::api中先是定义了以下几个依赖关系:

  1. if $auth_strategy == 'keystone' {
  2. include ::aodh::keystone::authtoken
  3. }
  4. Aodh_config<||> ~> Service[$service_name]
  5. Class['aodh::policy'] ~> Service[$service_name]
  6. Package['aodh-api'] -> Service[$service_name]
  7. Package['aodh-api'] -> Service['aodh-api']
  8. Package['aodh-api'] -> Class['aodh::policy']
  9. package { 'aodh-api':
  10. ensure => $package_ensure,
  11. name => $::aodh::params::api_package_name,
  12. tag => ['openstack', 'aodh-package'],
  13. }

代码中两种符号’->’和’~>’,这两者都是描述资源间的依赖,前面已经介绍过。同时在模块中都同样使用keystone作为认证。API类中其余代码则是对参数进行配置,略过。

class aodh::evaluator

  1. if $manage_service {
  2. if $enabled {
  3. $service_ensure = 'running'
  4. } else {
  5. $service_ensure = 'stopped'
  6. }
  7. }
  8. Package['aodh'] -> Service['aodh-evaluator']
  9. service { 'aodh-evaluator':
  10. ensure => $service_ensure,
  11. name => $::aodh::params::evaluator_service_name,
  12. enable => $enabled,
  13. hasstatus => true,
  14. hasrestart => true,
  15. tag => ['aodh-service','aodh-db-sync-service']
  16. }
  17. )

aodh-evaluator 服务的部署和 aodh-api 类似,配置一些基础配置和 oslo 相关配置,就可以启动服务了。

class aodh::notifier

  1. Package['aodh'] -> Service['aodh-notifier']
  2. service { 'aodh-notifier':
  3. ensure => $service_ensure,
  4. name => $::aodh::params::notifier_service_name,
  5. enable => $enabled,
  6. hasstatus => true,
  7. hasrestart => true,
  8. tag => 'aodh-service',
  9. }
  10. }

class aodh::listener

  1. Package['aodh'] -> Service['aodh-listener']
  2. service { 'aodh-listener':
  3. ensure => $service_ensure,
  4. name => $::aodh::params::listener_service_name,
  5. enable => $enabled,
  6. hasstatus => true,
  7. hasrestart => true,
  8. tag => 'aodh-service',
  9. }
  10. }

小结

从上述的代码中,咱们可清晰看到aodh的安装、数据库创建与同步、认证、api、evaluator、notifier、listener服务的配置、启动、管理。源于aodh手动部署文档。

动手练习

  1. 配置Aodh运行在httpd下运行
  2. 使用AMQP替换RabbitMQ