这是我的默认 cloud-init
package_update: true
package_upgrade: true
users:
- name: sammy
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1...
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: sudo
shell: /bin/bash
write_files:
- path: /etc/issue.root
content: |
SSH access for root is blocked. Please use xxx instead.
- path: /etc/issue.everybody
content: |
Welcome! This Ubuntu 22.04 is spun up by xxx using DigitalOcean APIv2.
runcmd:
- |
curl https://events.hookdeck.com/e/abc -X POST -d "{ "command": "configure-sshd-config" }"
我实际上还有更多,但我截断了 cloud-init yaml
我喜欢跑步curl https://events.hookdeck.com/e/abc -X POST -d "{ "event": "dependent on where i run this" }"
在某些区域,例如在添加 sammy 用户之前/之后,或者在运行包升级和写入文件之前/之后。
我知道如何在我的长期运行命令中轻松地做到这一点。
但我不确定如何对非 runcmd 执行此操作。
原因是我有一个软件,它将代表拥有 DigitalOcean 帐户的用户调用 DigitalOcean API。
我喜欢给他们一个进度条,而我能做到这一点的唯一方法就是通过调用curl
webhook。
答案1
这不是 cloud-init 的功能(报告之外,正如@falcojr 指出的)。
您的问题已经由其他人回答过了,所以我将分享一些与如何测量(和优化)cloud-init 性能相关的辅助信息。这不会为您带来状态栏,但也许可以让您获得更快的启动时间(这通常是此类问题背后的动机)。
性能工具:
如果您有兴趣更好地理解或优化 cloud-init 启动时间,您可以考虑一些实用程序。
cloud-init 分析:与 systemd-analyze 类似,它将显示 cloud-init 所花费时间的明细
systemd-分析:显示 systemd 所花费时间的明细
优化策略:
当尝试优化系统启动时间时,我通常首先运行systemd-analyze blame
,查看最耗时的服务,然后问自己:a) 我需要它吗?如果需要,b) 我可以做些什么来加快速度?
禁用/重新配置,然后重复。如果你不知道,就不要猜测。在破坏你的操作系统之前,先做些研究。
与 相同cloud-init analyze blame
。
通常,在考虑运行时间少于一秒的服务/模块之前,只有少数服务值得考虑。我在自己的服务器上运行过几次,通常发现诸如软件包安装和更新以及其他网络/磁盘密集型任务占用的时间最多。很容易意外编写一个“有效”但运行速度也很慢的配置。
快速示例:
我已经看到一些云配置可以执行以下操作:
runcmd:
- "apt-get install git"
- "apt-get install neovim"
其表现远不如以下(或内置模块):
runcmd:
- "apt-get install git neovim"
在快速 GCP 测试中,这两者对我来说有 3 秒的差异。
这个例子很简单,但是因为我见过博客文章这样做,所以我猜这部分内容可能会在某些时候对某些人有所帮助:-)
答案2
我的建议来自以下页面:
- https://cloudinit.readthedocs.io/en/latest/topics/faq.html
- https://cloudinit.readthedocs.io/en/latest/topics/boot.html
- https://cloudinit.readthedocs.io/en/latest/topics/examples.html
大致是这样的:
- 创建一个 bootcmd(https://cloudinit.readthedocs.io/en/latest/topics/examples.html#run-commands-on-first-boot) 进行轮询直至网络连通,然后下载并执行下一阶段。
- 第二阶段积极监视和处理日志数据(例如来自:/var/log/cloud-init.log)以评估您在安装过程中所处的位置。
- 此时,当您看到日志文件中出现行时,您就可以开始使用“curl”或任何最有意义的工具发送更新。
潜在挑战:
- 需要编程。
- 需要了解日志文件。
我建议执行一些测试安装并发送显示的每一行(例如使用“curl”)以了解“正常”安装的样子,找到一些关键点,并使用这些点来触发更新。