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

在Ansible中,如果在更新某行之前系统将重新启动,如何重复提取文件直到该行存在?,ansible,Ansible,我正在尝试确定更新过程何时完成更新会在一段时间后强制重新启动,这会造成问题。我认为最好的方法是从远程主机持续下载一个文件到本地主机,并检查是否存在一行,但我看不到通过ansible在循环中重新连接到该主机的方法 背景:我有一个存在于私有子网中的节点。执行特定更新时,系统会在未知时间段后重新启动。重新启动后,可以确定更新已完成,因为此文件/tmp/softlas-update.status包含该行- OK. SoftNAS software update to version 4.2.1 comp

我正在尝试确定更新过程何时完成更新会在一段时间后强制重新启动,这会造成问题。我认为最好的方法是从远程主机持续下载一个文件到本地主机,并检查是否存在一行,但我看不到通过ansible在循环中重新连接到该主机的方法

背景:我有一个存在于私有子网中的节点。执行特定更新时,系统会在未知时间段后重新启动。重新启动后,可以确定更新已完成,因为此文件/tmp/softlas-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

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

这比应该的困难多了,但我还是找到了一种方法

这里的主要问题是,不能在include或块上使用until/retries/delay循环。如果可以,这个问题可以通过循环检查和wait_for_连接来解决

我找到的方法等待系统重新启动,然后开始检查线路:

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处理程序。您可能需要处理一些超时和延迟,以避免错过重新启动。

这是一个很好的实现。谢谢你。