请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

三个问题(ansible内容补充)

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

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

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

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

正在回答 回答被采纳积分+3

1回答

Jeson 2018-04-11 18:11:47

问题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 回复 有任何疑惑可以回复我~
  • 提问者 慕数据7434023 #1
    关于超时的问题
    我在playbook加上async ,poll属性之后
    尝试很多模块都提示不支持,表示试过shell,command模板是支持async的
    我的ansible 版本是2.2.1.0
    
    得到如下错误:不支持该模块
    
    2018-04-12 22:51:32,447 p=73054 u=root |  fatal: [192.168.240.133]: FAILED! => {"failed": true, "msg": "async mode is not supported with the copy module"}
    2018-04-12 22:51:32,449 p=73054 u=root |  fatal: [192.168.240.137]: FAILED! => {"failed": true, "msg": "async mode is not supported with the copy module"}
    2018-04-12 22:51:32,468 p=73054 u=root |  fatal: [192.168.240.129]: FAILED! => {"failed": true, "msg": "async mode is not supported with the copy module"}
    回复 有任何疑惑可以回复我~ 2018-04-13 09:51:04
  • Jeson 回复 提问者 慕数据7434023 #2
    copy  template, raw,  fetch  这些模块都不支持异步,你要用的话,比如说copy模块,你可以试下用shell模块+rsync的方式替代
    回复 有任何疑惑可以回复我~ 2018-04-13 10:43:04
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信