需求

及时知道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. C++ 非常量引用无效

    /* 非常量引用无效 */ #include <iostream> using namespace std; /* C++标准的规定:非常量的引用不能指向临时对象: 为了防止给常量或临时变 ...

  2. 第四百零三节,python网站在线支付,支付宝接口集成与远程调试,

    第四百零三节,python网站在线支付,支付宝接口集成与远程调试, windows系统安装Python虚拟环境 首先保证你的系统已经安装好了Python 安装virtualenv C:\WINDOWS ...

  3. 基于Gradle的spring boot 项目构建

    今天听只是分享,听到不用maven而使用Gradle构建,就尝试了下 Java三大构建工具:Ant.Maven和Gradle Gradle是一个基于Apache Ant和Apache Maven概念的 ...

  4. Linux下Qt Creator编辑器无法输入中文解决

    Ubuntu安装了搜狗输入法,在浏览器中可以使用,但是在Qt Creator中却无法输入中文. 解决办法: 执行sudo apt-get install fcitx-libs-qt5 该命令将库文件l ...

  5. 关于Kafka producer管理TCP连接的讨论

    在Kafka中,TCP连接的管理交由底层的Selector类(org.apache.kafka.common.network)来维护.Selector类定义了很多数据结构,其中最核心的当属java.n ...

  6. Golang 笔记 4 defer、error、panic

    一.defer语句 defer语句仅能被放置在函数或方法中.它由关键字defer和一个调用表达式组成.这里的表达式所表示的既不能是对Go语言内建函数的调用也不能是对Go语言标准库代码包unsafe中的 ...

  7. 机器人学 —— 机器人感知(Location)

    终于完成了Robotic SLAM 所有的内容了.说实话,课程的内容比较一般,但是作业还是挺有挑战性的.最后一章的内容是 Location. Location 是 Mapping 的逆过程.在给定ma ...

  8. [原]在使用ubuntu14.04,安装devstack的时候报错./stack.sh: line 463: generate-subunit: command not found

    =======在使用ubuntu14.04,安装devstack的时候报错./stack.sh: line 463: generate-subunit: command not found 2016- ...

  9. Python __all__变量用法

    Python中一个py文件就是一个模块,“__all__”变量是一个特殊的变量,可以在py文件中,也可以在包的__init__.py中出现. 1.在普通模块中使用时,表示一个模块中允许哪些属性可以被导 ...

  10. canvas霓虹雨

    在codepen上看到一个Canvas做的下雨效果动画,感觉蛮有意思的.就研究了下,这里来分享下,实现技巧.效果可以见下面的链接. 霓虹雨: http://codepen.io/natewiley/f ...