1. 场景

云计算环境中,当虚拟机启动时难免需要做一些初始化配置,这必然涉及到虚拟机如何获取数据,谁又提供这些数据的问题。当然,这里不得不提AWS,他们想到在虚拟机内使用一个固定的IP来获取一些相关数据(metadata:元数据),进而完成一些配置工作。而OpenStack继承了这种设计。自然,这里还有一些很不错的工具,例如: cloudinit (http://cloudinit.readthedocs.org/en/latest/)。它被安装在制作好的镜像中,当镜像派生出实例虚拟机时,在虚拟机内的cloudinit与元数据服务配合完成初始化工作。cloudinit 功能很强大,可以分加载层次(可以在boot层次上加载,也可以在操作系统之上加载),还可以分频率(只运行一次,每天......)运行等等,当然在这里它是题外话。

目前cloudinit在windows系的镜像中是不支持的,也许你不需要一个这么大而全的工具的时候,你只想在虚拟机系统启动时通过读取自己的metadata api完成一些小设置,那么这里会告诉你一个基本的例子。

2. 目录结构

假设你已经有一套部署好的OpenStack,这里以单节点OpenStack为例。

你可以通过以下命令,查找到nova api源码所在的目录(当然,这里你也可以直接下源码查看)。

cd /
locate nova/api

切换到nova api 的源码目录

cd /usr/lib/python2.7/dist-packages/nova/api/
#安装tree(apt-get install tree)
tree -d

其中metadata目录就是metadata api所在源码,再进去一探究竟,内部文件如下:

3. 虚机访问元数据服务

在我的OpenStack环境中是有一台虚拟机的,进入其系统,查看一下元数据服务的情况,这里的情况正常

再查看内部的metadata,记住里面的这些api,它们都会在源码中出现哦

4. metadata源码中的对应点

退出虚拟机系统,回到OpenStack的/usr/lib/python2.7/dist-packages/nova/api/metadata目录。

打开(vi/nano) base.py文件,找到(这里请熟练使用vi,nano或其他编辑工具)InstanceMetadata类的get_ec2_metadata方法,

在方法内部有一个metadata字典,看到了什么?是不是与虚拟机内通过 http://169.254.169.254/latest/meta-data  获取的列表是一致的!

这里这些api都是可以访问的

 

5. 添加自己的metadata api

这里只是简单例子,详细的扩展需要涉及更多。

这里这个例子实现的功能是 虚拟机通过元数据API访问获取OpenStack系统的系统时间。

openstack 数据库的增删改查 openstack metadata_openstack 数据库的增删改查

在源码文件底部定义一个get_system_time函数,保存文件

openstack 数据库的增删改查 openstack metadata_运维_02

重启nova-api

sudo service nova-api restart


6. 验证

重新进入虚拟机系统,使用如下URL,就可以获取时间

curl http://169.254.169.254/latest/meta-data/get_system_time

openstack 数据库的增删改查 openstack metadata_运维_03