29

我正在使用 openstack 创建一个使用“nova boot”命令的虚拟机。我的图像已启用 cloud-init。我传递了一个 --user-data 脚本,它是一种 bash shell 格式,供 cloud-init 在 VM 启动期间运行。这一切都成功地发生了。现在我的用例是重新运行 cloud-init 以执行相同的用户数据脚本,而无需重新启动 VM。我看到了 /usr/bin/cloud-init 选项,他们确实谈到了运行特定的模块,但没有什么能让它执行相同的用户数据脚本。如何实现?任何帮助,将不胜感激。

4

5 回答 5

23

为了重置 cloud-init,您需要执行rm -rf /var/lib/cloud/instances.

然后重新运行cloud-init start,它将再次运行完整的引导脚本过程。

于 2014-04-27T19:42:14.950 回答
21

虽然不推荐在不重新启动的情况下重新运行所有 cloud-init,但以下命令将允许您在系统上完成此操作。

命令已更新,因此要重新运行,您需要clean退出现有配置:

sudo cloud-init clean --logs

由于 systemd 服务依赖性,cloud-init 通常会按顺序运行多个引导阶段。如果您想在不重新启动的情况下重复该过程,您可以运行以下 4 个命令:

  1. 检测本地数据源(云平台):

    sudo cloud-init init --local

  2. 检测任何需要网络启动并运行 /etc/cloud/cloud.cfg 中定义的“cloud_init_modules”的数据源:

    sudo cloud-init init

  3. 运行 /etc/cloud/cloud.cfg 中定义的所有 cloud_config_modules:

    sudo cloud-init modules --mode=config

  4. 运行 /etc/cloud/cloud.cfg 中定义的所有 cloud_final_modules: sudo cloud-init modules --mode=final

当心:像 ssh 主机密钥这样的东西可能会重新生成。

于 2018-06-18T14:09:25.443 回答
14

由于这不断在搜索结果中弹出,对我有用的是:

  1. 删除/var/lib/cloud/instances/i-xxxxxxx/sem. 如果这些文件存在,Cloud-init 将不会重新运行。

  2. 编辑/var/lib/cloud/instances/i-xxxxxxxx/scripts/part-001. 这是您的用户数据脚本。

  3. 执行cloud-init 的用户脚本模块。这不会重新下载用户数据,而是执行步骤 2 中已下载(现在已修改)的脚本。

    sudo /usr/bin/cloud-init single -n cc_scripts_user

于 2017-02-02T04:51:22.243 回答
1

要运行 cloud-init 的 cloud-config 部分的 packages 模块,您可以运行

# cloud-init-cfg all config

要运行 cloud-init 的 cloud-config 部分的 runcmd 模块,可以运行

# cloud-init-cfg all final
于 2014-05-20T19:35:07.873 回答
0

鉴于这篇文章在 6 个月前被积极触及,我想在这里从 cloud-init 上游提供更完整的答案。

最初的问题:“如何在以后使用 cloud-init 再次重新运行用户数据脚本” 通常用户脚本仅由配置模块 config-user-scripts 每次实例运行一次。如果元数据中的实例 ID 没有更改,它将不会重新运行。

可以使用以下命令行绕过每个实例的信号量,方法是告诉它运行用户脚本模块而不考虑实例 ID:

sudo cloud-init single --name scripts-user --frequency always

根据另一个建议在不重新启动系统的情况下重新运行所有 cloud-init。这不是推荐的方法,因为 cloud-init 的某些部分在 systemd 生成器时间范围内运行以检测新的数据源类型。也就是说,以下命令将允许您在不重新启动系统的情况下完成此操作。

cloud-init 支持clean删除所有信号量文件并允许 cloud-init 再次重新运行所有配置模块的子命令。请注意,这将意味着重新生成 SSH 主机密钥并重新编写 .ssh 配置文件,因此可能会影响您重新进入 VM 的能力。

要清理所有信号量,以便 cloud-init 模块在下次启动时全部重新运行:

sudo cloud-init clean --logs

由于 systemd 服务的依赖关系,cloud-init 通常按顺序运行多个引导阶段。如果您想在不重新启动的情况下重复该过程,您可以运行以下 4 个命令:

  1. 检测本地数据源(云平台):

    sudo cloud-init init --local

  2. 检测任何需要网络启动并运行 /etc/cloud/cloud.cfg 中定义的“cloud_init_modules”的数据源:

    sudo cloud-init init

  3. 运行 /etc/cloud/cloud.cfg 中定义的所有 cloud_config_modules:

    sudo cloud-init modules --mode=config

  4. 运行 /etc/cloud/cloud.cfg 中定义的所有 cloud_final_modules:

    sudo cloud-init modules --mode=final

于 2022-02-17T04:07:19.990 回答