运行内容及时间
每个 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、站点代码、主机名和启动时分配的地址都在其中,这是脚本在需要自我注册但尚不知晓醒来位置时所需要的。