三个问题(ansible内容补充)

来源:6-21 playbook异常处理

慕数据7434023

2018-04-10

  1. 如果一个任务执行超过15分钟还没有返回,如何设置超时?

  2. ansible在执行任务时,如果任务没有执行完,网络突然中断,系统是如何处理这类异常的

    如果ansible没有此类的处理机制,如何自己开发出这样的功能

  3. 任务下发后,如何实现人工停止任务。(比如已执行50台,还有150台未执行)

写回答

1回答

Jeson

2018-04-11

问题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的源代码的地方。


0
2
Jeson
回复
慕数据7434023
copy template, raw, fetch 这些模块都不支持异步,你要用的话,比如说copy模块,你可以试下用shell模块+rsync的方式替代
2018-04-13
共2条回复

Python+Django+Ansible Playbook自动化运维项目实战

【课程升级3.6版本】大牛全面践行DevOps,运维与开发间高效协作

861 学习 · 326 问题

查看课程