OpenStack Nova EC2 格式 Metadata API 完整参考

8 阅读4分钟

基础 URL: http://169.254.169.254/latest/ 协议: HTTP GET,无需认证,无需参数 输出格式: 纯文本


1. 基础元数据 (meta-data/)

1.1 实例标识

端点功能输出示例说明
meta-data/ami-id镜像 IDami-00000001OpenStack 的 Image UUID 映射为 EC2 格式
meta-data/instance-id实例 IDi-00000004OpenStack 的 Instance UUID 映射为 EC2 格式
meta-data/instance-type实例类型m1.tiny对应 OpenStack 的 Flavor 名称
meta-data/reservation-id预留 IDr-1cnh08js实例预留批次标识

1.2 网络信息

端点功能输出示例说明
meta-data/hostname主机名demo2.novalocal实例的完整主机名
meta-data/local-hostname本地主机名demo2.novalocal与 hostname 相同
meta-data/local-ipv4内网 IPv410.0.0.165实例的私有网络 IP
meta-data/public-hostname公网主机名demo2.novalocal公网可解析主机名(无公网时为内网主机名)
meta-data/public-ipv4公网 IPv4(空)浮动 IP/弹性 IP(此实例未分配)

1.3 安全与启动

端点功能输出示例说明
meta-data/security-groups安全组default实例所属安全组名称
meta-data/ami-launch-index启动索引0批量启动时的序号(单实例为 0)
meta-data/instance-action实例动作none当前执行的实例操作(正常运行为 none)
meta-data/ami-manifest-path镜像清单路径FIXMEEC2 兼容字段,OpenStack 中未实现

2. 块设备映射 (meta-data/block-device-mapping/)

端点功能输出示例说明
meta-data/block-device-mapping/ami镜像块设备vda镜像使用的块设备名
meta-data/block-device-mapping/root根设备/dev/vda根文件系统的设备路径

用途: 用于识别启动盘和数据盘的设备名称。


3. 放置信息 (meta-data/placement/)

端点功能输出示例说明
meta-data/placement/availability-zone可用区nova实例所在的可用区

用途: 多区域部署时确定实例位置。


4. SSH 公钥 (meta-data/public-keys/)

4.1 列出密钥索引

curl http://169.254.169.254/latest/meta-data/public-keys/

输出: 0=mykey 格式: {索引}={密钥名称}

4.2 获取公钥内容

curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key

输出:

ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNG8cdUe5lESl70+2D59wiN2r9R0S713HNnTdzBv+76YMvWDD8XQt95Q6n5OSrzK1GdVOcF0w+pY0fh4XiW5EJY= root@xs1274

用途: cloud-init 自动配置 SSH 访问。


5. 用户数据 (user-data)

curl http://169.254.169.254/latest/user-data

输出:

  • 成功: 启动时注入的用户数据(脚本、cloud-config 等)
  • 失败: HTTP 404(此实例未设置 user-data)

典型格式:

  • Shell 脚本: #!/bin/bash\n...
  • Cloud-config: #cloud-config\n...
  • 任意文本数据

用途: 实例初始化自动化(安装软件、配置环境等)。


6. 完整端点清单

6.1 目录类端点(返回子项列表)

/latest/
/latest/meta-data/
/latest/meta-data/block-device-mapping/
/latest/meta-data/placement/
/latest/meta-data/public-keys/

6.2 数据类端点(返回具体值)

基础信息:

  • /latest/meta-data/ami-id
  • /latest/meta-data/ami-launch-index
  • /latest/meta-data/ami-manifest-path
  • /latest/meta-data/hostname
  • /latest/meta-data/instance-action
  • /latest/meta-data/instance-id
  • /latest/meta-data/instance-type
  • /latest/meta-data/reservation-id

网络信息:

  • /latest/meta-data/local-hostname
  • /latest/meta-data/local-ipv4
  • /latest/meta-data/public-hostname
  • /latest/meta-data/public-ipv4
  • /latest/meta-data/security-groups

块设备:

  • /latest/meta-data/block-device-mapping/ami
  • /latest/meta-data/block-device-mapping/root

放置:

  • /latest/meta-data/placement/availability-zone

密钥:

  • /latest/meta-data/public-keys/0/openssh-key

用户数据:

  • /latest/user-data

7. 版本兼容性

支持的 API 版本:

1.0, 2007-01-19, 2007-03-01, 2007-08-29, 2007-10-10,
2007-12-15, 2008-02-01, 2008-09-01, 2009-04-04, latest

推荐: 使用 latest 获取最新特性。


8. 常见使用场景

8.1 获取实例内网 IP

LOCAL_IP=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)

8.2 确定实例类型

INSTANCE_TYPE=$(curl -s http://169.254.169.254/latest/meta-data/instance-type)

8.3 读取用户数据执行初始化脚本

curl -s http://169.254.169.254/latest/user-data | bash

8.4 检查是否分配公网 IP

PUBLIC_IP=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4)
if [ -z "$PUBLIC_IP" ]; then
    echo "无公网 IP"
else
    echo "公网 IP: $PUBLIC_IP"
fi

9. 注意事项

  1. 安全性: metadata API 仅能从实例内部访问(169.254.169.254)
  2. 无认证: 任何在虚拟机内运行的进程都可访问
  3. 敏感数据: 避免在 user-data 中存储密码等敏感信息
  4. 网络依赖: 需要实例有正常的网络配置才能访问
  5. user-data 大小限制: 通常不超过 16KB

10. 与 AWS EC2 的差异

特性AWS EC2OpenStack Nova
ami-manifest-path实际 S3 路径固定返回 FIXME
public-ipv4Elastic IPFloating IP(未分配时为空)
实例 ID 格式i-{17位字符}i-{8位字符}
IAM 角色凭证支持不支持
动态数据支持部分支持

测试环境: OpenStack Nova 2025.2 测试日期: 2026-03-12 API 版本: EC2-compatible (2009-04-04)