【问题标题】:How can I use ansible playbook to reboot a ubuntu server?如何使用 ansible playbook 重启 ubuntu 服务器?
【发布时间】: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


【解决方案1】:

我可以建议使用网桥或专用网络。使用端口转发可能会很棘手。我将您的代码与私有和桥接网络一起使用,两者都完美配合。

【讨论】:

  • 有趣,这是否意味着在使用端口转发时 Wait-for 模块可能存在错误?或者也许 wait_for 从未打算与 local_action 一起使用?我将不得不做出重大改变来测试这一点,同时如果有人有端口转发的解决方案,那就太好了。感谢您的洞察力。
  • 我不是专家,但我不认为这是一个错误。可能是端口转发(套接字行为)。我的建议是不要使用端口转发。如果您仍然需要,您可以破解副本 wait_for 以尝试使其工作。供您参考github.com/ansible/ansible/blob/devel/library/utilities/…virtualbox.org/manual/ch06.html#natforward
  • 嗨 DomaNitro,我并不是说你错了,但我只是不明白为什么如果使用端口转发,等待模块的行为会有所不同。我的理解是 Wait_for 将指定主机上的指定端口连接起来,并等待端口根据状态参数应答或不应答。为什么端口转发会对此产生任何影响?
  • 雷蒙德,我看到的问题是网络级别的问题 wait_for 使用袜子并且它连接到本地端口发现它打开它等待它停止响应但它不会。为了验证后台发生了什么,您可以使用 tcpdump。因此,如果您想要快速破解,请在 bash 或 python 中创建一个新模块,该模块循环 X 秒并尝试将 nc 或 telnet 连接到端口并 grep 获取“SSH-2.0-OpenSSH”或其他内容。并使用它来代替它不会带你去开发它。如果您仍然认为这是一个错误,请在 Anbile github 中将其报告为问题
  • 感谢 DomaNitro,感谢您,我想我突然看到了曙光。在监控端口时,我没有连接到关闭ubuntu机器时关闭并重新打开的真实端口,而是连接到然后转发的本地机器的端口,因此基本上转发端口始终可用。是的,这不能算是一个错误。
【解决方案2】:

你可以使用重启模块

- name: Reboot a slow machine that might have lots of updates to apply
  reboot:
     reboot_timeout: 3600

https://docs.ansible.com/ansible/latest/modules/reboot_module.html

【讨论】:

    【解决方案3】:

    apt-get update 和 dist-upgrade 需要“-y”...我相信它挂在那里。

    【讨论】:

    • 嗨柯蒂斯,这不是问题,我使用 -y 选项。我的剧本在重启时挂起,没有其他地方。我认为 DomaNitro 很好地解释了挂起的原因,我遇到了麻烦理解它,但我现在相信他是对的。
    猜你喜欢
    • 2020-05-27
    • 2014-07-15
    • 1970-01-01
    • 2022-12-19
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多