平台化之利用ansible api接口的async使任务异步

今个也不前言了,直接切入主题 !


同事在做一个关于方便的批量上线初始化的平台,其实我真不想说平台两个字,啥都平台,显得有些不时尚了 。 ansible是个好东西,只是上线打包初始化的任务太耗时间,经常是20分钟左右。这时候需要异步的执行,对于ansible来说,客户端把消耗时间的任务通过signal信号来处理,把结果扔到以jid为文件名的文件里。。。

(这两天写个用tornado 实现ansible的web ui)   

终端执行的结果:


wKiom1OPRLXS8lMbAASdiMRI_fo505.jpg

在运行的过程中,我强制中断主进程。

因为任务是fork到守候进程,所以任务还是被执行的。


想知道他是怎么异步的获取状态的么?

比起saltstack这种逆天的工具来说,ansible的返回值显得有点不时尚。 

他的任务结果会输出到.ansible_aysnc的一个token文件里面的。然后你每次去poll任务,他都是拿着这个jid,然后ssh到客户端cat数据,然后把数据json.loads。

当执行异步任务的时候,我监控了22端口的行为数据。

配合上面的python调用ansible api 的那个脚本


进程的监控,会看到我每次poll数据的时候,都是派生了一个新进程。


看看客户端的那几个临时文件


command是模块,用来执行linux命令的。argument文件里面是给command传递的参数,async_wrapper这个是关键。  是这次任务能异步起来的核心文件。


原文:http://rfyiamcool.blog.51cto.com/1030776/1422263

看这段代码可以看出ansible使用异步的时候,所采用的一些方法。

看了这个脚本,在结合上线咱们ps aux抓到的正在执行的ansible过来的ssh执行的命令。

/usr/bin/python /root/.ansible/tmp/ansible-tmp-1401896304.86-33623655469433/async_wrapper 701347917770 30 /root/.ansible/tmp/ansible-tmp-1401896304.86-33623655469433/command /root/.ansible/tmp/ansible-tmp-1401896304.86-33623655469433/arguments

给async_wrapper传递了四个参数,jid,超时的时间,引用的模块,传递给模块的参数。 jid给aysnc_wrapper,是为了把结果序列化json存入到jid文件里面。给的时间,是用来通过signal信号做超时的限制 !  模块和参数就不讲了,你应该懂!



话说,ansible为了兼容别的语言,还真是做了不少的牺牲。一切都是各种标准输入输出的。。。。哎,如果把ansible api 的async处理方式用在ansible的web平台上,有些不合适。当然,你如果耗得起貌似都ssh过去,认证,执行,然后扔到async_wrapper文件里面的过程,那你…….(nx)。 话说ansible真的不快……你真的可以试试。。。。 

建议大家看看ansible api的源码,实现下returners的方式。  同事已经实现了,其实很简单,有兴趣的朋友,可以在看看我上次的那个ansible runner源码的文章,肯定能找到思路。   还有大家也可以通过修改 async_wrapper的代码实现returner。   这两天有时间会写点 ansible做web平台上遇到的问题。


对Golang感兴趣的朋友可以加群: 278517979 !!!
另外如果大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码, 感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">