cloud-init 排查看哪里
cloud-init 在实例启动过程中读取元数据与 user-data,按阶段执行配置。排查分三处:cloud-init status --long 看整体阶段与是否出错,/var/log/cloud-init.log 看模块的执行与决策过程,/var/log/cloud-init-output.log 看 user-data 脚本自身的输出与报错。要让配置重新执行,需要清理已应用标记并重启实例。用 cloud-init analyze show 还能看出时间花在哪个阶段。
基本信息
| 状态查看 | cloud-init status --long |
|---|---|
| 主日志 | /var/log/cloud-init.log |
| 输出日志 | /var/log/cloud-init-output.log |
| 重跑 | cloud-init clean 后重启实例 |
| 耗时分析 | cloud-init analyze show,查看各阶段耗时 |
典型使用场景
- 首次启动后 user-data 里的配置没有生效,需要确认执行到哪一步
- user-data 脚本报错,需要定位具体行与退出码
- 修改 user-data 后希望在已运行的实例上重新执行
- 制作自定义镜像前清理 cloud-init 状态,避免克隆实例沿用旧状态
- 实例网络未按预期配置,确认阶段是否因网络不可达而失败
定位与重跑
定位与重跑
cloud-init status --long # 整体阶段与错误摘要
sudo tail -n 50 /var/log/cloud-init-output.log # user-data 脚本的输出与报错
sudo grep -iE 'error|failed|warn' /var/log/cloud-init.log | tail -20
sudo cloud-init clean --logs # 清理状态与日志(生产慎用)
sudo reboot # 下次启动重新执行
sudo cloud-init analyze show # 各阶段耗时,定位慢在哪一步阶段与失败表现
| 阶段 | 主要工作 | 失败表现 |
|---|---|---|
| 本地初始化 | 网络可用前的本地数据源处理 | 本地数据源缺失时后续阶段直接跳过 |
| init | 网络就绪后拉取元数据 | 元数据服务不可达,user-data 拿不到 |
| 配置模块 | 网络、存储、用户、软件包等模块 | 模块报错但实例仍可启动,配置缺项 |
| final | 执行 user-data 脚本与收尾任务 | 脚本报错,输出只在 output 日志中 |
| 每次启动脚本 | per-boot 类型脚本 | 只在特定启动阶段执行,容易被误认为未生效 |
生产环境慎用 clean:会清除已应用的模块标记并在下次启动重新执行 user-data,若脚本不是幂等的,可能重复创建用户、覆盖配置甚至重建文件系统。
从已有实例制作镜像前要清理 cloud-init 状态,否则克隆出来的实例可能沿用旧的 instance-id 而不重新执行 user-data,导致主机名、密钥与网络配置全部重复。