需求
及时知道vm状态的变化
分析
Dashboard中也是通过定时使用ajax调用API来获取虚拟机的状态信息的
定时轮训的方式过于被动
解决方案
共用rabbitmq
实现方法
配置nova.conf(类似配置ceilomter)
vi /etc/nova/nova.conf
notification_driver = nova.openstack.common.notifier.rpc_notifier
notify_on_state_change=vm_and_task_state
重启nova服务
监听的rabbitmq
routing_key:notification.info
exchange:nova
查看event_type为:compute.instance.update的消息,同时判断payload中state和old_state的值(根据event_type的名称我们也可以看出操作虚拟时一个动作后面的流程)
当两个值不一致的时候做相应的操作(更新数据库等)
测试脚本
#!/usr/bin/env python
import pika
import json
credentials = pika.PlainCredentials(‘xxx‘, ‘xxx‘)
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()
参考(需墙)
原文:http://www.cnblogs.com/smallcoderhujin/p/4316456.html