需求

及时知道vm,硬盘,镜像,网络设备、负载均衡器状态变化

分析

Dashboard中也是通过定时使用ajax调用API来获取虚拟机的状态信息的
定时轮训的方式过于被动

解决方案

共用rabbitmq

实现方法

Nova

  • 配置nova.conf
    vi /etc/nova/nova.conf
    notification_driver = nova.openstack.common.notifier.rpc_notifier
    notify_on_state_change=vm_state
  • 重启nova服务
    systemctl restart openstack-nova-compute.service
  • 监听rabbitmq
    routing_key:notification.info
    exchange:nova
  • 查看event_type为:compute.instance.update的消息,同时判断payload中state和old_state的值
  • 当两个值不一致的时候做相应的操作(更新数据库等)

Neutron

  • 监听rabbitmq
    routing_key:notification.info
    exchange:neutron
  • 查看event_type为:参考excel给定名称
  • 当操作开始的时候有start消息,成功结束后由end消息,但是如果操作失败则没有end消息

Glance

  • 修改glance-registry.conf、glance-api.conf
    notification_driver = messaging
    rpc_backend = rabbit
    rabbit_host = controller
    rabbit_password = RABBIT_PASS
  • 重启服务
    systemctl restart openstack-glance-api.service openstack-glance-registry.service
  • 监听rabbitmq
    routing_key:notification.info
    exchange:openstack
  • 查看event_type为:参考excel给定名称
  • 当操作开始的时候有start消息,成功结束后由end消息,但是如果操作失败则没有end消息

Cinder

  • 修改cinder.conf
    control_exchange = cinder
    notification_driver = cinder.openstack.common.notifier.rpc_notifier
  • 重启服务
    控制节点
    systemctl restart openstack-cinder-api.service openstack-cinder-scheduler.service
    存储节点
    systemctl restart openstack-cinder-volume.service
  • 监听rabbitmq
    routing_key:notification.info
    exchange:cinder
  • 查看event_type为:参考excel给定名称
  • 当操作开始的时候有start消息,成功结束后由end消息,但是如果操作失败则没有end消息

负载均衡

暂时没有这个机制,需要添加

ps

监听rabbitmq的时候不能直接监听notification.info队列,这样会造成消息被接收后,其他监听这个队列的消费者就获取不到消息了
所以只要监听routing_key是notification.info就可以了,即使用订阅模式

测试脚本

#!/usr/bin/env python
import pika
import json credentials = pika.PlainCredentials('guest', 'RABBIT_PASS')
params = pika.ConnectionParameters(host='xxx',credentials=credentials)
connection = pika.BlockingConnection(params)
channel = connection.channel() exchange_name = 'nova'
queue_name = channel.queue_declare(exclusive=True).method.queue
binding_key = 'notifications.info' channel.exchange_declare(exchange=exchange_name,type='topic')
channel.queue_bind(exchange=exchange_name,
queue=queue_name,
routing_key=binding_key) print ' [*] Waiting for logs. To exit press CTRL+C' def callback(ch, method, properties, body):
b= json.loads(body)
print b['event_type'],b['payload']['state'], b['payload']['old_state']
# for key,value in b.iteritems():
# print key,':',value channel.basic_consume(callback,queue=queue_name,no_ack=True)
channel.start_consuming()

参考(需墙)

https://prosuncsedu.wordpress.com/2014/01/08/notification-of-actions-in-openstack-nova/

