【发布时间】:2020-07-07 20:35:59
【问题描述】:
我正在尝试构建一个 ansible playbook 来配置一个 ubuntu vagrant box。 除了在升级内核后控制 ubuntu 机器重启之外,该剧本几乎可以正常工作。
我有一个 ansible 的主机文件如下:
localhost ansible_connection=local
dockerhost ansible_ssh_port=2222 ansible_ssh_host=127.0.0.1
我试图解决这个问题的最新迭代如下:
- name: Restart the server
shell: sleep 2s && reboot & executable=/bin/bash
- name: Wait until the virtual machine stop ie: ssh port stop responding
local_action: wait_for host={{ansible_ssh_host}} port={{ansible_ssh_port}} state=stopped
sudo: false
- name: Wait for server to come up
local_action: wait_for host={{ansible_ssh_host}} port={{ansible_ssh_port}} delay=30
sudo: false
有了这个 playbook 步骤,进程块等待 ssh 端口停止响应,直到它达到超时并退出 playbook,我猜如果重启特别快,它可能发生在 wait_for 命令的轮询间隔之间并错过 ssh 端口实际关闭的短暂时间。 ansible返回的错误是:
失败:[dockerhost] => {"elapsed": 300, "failed": true} msg: 超时 等待 127.0.0.1:2222 停止时。
至少有一次它设法到达 ansible 等待 ssh 端口再次可用但挂在那里直到超时的步骤。 我认为这个解决方案对重启速度的差异过于敏感,这在虚拟环境中可能会有很大差异。 我使用的 ansible 版本是 1.5.3 Ubuntu 是 12.04lte,内核升级到 3.8 完整的剧本安装 docker 和所有依赖项。
我尝试了在各种网站上发现的许多变体和想法,但从未设法正确控制重启并继续我的剧本进行下一步。
我正在寻找一种简单且万无一失的方法来重新启动服务器并在机器备份并运行后继续执行剧本中的后续步骤
我没有探索运行本地 vagrant reload 的可能性,因为我想在我不会运行 vagrant 的操作中使用相同的剧本,我只提到了 vagrant,以防它产生一些我不知道的复杂性。 我也不想只是暂停 5 分钟然后希望服务器重新启动,使用这种工具的目的是以可预测和及时的方式提供服务器,并且可以在环境之间移植,暂停只是看起来不对。
我还四处寻找可以管理此要求的 ansible 模块,但 ansible 网站上的 cmets 似乎排除了这一点。
谢谢
【问题讨论】:
-
这是手动重启 vagrant 盒子的情况:vagrant 在盒子启动之前会执行许多步骤,就像网络配置一样。如果你在没有 vagrant 的情况下重启(从 vm 内部,从 Virtualbox GUI),vagrant 无法执行这些步骤,因此重启后可能根本没有打开端口 22。
-
感谢您的信息,将不得不看看从内部停止 Vagrant 环境的后果,问题仍然存在于 vagrant 环境之外,有什么想法吗?
-
您遇到了与 vagrant 本身相同的问题。它也“只是”不尝试一次又一次地进入盒子并在足够长的时间后退出。我建议您使用内核升级构建自己的基础盒,以便在可能的情况下不重新启动。
标签: ubuntu ssh vagrant reboot ansible