在Ansible中,如果系统在更新该行之前重新启动,如何重复获取文件直到存在一行?

问题描述 投票:0回答:1

我正在尝试确定更新过程何时完成(更新会在一段时间后强制重新启动,从而导致出现问题)。我怀疑最好的方法是从远程主机不断地将文件下载到localhost并检查是否存在行,但是我没有看到在使用ansible的循环中重新连接到该主机的方法。

背景:我有一个存在于私有子网中的节点。当我执行特定更新时,系统会在一段未知时间后重新启动。重新启动后,可以确定更新已完成,因为此文件(/tmp/softnas-update.status)包含行 -

OK. SoftNAS software update to version 4.2.1 completed at Sun Mar  3 05:44:46 EST 2019.

我当前使用的命令wait_for无法在17-45分钟内正确获取此更改,因为在此过程中重新启动时连接将暂停。

这是我目前使用的一个例子 -

  - name: "Wait until Softnas Update completes. This can take 15-45 mins"
    wait_for:
      path: /tmp/softnas-update.status
      search_regex: "^OK. SoftNAS software update to version.*completed at.*$"
      timeout: 3600
    when: update_file.stat.exists and softnas_runupdate

是否有可能遍历整个剧本,每次检查该行是否存在时,该剧本将重新连接到主机?还是有更好的方法来解决这个难题?

ansible
1个回答
1
投票

这比应该的更困难,但无论如何我找到了一种方法。

这里的主要问题是你不能循环使用包含或块的直到/重试/延迟。如果可以的话,可以通过循环检查和wait_for_connection来解决这个问题。

我发现的方式等待系统重启,然后开始检查线路:

handlers:
  - name: checkupdatesuccess
    include: checkupdatesuccess.yml
tasks:
   ...
#A task that always get status "changed" to register the handler
  - shell: cat /etc/issue
     notify: checkupdatesuccess
  - name: wait for reboot
    wait_for_connection:
      timeout: 10
    register: result
    until: result is failed
    retries: 300
    delay: 5

和处理程序任务:

  - wait_for_connection:
      timeout: 100
  - wait_for:
      path: /tmp/softnas-update.status
      search_regex: "^OK. SoftNAS software update to version.*completed at.*$"
      timeout: 3600
    when: update_file.stat.exists and softnas_runupdate

您需要在处理程序中使用include来确保以正确的顺序运行任务。任务“等待重启”将永远失败,要么是因为超时,要么就是我们正在寻找的,当主机重新启动时。当发生这种情况时,处理程序需要运行,因此您需要在配置中使用强制处理程序,或者在playbook执行时使用参数--force-handlers。你可能不得不玩掉超时和延迟一点,这样你就不会错过重启。

© www.soinside.com 2019 - 2024. All rights reserved.