问题1
问题1、如果一个任务执行超过15分钟还没有返回,如何设置超时
答:
首先,把所有任务设置超时,这个并不是一个非常好的解决思路,如果设置超时,就不关心任务的最终结果状态了,如果任务执行到一半,比如安装某个服务,到一半终止了,这个task是执行了,但最终结>果状态不可知。甚至还有可能导致更坏的情况产生。
可以通过ansible本身来作,ansible默认采用的是同步模式,这种模式会造成阻塞,可以搜索下ansible异步模式。
异步模式下,ansible会将节点的任务丢在后台,每台被控制的机器都有一个job_id,ansible会根据这个job_id去轮训该机器上任务的执行情况,例如某机器上此任务中的某一个阶段是否完成,是否进入下>一个阶段等。即使任务早就结束了,但只有轮训检查到任务结束后才认为该job结束。可以指定任务检查的时间间隔,默认是10秒。除非指定任务检查的间隔为0,否则会等待所有任务都完成后,ansible端才
会释放占用的shell。
如果指定时间间隔为0,则ansible会立即返回(至少得连接上目标主机,任务发布成功之后立即返回),并不会去检查它的任务进度。(这个时候你可以理解成ansible已经默认设置为超时)
如下场景:
1、adhoc执行模式
这里的 -P 表示多长时间周期进行后台任务的定期检测,这里设置的为10s,如果将此数值设置为0则不在关心其返回结果。
-B 表示开启异步的运行方式,x秒,表示在运行超过多少秒后将标记此任务失败
ansible centos -B20 -P 10 -m command -a "sleep 5" -o -f 6
2、playbook的场景
通过playbook的剧本如下:
async 和ad-hoc 模式下的-B选项一样
poll 和ad-hoc 模式下的-p选项一样
- name: 'YUM - fire and forget task'
yum: name=nginx state=installed
async: 1000
poll: 0
register: yum_sleeper
问题2
问题2、ansible在执行任务时,如果任务没有执行完,网络突然中断,系统是如何处理这类异常的?
答:
如果ansible没有此类的处理机制,如何自己开发出这样的功能?
如果ansible执行时网络彻底中断,那么正在进行一批次的任务(统称为A组任务)执行结果是获取不到或者失败的。
对于ansible而言,when+fail模块来判断将不在向继续执行或者直接中断。
如果A组任务采用的是异步方式,并将poll设置为0.这个时候ansible不会关心a组任务的执行情况,默认继续执行
下一组任务,如果正好此时网络恢复,则对ansible的后续任务不会产生影响。
要避免这种问题,其实就是Agent端的好处了,ansible官方并没有ansible端。但可以进行二次开发,如果有了agent客户端。
客户端就能实现更好的容错,并且变为主动模式来返回中断的支持结果,保证ansible服务能获取到每一次的任务执行结果返回。
问题3
问题3、任务下发后,如何实现人工停止任务。(比如已执行50台,还有150台未执行)
答:
如果是ansible命令方式,只能是中断程序运行。
如果是后台程序,在设计程序之初,可以加入全局任务锁的方式,利用界面开关项来中断后面的任务进行。这也是需要修改ansible的源代码的地方。