如何在不重启的情况下重新运行 cloud-init

Posted

技术标签:

【中文标题】如何在不重启的情况下重新运行 cloud-init【英文标题】:How to re-run cloud-init without reboot 【发布时间】:2014-05-28 17:49:00 【问题描述】:

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

【问题讨论】:

这能回答你的问题吗? How to run cloud-init manually? 【参考方案1】:

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

然后重新运行cloud-init start,它将再次运行完整的启动脚本进程。

【讨论】:

start 似乎不是当前版本的有效参数 我认为将另一个答案复制粘贴到您的答案上毫无意义。如果您的版本已过时,则更新越多的版本最终将获得更多的赞成票。如果您不希望自己的答案被删除,但我会保留它以供历史记录。 有道理。也许在我的回答中注明要检查以下内容以获取更新的版本会更合适?【参考方案2】:

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

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

sudo cloud-init clean --logs

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

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

    sudo cloud-init init --local

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

    sudo cloud-init init

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

    sudo cloud-init modules --mode=config

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

注意:ssh 主机密钥之类的东西可能会重新生成。

【讨论】:

谢谢。我一直在寻找一种方法来强制 cloud-init 在下次启动时完全运行。 cloud-init clean 是我一直在寻找的。其他地方都建议删除 /var/lib/cloud 下的文件,这不会重置 SSH 密钥(可能还有其他一些东西)。【参考方案3】:

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

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

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

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

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

【讨论】:

CentOS 7.3.1611,cloud-init 0.7.5,/var/lib/cloud/instances/i-xxxxxxxx/scripts @kadrach 中没有任何内容 您是否将i-xxxxxxxxxx 替换为适当的文件夹?它应该是您正在运行它的实例的标识符(我从未在其中看到多个文件夹)。 是的,我已经通过缩小范围找到了问题,但是 cloud-init 日志过于简约而且做得很好 /var/lib/cloud/instances/i-xxxxxxxx/scripts 里面也没有任何东西。我得到了正确的实例,但是所有用户数据(我在 OpenStack 中创建 VM 时输入的)都在 cloud-config.txtuser-data.txt 中。当我按照说明进行操作时,#3 不起作用,可能是因为 /scripts 文件夹内没有任何内容?有任何想法吗? @kadrach @Artem 只是为了增加精度。如果要运行模块cc_scripts_user,请删除rm /var/lib/cloud/instance/sem/config_cc_scripts_user对应的信号量【参考方案4】:

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

# cloud-init-cfg all config

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

# cloud-init-cfg all final

【讨论】:

CentOS 7.3.1611,cloud-init 0.7.5,我在文件系统上没有 cloud-init-cfg @jrwren 同样:在 Ubuntu 18.04 上不存在【参考方案5】:

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

最初的问题:“如何在以后使用 cloud-init 再次重新运行用户数据脚本” 通常,用户脚本仅由配置模块 config-user-scripts 在每个实例中运行一次。如果元数据中的 instance-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 通常按顺序运行multiple boot stages。如果您想在不重新启动的情况下重复该过程,您可以运行以下 4 个命令:

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

    sudo cloud-init init --local

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

    sudo cloud-init init

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

    sudo cloud-init modules --mode=config

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

    sudo cloud-init modules --mode=final

【讨论】:

以上是关于如何在不重启的情况下重新运行 cloud-init的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu系统下如何在不重启的情况下永久修改hostname主机名

如何在不使用命令的情况下以编程方式关闭/重启 linux 机器(运行时)

如何在不重新加载页面的情况下运行我的视图功能? [关闭]

在不关闭 MacOS 的情况下重启终端

java.sql.SQLException: Io 异常: Broken pipe 如何在不重启的情况下恢复?

如何优雅地重启 django 在 nginx 后面运行 fcgi?