讲解腾讯云国际 CVM 用户数据和 cloud-init 的关系、cloud-config 示例、幂等设计、敏感信息边界与失败日志排查。
准确入口:创建腾讯云国际 CVM 时进入“云服务器 CVM → 新建实例 → 高级设置 → 自定义数据”,填入 #cloud-config 或带解释器的 shell。用户数据本身通常不单独收费,但脚本创建的资源和下载流量会收费;它以高权限运行,默认按首次启动初始化,修改后重启不保证再次执行。

用户数据与 cloud-init 的关系
用户数据是创建实例时传入的初始化内容;cloud-init 是常见 Linux 镜像中读取并执行这些内容的组件。镜像必须正确安装和启用 cloud-init,否则控制台填写了用户数据也可能不会执行。
| 适合放入 | 不建议放入 |
|---|---|
| 软件源更新、基础软件安装、目录和非敏感配置 | 数据库密码、长期 SecretKey、私钥 |
| 监控与日志代理安装 | 没有超时和失败处理的大型部署脚本 |
| 拉取配置管理入口 | 必须依赖人工输入的交互命令 |
一个可维护的 cloud-config 示例
#cloud-config
package_update: true
packages:
- nginx
runcmd:
- [ sh, -c, "mkdir -p /opt/bootstrap" ]
- [ sh, -c, "date -Iseconds > /opt/bootstrap/finished-at" ]
生产脚本还应设置网络请求超时、固定软件版本或允许的版本范围,并把关键步骤输出到日志。不要从未校验的公网地址直接下载并以 root 执行脚本。
怎样保证重复执行不会破坏实例
- 创建目录使用可重复命令,不假定目录一定不存在;
- 修改配置前检查目标内容,避免每次重复追加;
- 数据库变更使用有版本记录的迁移工具;
- 每个外部请求设置超时和有限重试;
- 用完成标记记录成功版本,但不要用标记掩盖半完成状态。
弹性伸缩场景会不断创建新实例,任何偶发失败都会被放大。因此需要把初始化脚本纳入版本管理,在测试镜像和测试子网中验证后再更新启动配置。
初始化失败怎么查
- 确认镜像内存在并启用了 cloud-init;
- 检查
/var/log/cloud-init.log和/var/log/cloud-init-output.log; - 确认 DNS、软件源、NAT 或公网出口在首次启动时可用;
- 通过实例元数据确认用户数据是否按预期传入;
- 逐段手工运行失败命令,区分脚本错误和网络依赖错误。
sudo cloud-init status --long
sudo tail -n 100 /var/log/cloud-init-output.log
curl --max-time 2 http://metadata.tencentyun.com/latest/user-data
实例元数据只能从实例内部访问。应用服务器仍应防范 SSRF,避免不受信任的请求代理访问元数据地址。
边界条件
用户数据的执行次数和重跑方式受镜像、cloud-init 配置及脚本格式影响,不能假设修改控制台内容后旧实例会自动重新执行。需要持续变更时,应使用配置管理、镜像版本或正式发布流程。
把用户数据限制为引导层
只安装基础代理、写入非敏感配置和启动带版本的部署程序。不要写 SecretId、数据库密码或私钥;调用云 API 使用 CVM 角色临时凭证。每个动作先判断现状,避免重复追加配置、再次创建用户或覆盖已有数据。
失败取证和分支
- 运行
cloud-init status --long,再查 cloud-init 输出与系统日志。 - 核对首行、YAML 缩进、编码和镜像是否安装 cloud-init。
- 下载失败时查 DNS、HTTPS 出站和软件源,不要反复重跑。
- 自定义镜像要清理旧实例状态,否则新机可能认为初始化已完成。
验收与回退
检查包版本、服务状态、端口、健康页和重启自启。需要再次执行时优先创建新启动配置和测试 CVM,不在生产机清空 cloud-init 状态。失败就停止新机接流并切回旧镜像或旧实例。
腾讯云国际 CVM 用户数据怎么用现场验收单
- 入口或命令:云服务器 CVM → 新建实例 → 高级设置 → 自定义数据;实例内查 cloud-init
- 提交前风险:用户数据不单独收费,但创建资源/流量收费;root 脚本会改系统,错误可能中断
- 不能继续时:格式/编码错、镜像无 cloud-init、网络未就绪、旧状态残留、脚本等待交互
- 完成证据:cloud-init 完成、日志无错误、服务自启且健康检查通过,重启仍正常
- 退出办法:保留旧镜像和启动配置;在克隆机重跑,失败切回旧实例/镜像

