知识库

使用 cloud-init 进行首次引导工作

将用户数据文档附加到订单,实例到达时您的用户、您的密钥、您的软件包和您的防火墙已经就位。

运行内容及时间

每个 Linux 镜像都带有 cloud-init。首次启动时,它会读取附加到您订单的 user-data,应用一次,并写入标记,确保不再运行。这一切都发生在您还能输入任何内容之前,这正是重点:实例存在与配置完成之间的窗口期是您不应拥有的。

在下单前验证文档。模式检查器能捕获缩进错误,否则您将需要重新构建:

cloud-init schema --config-file user-data.yaml --annotate

执行有用操作的 user-data

#cloud-config
hostname: edge-01
fqdn: edge-01.example.com
timezone: UTC

users:
  - name: deploy
    groups: [sudo]
    shell: /bin/bash
    sudo: "ALL=(ALL) NOPASSWD:ALL"
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3Nza... deploy@laptop

ssh_pwauth: false
disable_root: true

package_update: true
package_upgrade: true
packages:
  - nftables
  - vnstat
  - mtr-tiny

write_files:
  - path: /etc/ssh/sshd_config.d/10-local.conf
    permissions: "0644"
    content: |
      PermitRootLogin no
      PasswordAuthentication no
      AllowUsers deploy

runcmd:
  - [systemctl, enable, --now, nftables]
  - [systemctl, restart, ssh]

第一行既不是注释也不是可选项。没有 #cloud-config,文档将被静默忽略,实例将如同未附加任何内容一样启动。

在 AlmaLinux 上,groups: [sudo] 变为 groups: [wheel],需要重启的服务是 sshd。其他内容完全相同。

观察其运行

cloud-init status --long
journalctl -u cloud-final -b
less /var/log/cloud-init-output.log

日志会告诉您哪个阶段失败。cloud-init-output.log 保存您 runcmd 条目的实际输出,原因就在其中。

不要将机密放入其中

User-data 在实例的整个生命周期内从内部保持可读:

cloud-init query userdata

其中的任何内容对任何达到 root 权限的进程可用,对任何恢复磁盘快照的人也可见。用它来安装获取机密的凭证,而不是携带机密本身。

无需消耗实例即可测试

cloud-init clean --logs --reboot

这会删除标记、日志和缓存的数据源,然后重新启动进入全新首次启动。在一次性实例上运行。在生产环境中运行,您将发现您的 runcmd 第二次执行时的行为,那通常与第一次不同。

何时停止

cloud-init 用于引导,不知道机器明天应该处于什么状态。用它到达您的真实工具可以接管的状态:一个密钥、一个网络、一个代理。到此为止。六十行的 user-data 是健康状态,六百行则是没有收敛方式的配置管理系统。

cloud-init query -a
cloud-init query ds.meta_data

实例 ID、站点代码、主机名和启动时分配的地址都在其中,这是脚本在需要自我注册但尚不知晓醒来位置时所需要的。

随时恭候

选择城市,选择大小,用加密货币支付。

无需填写关于您的身份信息的表格,无需等待人工审批,无需电话验证。账单结清后,凭证将发送到您的邮箱。