user-data 是什么
user-data 是创建实例时传入的一段自定义数据,实例首次启动时由 cloud-init 读取并执行,用来完成装包、写配置、注册监控、加入集群等初始化动作。它只在首次启动阶段生效,是把手工装机步骤标准化成模板的主要手段,也是弹性伸缩伸缩出来的实例能自动就绪的原因。
基本信息
| 适用平台 | 主流公有云创建实例参数;Linux 依赖 cloud-init,Windows 走 EC2Launch/Sysprep 类机制 |
|---|---|
| 执行时机 | 实例首次启动的 cloud-init 初始化阶段 |
| 传入格式 | 云 API 通常要求 Base64 编码,控制台可粘贴明文 |
| 常见类型 | #cloud-config(YAML)与 shell 脚本两类,按首个字符识别 |
| 排查入口 | guest 内 cloud-init 日志与控制台的启动日志输出 |
典型使用场景
- 统一初始化规范:新建实例自动装 agent、写时区与 hosts
- 批量建机:一次创建数十台时保证每台配置一致
- 伸缩自动就绪:扩容实例启动后自动注册到负载均衡后端
- 注册监控与日志:开机自动安装采集组件并打上标签
- 一次性初始化标记:写一个完成标记文件,便于判断初始化是否成功
cloud-config 示例
cloud-config 示例
#cloud-config
package_update: true # 首次启动更新包索引
packages:
- nginx # 需要预装的软件包
runcmd:
- [ systemctl, enable, --now, nginx ] # 启用并启动服务
- [ sh, -c, "echo ready > /var/log/init.flag" ] # 写初始化完成标记初始化失败排查位置
| 位置 | 内容 | 用途 |
|---|---|---|
| /var/log/cloud-init.log | 各阶段执行过程 | 定位脚本在哪一步报错 |
| /var/log/cloud-init-output.log | 脚本输出 | 查看命令真实报错信息 |
| /var/lib/cloud/ | 初始化状态与已执行记录 | 判断是否已经执行过 |
| 控制台启动日志 | 串口输出 | 实例未起来时仍能看到输出 |
user-data 内容是明文可读的,不要把密钥、令牌等敏感信息直接写入,改用密钥管理服务或启动后从受控位置拉取。
修改 user-data 不会影响已创建的实例;需要重新执行时,要在 guest 内清理 cloud-init 状态并手动触发。做脚本化交付时,把初始化脚本纳入版本管理,实例上的实际内容也要能追溯回某个版本。