1. 场景
云计算环境中,当虚拟机启动时难免需要做一些初始化配置,这必然涉及到虚拟机如何获取数据,谁又提供这些数据的问题。当然,这里不得不提AWS,他们想到在虚拟机内使用一个固定的IP(http://169.254.169.254)来获取一些相关数据(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系统的系统时间。
在源码文件底部定义一个get_system_time函数,保存文件
重启nova-api
sudo service nova-api restart
6. 验证
重新进入虚拟机系统,使用如下URL,就可以获取时间
curl http://169.254.169.254/latest/meta-data/get_system_time
来源:oschina
链接:https://my.oschina.net/u/553781/blog/603044