169
云计算
负载均衡
产品简介
产品价格
快速入门
用户指南
实践操作
常见问题
购买指南
云服务器
产品简介
计费规则
购买指导
控制台使用指南
常见问题
云数据库
产品简介
计费规则
购买指导
快速入门
连接实例
控制台使用指南
对象存储
产品简介
控制台使用指南
程序员百科
Python
天翼云服务器最佳实践-云主机自定义元数据

产品推荐:

1、安全稳定的云服务器租用,2核/2G/5M仅37元,点击抢购>>>

2、高防物理服务器20核/16G/50M/500G防御仅350元,点击抢购>>>

3、百度智能建站(五合一网站)仅880元/年,点击抢购>>> 模板建站(PC+手机站)仅480元/年,点击抢购>>>

4、阿里云服务器2核2G3M仅99元/年、2核4G5M仅199元/年,新老同享,点击抢购>>> 

5、腾讯云服务器2核2G4M仅99元/年、新老同享,点击抢购>>>   



点击这里点击这里注册天翼云VIP帐号,立即体验云服务器>>>

云主机的元数据(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云主机列表界面选择对应云主机进行远程登录。

console.png

请求查询元数据的内网地址为 169.254.169.254。

我们可以根据上述默认元数据的表格,对所需元数据进行查看,我们可以使用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)

效果:

query_metadata.png

云主机元数据openapi的使用

目前,天翼云提供的元数据openapi提供对云主机自定义元数据进行操作与查看的能力,主要分为创建、更新、查询和删除。通过python示例文档 与openapi对应的文档,可以写出对应的openapi请求。

1、创建自定义元数据

首先,我们通过openapi创建元数据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 = "https://ctecs-global.ctapi.ctyun.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)

结果:

user_defined_metadata.png

2、查询自定义元数据

同时,我们也可以调用openapi接口来查询自定义元数据。

res_metadata_details = get("https://ctecs-global.ctapi.ctyun.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 = "https://ctecs-global.ctapi.ctyun.cn/v4/ecs/metadata/update"
res_metadata_update = post(url, params=update_metadata_params)

在云主机内部进行curl查看情况:

curl_test2.png

*覆盖方式更新(isForce=true)

# 按照创建云数据的openapi文档填写相关参数
update_metadata_params = {
    "regionID": huadong1_region_id,
    "azName": huadong1_az1,
    "instanceID": huadong1_instance,
    "isForce": True,
    "metadata": {
        "test3": "IGs9"
    }
}

# 这里省略post方法的定义,该方法的实现请参考天翼云官网文档中的
url = "https://ctecs-global.ctapi.ctyun.cn/v4/ecs/metadata/update"
res_metadata_update = post(url, params=update_metadata_params)

在云主机内部进行curl查看情况:

curl_test3.png

4、删除自定义元数据

调用删除接口;

res_metadata_delete = post("https://ctecs-global.ctapi.ctyun.cn/v4/ecs/metadata/delete", params=dict(regionID=huadong1_region_id, azName=huadong1_az1, instanceID=huadong1_instance))

在云主机内部进行curl查看情况:

curl_test4.png

示例:通过元数据配置云主机的python环境

场景:在使用python过程中,我们经常需要安装很多依赖包,并且每个包之间互相有版本限制(比如在深度学习框架中,Keras与TensorFlow之间需要版本对应)。此时我们可以通过创建元数据,来记录该云主机所需要的python包环境的版本信息。

首先,console界面远程登录云主机,进入远程界面后,查看当前python包信息:

查看包.png

我们需要将关键的包的版本信息写入。

这里我们以部分包为例,执行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示例文档](https://www.ctyun.cn/document/10026730/10044097)
url = "https://ctecs-global.ctapi.ctyun.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 = "https://pypi.tuna.tsinghua.edu.cn/simple" # 清华镜像站
    send_command("pip install -r %s -i %s" % (FILE_REQUEIRE, tsinghua_image))

执行结果:

result.png

可以看到,云主机的python环境中已经下载了对应的python包。在云主机出现问题时,后续也可以根据对应的python包信息进行相应的再次部署。


这条帮助是否解决了您的问题? 已解决 未解决

提交成功!非常感谢您的反馈,我们会继续努力做到更好! 很抱歉未能解决您的疑问。我们已收到您的反馈意见,同时会及时作出反馈处理!