OpenStack-RabbitMQ-获取vm、磁盘、网络设备的状态变化的更多相关文章

  1. 获取windows磁盘的可用空间函数

    <?php /* *获取某个磁盘的剩余空间 *$param 关联数组,下标是哪个盘,单位,可以是B,KB,MB,GB *可以设置获取多个磁盘,例如:array('C'=>'KB','D'= ...

  2. C++ 通过WIN32 API 获取逻辑磁盘详细信息

    众所周知,在微软的操作系统下编写应用程序,最主要的还是通过windows所提供的api函数来实现各种操作的,这些函数通常是可以直接使用的,只要包含windows.h这个头文件, 下载源文件 今天我们主 ...

  3. iphone获取当前磁盘信息

    获取iphone磁盘总大小.已使用空间.空闲空间 [代码]悦德财富:https://www.yuedecaifu.com 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  4. C++通过WIN32 API获取逻辑磁盘详细信息

      众所周知,在微软的操作系统下编写应用程序,最主要的还是通过windows所提供的api函数来实现各种操作的,这些函数通常是可以直接使用的,只要包含windows.h这个头文件. 今天我们主要介绍的 ...

  5. [AWS vs Azure] 云计算里AWS和Azure的探究(5) ——EC2和Azure VM磁盘性能分析

    云计算里AWS和Azure的探究(5) ——EC2和Azure VM磁盘性能分析 在虚拟机创建完成之后,CPU和内存的配置等等基本上是一目了然的.如果不考虑显卡性能,一台机器最重要的性能瓶颈就是硬盘. ...

  6. 使用wesocket从 rabbitMQ获取实时数据

    rabbitmq支持stomp组件,通过stomp组件和websocket可以从rabbitMQ获取实时数据.这里分享一个demo: 使用时需要引入的js ,用到了sock.js和stomp.js & ...

  7. openstack 使用cloud init 和 console-log, nbd或者libguestfs 获取VM中的硬件信息。

    以获取PCI的信息为例. 基本代码: pci.py import base64 import guestfs from functools import partial import os impor ...

  8. openstack上创建vm实例后,状态为ERROR问题解决

    问题说明:在openstack上创建虚拟机,之前已顺利创建了n个centos6.8镜像的vm现在用ubuntu14.04镜像创建vm,发现vm创建后的状态为ERROR! 1)终端命令行操作vm创建 [ ...

  9. 通过递增快照备份 Azure 非托管 VM 磁盘

    概述 Azure 存储提供创建 Blob 快照的功能. 快照将捕获该时间点的 Blob 状态. 本文介绍有关如何使用快照维护虚拟机磁盘备份的方案. 如果选择不使用 Azure 备份和恢复服务,但想要为 ...

随机推荐

  1. Sword 内核队列一

    1.gfifo概述 gfifo是一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只 ...

  2. DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流。

    UDP编程: DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流. DatagramPacket(信件):数据包,是UDP下进行传输数 ...

  3. 关于FastJSON

    https://github.com/alibaba/fastjson/wiki/Quick-Start-CN FastJSON常见问题 FastJson和get方法的问题 使用SimplePrope ...

  4. Flask-SQLAlchemy 中多表链接查询(不使用外键)

    SQLAlchemy 是一个功能强大的 ORM . Flask-SQLAlchemy 是一个 Flask 插件,它让我们在 Flask 框架中使用 SQLAlchemy 变得更容易. 本篇介绍我在使用 ...

  5. java应用监控工具

    http://hao.jobbole.com/category/java/java-monitoring/

  6. C#简单三层结构设计UI、BLL、DAL、Model实际项目应用例子

    C#简单三层结构设计UI.BLL.DAL .Model实际项目应用例子 在实际项目中,程序设计都有他的层次结构,比如MVC.MVP.普通的三层结构等等,不过现在用三层结构的相比可能少了,但是也有一些小 ...

  7. Assembly.LoadFrom加载程序集类型转换失败解决方法

    为了让我的wcf模块框架支持自定义通道上下文,对代码又进行了一次小型的重构,测试时发现类型转换的错误,最后发现是loadfrom引起的.如果向 loadfrom 上下文中加载了一个程序集,则将激活 l ...

  8. PHP异常处理、错误捕获和自动加载的一些总结

    <?php // 设置顶层异常处理器 set_exception_handler('exceptionHandler'); function exceptionHandler($e) { ech ...

  9. [Educational Round 3][Codeforces 609F. Frogs and mosquitoes]

    这题拖了快一周_(:з」∠)_就把这货单独拿出来溜溜吧~ 本文归属:Educational Codeforces Round 3 题目链接:609F - Frogs and mosquitoes 题目 ...

  10. Linux在终端命令行模式下智能补全功能以及组合键

    linux命令行下也有很多热键(快捷键).先来看看tab键 1.如果想看看linux下以c开头的命令可直接在命令行下敲入c然后连续敲两次tab,再选择y,会显示所有以c开头的命令. 2.涉及到文件时, ...