我正在尝试确定更新过程何时完成(更新会在一段时间后强制重新启动,这会造成麻烦)。我怀疑最好的方法是通过从远程主机连续将文件下载到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
是否可以遍历整个剧本,每次检查该行是否存在时将重新连接到主机?还是有更好的方法来解决这个难题?
答案 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进行强制处理程序。您可能需要忍受超时和延迟,以免错过重启机会。