基础 URL: http://169.254.169.254/latest/ 协议: HTTP GET,无需认证,无需参数 输出格式: 纯文本
1. 基础元数据 (meta-data/)
1.1 实例标识
| 端点 | 功能 | 输出示例 | 说明 |
|---|---|---|---|
meta-data/ami-id | 镜像 ID | ami-00000001 | OpenStack 的 Image UUID 映射为 EC2 格式 |
meta-data/instance-id | 实例 ID | i-00000004 | OpenStack 的 Instance UUID 映射为 EC2 格式 |
meta-data/instance-type | 实例类型 | m1.tiny | 对应 OpenStack 的 Flavor 名称 |
meta-data/reservation-id | 预留 ID | r-1cnh08js | 实例预留批次标识 |
1.2 网络信息
| 端点 | 功能 | 输出示例 | 说明 |
|---|---|---|---|
meta-data/hostname | 主机名 | demo2.novalocal | 实例的完整主机名 |
meta-data/local-hostname | 本地主机名 | demo2.novalocal | 与 hostname 相同 |
meta-data/local-ipv4 | 内网 IPv4 | 10.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 | 镜像清单路径 | FIXME | EC2 兼容字段,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. 注意事项
- 安全性: metadata API 仅能从实例内部访问(169.254.169.254)
- 无认证: 任何在虚拟机内运行的进程都可访问
- 敏感数据: 避免在 user-data 中存储密码等敏感信息
- 网络依赖: 需要实例有正常的网络配置才能访问
- user-data 大小限制: 通常不超过 16KB
10. 与 AWS EC2 的差异
| 特性 | AWS EC2 | OpenStack Nova |
|---|---|---|
ami-manifest-path | 实际 S3 路径 | 固定返回 FIXME |
public-ipv4 | Elastic IP | Floating IP(未分配时为空) |
| 实例 ID 格式 | i-{17位字符} | i-{8位字符} |
| IAM 角色凭证 | 支持 | 不支持 |
| 动态数据 | 支持 | 部分支持 |
测试环境: OpenStack Nova 2025.2 测试日期: 2026-03-12 API 版本: EC2-compatible (2009-04-04)