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

时间:2019-03-03 11:24:10

标签: ansible

我正在尝试确定更新过程何时完成(更新会在一段时间后强制重新启动,这会造成麻烦)。我怀疑最好的方法是通过从远程主机连续将文件下载到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

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

1 个答案:

答案 0 :(得分: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

您需要在处理程序中使用包含项,以确保任务以正确的顺序运行。由于超时,或者主机重启时,这就是我们正在寻找的任务,“等待重启”任务将始终失败。发生这种情况时,需要运行处理程序,因此您需要在配置文件中或在剧本执行时将其作为参数--force-handlers进行强制处理程序。您可能需要忍受超时和延迟,以免错过重启机会。