cloud-init 如何在每个非运行命令之前和之后运行 curl

cloud-init 如何在每个非运行命令之前和之后运行 curl

这是我的默认 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。

我喜欢给他们一个进度条,而我能做到这一点的唯一方法就是通过调用curlwebhook。

答案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

我的建议来自以下页面:

大致是这样的:

  • 创建一个 bootcmd(https://cloudinit.readthedocs.io/en/latest/topics/examples.html#run-commands-on-first-boot) 进行轮询直至网络连通,然后下载并执行下一阶段。
  • 第二阶段积极监视和处理日志数据(例如来自:/var/log/cloud-init.log)以评估您在安装过程中所处的位置。
  • 此时,当您看到日志文件中出现行时,您就可以开始使用“curl”或任何最有意义的工具发送更新。

潜在挑战:

  • 需要编程。
  • 需要了解日志文件。

我建议执行一些测试安装并发送显示的每一行(例如使用“curl”)以了解“正常”安装的样子,找到一些关键点,并使用这些点来触发更新。

相关内容