cloud-init VPS 初始化教程:用户、SSH 与软件包一次配置
用 cloud-config 声明首次启动任务,安全创建管理用户、写入 SSH 公钥、安装软件包,并通过状态、日志和 schema 检查定位失败。

cloud-init VPS 初始化教程:让首次启动可重复
这篇 cloud-init VPS 初始化教程展示如何用 cloud-config 配置新服务器的用户、SSH 公钥与基础软件。cloud-init 会读取云平台提供的 user-data,并按启动阶段执行对应模块。它适合把重复的人工步骤变成可审查配置,但错误内容也可能在首次启动时锁住远程入口,因此必须保留控制台或救援通道,并先在临时实例验证。
认识 user-data 与执行阶段
cloud-init 支持多种 user-data 格式。最常见的 cloud-config 以 #cloud-config 开头,后续内容是 YAML。不同模块有各自的执行频率,有些每个实例只运行一次,有些可以在每次启动执行。不要假设修改控制台中的 user-data 后,已经创建的实例会自动重新运行全部模块。
首次配置前,先确认云镜像包含 cloud-init,平台会把 user-data 交给实例,并确认默认用户名称。使用自定义镜像时还要检查数据源识别情况。若只是手工维护单台服务器,站内的Linux 安全基线也可作为补充清单。
创建管理用户并写入 SSH 公钥
下面示例保留发行版默认用户,同时创建名为 deploy 的账号。请替换为你自己的公钥,不要复制示例占位内容到生产环境。
#cloud-config
users:
- default
- name: deploy
groups: [sudo]
shell: /bin/bash
lock_passwd: true
ssh_authorized_keys:
- ssh-ed25519 YOUR_PUBLIC_KEY
ssh_pwauth: false
disable_root: true
users 列表中保留 default 很重要;官方模块参考指出,若提供自定义列表却省略它,平台默认账号可能不会创建,云平台注入的密钥也可能无法按预期安装。lock_passwd 用于锁定密码入口,ssh_pwauth 禁止 SSH 密码认证,disable_root 限制直接使用 root 登录。上线前应验证发行版的 SSH 配置,因为 PAM 和键盘交互认证可能有独立开关。
至少保留两个终端会话验证新账号:先确认 deploy 能用公钥登录,再检查必要的 sudo 权限,最后才结束原会话。不要在没有控制台入口的情况下直接移除唯一可用账号。
更新索引并安装基础软件
cloud-init 的软件包模块支持跨发行版调用可用的软件包管理器。一个保守示例如下:
package_update: true
package_upgrade: false
packages:
- curl
- ca-certificates
- jq
package_update 更新软件包索引,packages 安装指定组件。是否在首次启动执行完整升级要结合启动窗口和重启风险决定。官方文档已经将旧式 apt_update、apt_upgrade 等键标记为弃用方向,新配置应使用通用键。需要自动重启时,也要先确认应用和编排系统能够接受中断。
复杂应用不宜全部塞进 runcmd。更容易维护的方法是让 cloud-init 完成账号、仓库和配置管理客户端的引导,再由 Ansible 或其他工具管理长期状态。这样后续修改不必依赖重新创建实例。
写入文件与启动服务
write_files 可以创建受控配置文件,但不要在 user-data 中放置长期密钥,因为平台控制面、实例元数据或审计记录可能保留其内容。普通配置可以指定路径、所有者和权限,然后通过 runcmd 启用服务。命令应具备幂等性,并使用绝对路径。
对于常驻服务,应创建正式的 systemd 单元,而不是让启动脚本长期占用。相关管理方法可参考站内的systemd 服务自动重启教程。
验证状态与排查失败
实例启动后先执行 cloud-init status --wait 等待流程结束,再查看状态。日志通常位于 /var/log/cloud-init.log 和 /var/log/cloud-init-output.log。如果模块失败,应先检查 YAML 缩进、数据源、模块名称、发行版支持范围、软件源可达性和命令退出码。
提交前可用 cloud-init schema --config-file 检查配置结构。验证通过并不代表命令一定能在目标镜像成功,因此仍要创建临时实例进行完整演练。重复测试时使用新实例最可靠,强制清理 cloud-init 状态可能改变机器身份和密钥,不应在生产节点随意操作。
安全上线清单
把 cloud-config 放入版本控制前移除机密,只保留公钥和非敏感配置。为文件设置代码评审,记录适用镜像与版本,并在每次镜像更新后重新验证。启动完成后检查用户、SSH、软件包、时间同步、防火墙和监控,而不是只看实例状态。
cloud-init 的核心价值是让首启过程可重复、可审查和可追踪。将它限制在引导层,并把长期配置交给持续管理工具,能够减少镜像差异,也为失败回滚保留清晰边界。


