跳到主内容

cloud-init VPS 初始化教程:用户、SSH 与软件包一次配置

用 cloud-config 声明首次启动任务,安全创建管理用户、写入 SSH 公钥、安装软件包,并通过状态、日志和 schema 检查定位失败。

GSProber · 主机测评编辑0 阅读
用 cloud-config 声明首次启动任务,安全创建管理用户、写入 SSH 公钥、安装软件包,并通过状态、日志和…

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 的账号。请替换为你自己的公钥,不要复制示例占位内容到生产环境。

YAML
#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 的软件包模块支持跨发行版调用可用的软件包管理器。一个保守示例如下:

YAML
package_update: true
package_upgrade: false
packages:
  - curl
  - ca-certificates
  - jq

package_update 更新软件包索引,packages 安装指定组件。是否在首次启动执行完整升级要结合启动窗口和重启风险决定。官方文档已经将旧式 apt_updateapt_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 的核心价值是让首启过程可重复、可审查和可追踪。将它限制在引导层,并把长期配置交给持续管理工具,能够减少镜像差异,也为失败回滚保留清晰边界。

教程GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebR…

Cloudflare Workers 免费搭建开源远程桌面完整教程:无需 VPS,支持 WebRTC P2P、D1、KV、R2、浏览器远程控制、Windows 客户端和文件传输

GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebRTC P2P 直连,服务端仅负责 API、身份认证和 WebSocket 信令,不中转桌面视频流,大幅降低服务器带宽成本。项目支持 Cloudflare 免费套餐 部署,也可以使用 Docker 在 VPS 上自托管,内置 Windows 客户端、浏览器控制端、手机远程控制,支持 8 位设备 ID、OTP 一次性密码、永久密码、Ed25519 设备认证、JWT 身份验证、文件传输、剪贴板同步、自动重连 等完整功能。

311 阅读

教程如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare…

CloudDisk:基于 Cloudflare Workers 的免费个人网盘,无需 VPS、MySQL,支持 R2+D1+KV 一键部署

如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare Workers 的开源项目 CloudDisk 值得看看。整个系统运行在 Cloudflare 免费套餐上,文件存储使用 R2,数据库使用 D1,会话数据使用 KV,不需要 MySQL,也不需要服务器。支持多用户登录、文件夹管理、分享链接、在线预览、Office 文档查看、文本在线编辑、大文件断点续传、协作者权限管理等功能。无论是个人备份、开发者存放代码文件、团队共享资料,还是搭建自己的私有网盘,都可以直接部署到 Cloudflare,一键完成,几乎零维护成本,非常适合独立开发者、个人站长和轻量团队使用。

289 阅读

教程很多朋友在使用 Linux 服务器或者 VPS 时,经常会遇到 DNS 污染、解析慢、域名无法访问等问题。其实只需要安…

Linux 开启 DNS over HTTPS(DoH)教程:使用 Cloudflared + systemd 实现加密 DNS,防污染、防劫持

很多朋友在使用 Linux 服务器或者 VPS 时,经常会遇到 DNS 污染、解析慢、域名无法访问等问题。其实只需要安装 Cloudflare 官方的 cloudflared,并配合 systemd 自启动,就能让整个系统通过 DNS over HTTPS(DoH)进行加密解析。

242 阅读

常见问题

为什么自定义 users 后默认账号不见了?

提供 users 列表时若仍需发行版默认账号,应把保留字 default 放在列表中。省略它可能跳过默认用户及平台密钥的安装。

修改 user-data 后旧实例会重新执行吗?

不能这样假设。许多模块按每实例仅一次运行,修改控制面内容通常不会让既有实例重新执行完整首启流程,应使用新实例验证。

怎样查看 cloud-init 执行失败原因?

先等待并查看 cloud-init status,再检查 cloud-init.log 与 cloud-init-output.log,同时核对 YAML、数据源、模块支持范围和命令退出码。

评价与回复

无需登录;审核通过后公开显示。