在Ansible中,如果系统在更新该行之前重新启动,如何重复获取文件直到存在一行?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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
是否有可能遍历整个剧本,每次检查该行是否存在时,该剧本将重新连接到主机?还是有更好的方法来解决这个难题?
这比应该的更困难,但无论如何我找到了一种方法。
这里的主要问题是你不能循环使用包含或块的直到/重试/延迟。如果可以的话,可以通过循环检查和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。你可能不得不玩掉超时和延迟一点,这样你就不会错过重启。
以上是关于在Ansible中,如果系统在更新该行之前重新启动,如何重复获取文件直到存在一行?的主要内容,如果未能解决你的问题,请参考以下文章
电脑在更新系统win11重新启动。,再开机就开不开了,怎么办?
带有 fetchedResultsController 的 Tableview 在应用重新启动或视图重新加载之前不会更新新内容