1. 場景python
雲計算環境中,當虛擬機啓動時不免須要作一些初始化配置,這必然涉及到虛擬機如何獲取數據,誰又提供這些數據的問題。固然,這裏不得不提AWS,他們想到在虛擬機內使用一個固定的IP(http://169.254.169.254)來獲取一些相關數據(metadata:元數據),進而完成一些配置工做。而OpenStack繼承了這種設計。天然,這裏還有一些很不錯的工具,例如: cloudinit (http://cloudinit.readthedocs.org/en/latest/)。它被安裝在製做好的鏡像中,當鏡像派生出實例虛擬機時,在虛擬機內的cloudinit與元數據服務配合完成初始化工做。cloudinit 功能很強大,能夠分加載層次(能夠在boot層次上加載,也能夠在操做系統之上加載),還能夠分頻率(只運行一次,天天......)運行等等,固然在這裏它是題外話。shell
目前cloudinit在windows系的鏡像中是不支持的,也許你不須要一個這麼大而全的工具的時候,你只想在虛擬機系統啓動時經過讀取本身的metadata api完成一些小設置,那麼這裏會告訴你一個基本的例子。windows
2. 目錄結構api
假設你已經有一套部署好的OpenStack,這裏以單節點OpenStack爲例。python2.7
你能夠經過如下命令,查找到nova api源碼所在的目錄(固然,這裏你也能夠直接下源碼查看)。curl
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環境中是有一臺虛擬機的,進入其系統,查看一下元數據服務的狀況,這裏的狀況正常url
再查看內部的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