猜猜猜,是人类对于奇怪事件发生的根本原因不清楚的情况下,所做出的相对合理的解释。是一种好的习惯!
这里我们想说的一件事情是,如果我们有能力,而且有资料可以探查事件发生原由的时候,就不要猜了!不是说不能猜,而是说需要将我们猜的结果和实际的原因做对比,以验证我们猜的能力。
举一个例子:前些天我们自动测试组遇到一个问题,说再带实验设备的时候,总是要等上好长的时间,才能完成安装。最后定位到一个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。
所以如果有能力和资料的情况下就不要猜了,而是应该自己探查一下加深印象。当然开源软件的长处一定要用上!以便提升自己!