猜猜猜,是人类对于奇怪事件发生的根本原因不清楚的情况下,所做出的相对合理的解释。是一种好的习惯!

这里我们想说的一件事情是,如果我们有能力,而且有资料可以探查事件发生原由的时候,就不要猜了!不是说不能猜,而是说需要将我们猜的结果和实际的原因做对比,以验证我们猜的能力。

举一个例子:前些天我们自动测试组遇到一个问题,说再带实验设备的时候,总是要等上好长的时间,才能完成安装。最后定位到一个ansible的公共接口wait_for。这个接口的执行不在我们的预期内。期望的wait_for实现如下功能:在执行完最后一步设备安装。说明一下:这一步需要的时间大约半个小时,所以就想让ansible-wait_fore帮我们监听设备是否已经安装成功,如果安装成功,就走的下一步做自动测试。

使用的方法是:

name: Wait until host will be reachable
 wait_for:
 host: “$ip”
 timeout: 1800 # wait max 30 minutes for connection
 sleep: 10 # check host every 10 seconds

这里根据注释说明,我们可以得到我们想要的一个结果是每个10秒做一次检查,最多检查30分钟,这样如果中间15分钟的时候设备启动起来了,接着就可以继续做测试了。

但是如果查阅相关的使用说明,上面这个代码并不能达到我们的预期,实际的执行结果是直接sleep了30分钟。为什么呢?

下面是使用说明的一部分:

module: wait_for
 short_description: Waits for a condition before continuing
 description:
 - You can wait for a set amount of time C(timeout), this is the default if nothing is specified or just C(timeout) is specified.
 This does not produce an error.

这一句什么意思呢?就是说什么也不设置的情况下默认就做timeout检查,就是我们设置的30分钟。也就是默认就是sleep一个timeout时间。

这时候呢如果不深究其实现的话,只是根据说明,理解可能不够深入。当然也不需要去猜,因为我们有办法看它的实现,可以获取到源码:

https://codeload.github.com/ansible/ansible/zip/refs/heads/devel

根据源码去看wait_for.py,我们可以看到:

if not port and not path and state != 'drained':
    time.sleep(timeout)

这里很明显可以看到,在没有设置port,path等参数的时候默认就会sleep。

所以如果有能力和资料的情况下就不要猜了,而是应该自己探查一下加深印象。当然开源软件的长处一定要用上!以便提升自己!