cloud-init 能在云服务器首次开机时自动初始化配置,关键在于它被设计为系统启动早期就运行的一次性服务,且依赖正确的安装、启用和数据源(如元数据服务)配合。

Cloud-Init 能在云服务器首次开机时自动初始化配置,关键在于它被设计为系统启动早期就运行的一次性服务,且依赖正确的安装、启用和数据源(如元数据服务)配合。不是装上就能用,而是要让整个链路跑通。
确认 Cloud-Init 已正确安装并启用
首先得确保它真正在系统里,并且开机能启动:
- 检查是否已安装:执行
which cloud-init,有输出路径(如/usr/bin/cloud-init)说明已安装;没输出则需按系统类型安装(Ubuntu/Debian 用apt install cloud-init,CentOS/RHEL 用yum install cloud-init或dnf install cloud-init) - 确认服务已启用:运行
systemctl is-enabled cloud-init,返回enabled才算到位;若为disabled,执行systemctl enable cloud-init - 验证依赖组件:比如
cloud-utils-growpart(用于自动扩容根分区)、python3-requests(用于访问元数据服务),缺一不可
保证云平台元数据服务可访问
Cloud-Init 的“自动”来自读取云厂商提供的元数据(如主机名、SSH密钥、用户脚本等),所以网络通路必须畅通:
- 云服务器网卡需配置为 DHCP 模式(大多数公有云默认如此),确保能获取到内网网关和 DNS
- 首次启动时,Cloud-Init 会尝试访问
http://169.254.169.254(AWS/Azure/阿里云/腾讯云等通用元数据地址),需确认该地址可达(可临时用curl -I http://169.254.169.254测试) - 若使用私有镜像或自建环境,需确保对应云平台的元数据服务已部署并响应正常,否则 Cloud-Init 会超时跳过初始化
理解初始化的执行阶段与触发时机
Cloud-Init 不是后台常驻进程,而是在系统启动早期分阶段执行,完成后即退出:
- 启动时先运行
--local阶段(读取本地配置,如/etc/cloud/cloud.cfg),设置基础环境 - 再运行完整初始化(
cloud-init init),拉取云平台元数据 - 接着依次执行
config阶段(设主机名、网络、用户、SSH密钥等)和final阶段(运行用户脚本、安装软件包等) - 所有操作均发生在首次开机,后续重启不会重复执行(除非手动清空
/var/lib/cloud并重跑)
验证初始化是否真正生效
别只看服务状态,要查实际效果:
- 查看日志:运行
cloud-init status --long或翻阅/var/log/cloud-init.log,确认各阶段无 ERROR 或 WARN - 检查关键配置是否落地:比如
hostname命令输出是否匹配元数据中设定的主机名;ls /home/xxx/.ssh/authorized_keys是否写入了注入的公钥 - 测试用户数据脚本:如果创建实例时通过“用户数据”注入了 shell 脚本,检查对应文件是否存在、服务是否已启动











