云主機的元數據(metadata)是描述云主機信息的數據,包含了天翼云系統中的默認元數據信息與用戶自定義的元數據信息。在云主機內部,通過內網可以方便地查看該部分信息,并基于元數據信息配置或管理云主機。
注意本文僅適用于多可用區資源池,非多可用區資源池暫不可參考本文。
云主機默認元數據
云主機創建過后,天翼云云主機會含有默認的元數據,以下為多可用區類型資源池下默認的元數據:
| 元數據說明 | 元數據項 |
|---|---|
| 擁有者天翼云賬號ID | /meta-data/owner-account-id |
| 云主機ID | /meta-data/instance-id |
| 云主機名稱 | /meta-data/hostname |
| 云主機規格名稱 | /meta-data/flavor_name |
| 云主機的資源池ID | /meta-data/region-id |
| 云主機的可用區ID | /meta-data/zone-id |
| 云主機的自定義數據 | /meta-data/user_data |
| 創建云主機時所使用的鏡像ID | /meta-data/image-id |
| 云主機所屬VPC的ID | /meta-data/vpc-id |
| 云主機主網卡的內網IPv4地址 | /meta-data/private-ipv4 |
| 網卡的mac地址列表 | /meta-data/network/interfaces/macs/ |
云主機自定義元數據
除了上述云主機元數據項,用戶也可以增加相應的自定義元數據項。在云主機openapi元數據管理中,api對云主機操作的就是該部分元數據內容。
| 元數據說明 | 元數據項 |
|---|---|
| 一次獲取所有自定義元數據(返回格式為json) | /spec-meta-data |
| 單一自定義元數據獲取 | /meta-data/instance/specs/[key] |
元數據的使用
查看默認元數據
通過console云主機列表界面選擇對應云主機進行遠程登錄。

請求查詢元數據的內網地址為 169.254.169.254。
我們可以根據上述默認元數據的表格,對所需元數據進行查看,對于Windows操作系統,使用用網頁http訪問;對于Linux操作系統,我們可以使用curl命令進行查看,命令組成為:curl 169.254.169.254{元數據項}。
示例shell腳本:
#!/usr/bin/bash
echo "======================instance metadata======================"
echo "instance owner account id: " $(curl -s 169.254.169.254/meta-data/owner-account-id)
echo "instance id: " $(curl -s 169.254.169.254/meta-data/instance-id)
echo "instance id: " $(curl -s 169.254.169.254/meta-data/instance-id)
效果:

云主機元數據openapi的使用
目前,天翼云提供的元數據openapi提供對云主機自定義元數據進行操作與查看的能力,主要分為創建、更新、查詢和刪除。通過python示例文檔 與openapi對應的文檔,可以寫出對應的openapi請求。
1、創建自定義元數據
首先,我們通過openapi來創建自定義元數據({”test1“: "123", "test2": "abc"})。
# 按照創建云數據的openapi文檔填寫相關參數
create_metadata_params = {
"regionID": huadong1_region_id,
"azName": huadong1_az1,
"instanceID": huadong1_instance,
"metadata": {
"test1": "123",
"test2": "abc"
}
}
# 這里省略post方法的定義,該方法的實現請參考天翼云官網文檔中的
url = "//ctecs-global.ctapi.daliqc.cn/v4/ecs/metadata/create"
res_metadata_create = post(url, params=create_metadata_params)
調用結果:
{
"returnObj": {
"instanceID": "c44de03e-300b-7237-1827-b51aeaff3ccd",
"metadata": {
"test1": "123",
"test2": "abc"
}
},
"details": "",
"message": "SUCCESS",
"description": "成功",
"statusCode": 800
}
通過之前的方式,使用自定義元數據項來查詢自定義的元數據信息(test2.sh腳本如下):
#!/usr/bin/bash
echo "======================instance metadata======================"
echo "user-defined metadata: " $(curl -s 169.254.169.254/spec-meta-data)
echo "test1: " $(curl -s 169.254.169.254/meta-data/instance/specs/test1)
echo "test2: " $(curl -s 169.254.169.254/meta-data/instance/specs/test2)
結果:

2、查詢自定義元數據
同時,我們也可以調用openapi接口來查詢自定義元數據。
res_metadata_details = get("//ctecs-global.ctapi.daliqc.cn/v4/ecs/metadata/details", params=dict(regionID=huadong1_region_id, azName=huadong1_az1, instanceID=huadong1_instance))
調用結果:
{
"returnObj": {
"metadata": {
"test1": "123",
"test2": "abc"
}
},
"message": "SUCCESS",
"description": "成功",
"statusCode": 800
}
3、更新自定義元數據
調用更新元數據接口:
# 按照創建云數據的openapi文檔填寫相關參數
update_metadata_params = {
"regionID": huadong1_region_id,
"azName": huadong1_az1,
"instanceID": huadong1_instance,
"metadata": {
"test1": "789"
}
}
# 這里省略post方法的定義,該方法的實現請參考天翼云官網文檔中的
url = "//ctecs-global.ctapi.daliqc.cn/v4/ecs/metadata/update"
res_metadata_update = post(url, params=update_metadata_params)
在云主機內部進行curl查看情況:

*覆蓋方式更新(isForce=true)
# 按照創建云數據的openapi文檔填寫相關參數
update_metadata_params = {
"regionID": huadong1_region_id,
"azName": huadong1_az1,
"instanceID": huadong1_instance,
"isForce": True,
"metadata": {
"test3": "IGs9"
}
}
# 這里省略post方法的定義,該方法的實現請參考天翼云官網文檔中的
url = "//ctecs-global.ctapi.daliqc.cn/v4/ecs/metadata/update"
res_metadata_update = post(url, params=update_metadata_params)
在云主機內部進行curl查看情況:

4、刪除自定義元數據
調用刪除接口;
res_metadata_delete = post("//ctecs-global.ctapi.daliqc.cn/v4/ecs/metadata/delete", params=dict(regionID=huadong1_region_id, azName=huadong1_az1, instanceID=huadong1_instance))
在云主機內部進行curl查看情況:

示例:通過元數據配置云主機的python環境
場景:在使用python過程中,我們經常需要安裝很多依賴包,并且每個包之間互相有版本限制(比如在深度學習框架中,Keras與TensorFlow之間需要版本對應)。此時我們可以通過創建元數據,來記錄該云主機所需要的python包環境的版本信息。
首先,console界面遠程登錄云主機,進入遠程界面后,查看當前python包信息:

我們需要將關鍵的包的版本信息寫入。
這里我們以部分包為例,執行openapi創建云主機的自定義元數據:
# 按照創建云數據的openapi文檔填寫相關參數
create_metadata_params = {
"regionID": huadong1_region_id,
"azName": huadong1_az1,
"instanceID": huadong1_instance,
"metadta": {
"requeirements": {
"requests": "2.27.1",
"numpy": "1.16.6",
"matplotlib": "2.2.5"
}
}
}
# 這里省略post方法的定義,該方法的實現請參考天翼云官網文檔中的[python示例文檔](//www.daliqc.cn/document/10026730/10044097)
url = "//ctecs-global.ctapi.daliqc.cn/v4/ecs/metadata/create"
res_metadata_create = post(url, params=create_metadata_params)
執行結果:
{
"returnObj": {
"instanceID": "c44de03e-300b-7237-1827-b51aeaff3ccd",
"metadata": {
"requeirements": {
"requests": "2.27.1",
"numpy": "1.16.6",
"matplotlib": "2.2.5"
}
}
},
"details": "",
"message": "SUCCESS",
"description": "成功",
"statusCode": 800
}
在創建過元數據后,我們可以在云主機內使用相關腳本,對python進行相應的配置。
python示例腳本(test.py):
import json
import subprocess
HOST = "169.254.169.254"
URL = HOST + "/spec-meta-data"
FILE_REQUEIRE = "requirements.txt"
def send_command(command):
command_ls = command.split()
process = subprocess.Popen(command_ls, stdout=subprocess.PIPE)
output, err = process.communicate()
return output.decode("utf-8")
if __name__ == "__main__":
res = send_command("curl -s %s" % URL)
metadata = json.loads(res)
requeire_info = metadata.get("requeirements")
with open(FILE_REQUEIRE, "w") as f:
for k, v in requeire_info.items():
write_info = "%s==%s" % (str(k), str(v))
f.writelines(write_line)
tsinghua_image = "//pypi.tuna.tsinghua.edu.cn/simple" # 清華鏡像站
send_command("pip install -r %s -i %s" % (FILE_REQUEIRE, tsinghua_image))
執行結果:

可以看到,云主機的python環境中已經下載了對應的python包。在云主機出現問題時,后續也可以根據對應的python包信息進行相應的再次部署。