前言:

    ansible的结果默认是输出到cli终端和日志里面的,用惯了saltsatck的returners数据回调后,也很是喜欢ansible也有,一开始不知道有这个功能,自己也简单实现了这样的功能。

我的实现方式是,在模块里面做一些输出的逻辑。当使用ansible runner api的时候,是在后面runner代码,最后加了一段往redis输出的逻辑。 这里实现数据的输出有些独特,但是只能是在模块和 api方面搞 。 如果是用playbook的话,按照我以前的思路的话,再继续改ansbile的源码。  这两天听沈灿说,ansible有个callback_plugins的功能,可以对于执行的状态做一些判断,比如,执行成功,执行失败,异步执行,异步执行失败,playbook开始,结束等等。 

我也不说复杂了,就简单说一个例子,把执行的结果,都推到redis里面,也可以暂存到sqlite数据库里面,只是这段代码我给屏蔽了,有兴趣的朋友再搞搞。对于redis里面的数据可以写一个页面展现下,专门记录错误的问题,成功的就pass掉。


wKiom1PLxF7RgYIpAANcxv3ltOA830.jpg


还是可以接收所有的facts数据的。

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


wKiom1PLz6jT6hSxAAvukgGOdaA867.jpg

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


虽然我上面的例子用了redis,sqlite数据库,其实我个人推荐用mongodb这样的文档数据库的。因为ansible主runner函数,给callbacks传递了一个叫res的变量,他本身就是一个dict对象,如果放到redis的hash,sqlite的各种字段,够你烦的了,如果直接mongo,那就简单了,直接insert ! 欧了

wKiom1PL2CqjPJdLAAi3W-Hd6Xs379.jpg


这里在show一个邮件的callbacks代码,场景是,非常消耗时间的任务,当执行完成后,查看结果咋办?  但是你也可以在终端继续看,既然咱们讲了callbacks_plugins,就可以把结果push到你的邮箱里面,当然只给你发错误的,有问题的。 下面的callback代码需要自己替换成自己用的邮箱、密码、smtp服务器。

wKioL1PLzZbDY29sAAWL-68tvIQ014.jpg


也可以把结果以webhooks钩子的方式,做些你想做的东西。


callbacks的各种状态还是很多的,每个函数的字眼还是很好理解的。

比如:

on_any  哪都有他 !任何的状态他触发。

runner_on_failed 失败

runner_on_ok  成功

runner_on_unreachable 网络不可达

runner_on_no_hosts 没有主机

runner_on_async_poll 任务的异步执行

playbook_on_start  playbook执行的时候

等等。。。。  自己尝试吧 !

咱们可以简单看看ansible的callbacks源码。

规定了两个类,一个是供应ansible-playbook用的,还有一个是供应ansible,也就是cli。 根据各种的情况,调用不同的函数,首先会打到终端,再log日志,最后是自定义的callbacks的插件。 

好了,就这样了 !!!! 




对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品

5则回应给“ansible插件callbacks实现redis、mongodb输出”

  1. ac说道:

    大神 如何指定用哪个callbacks 当目录中有多个callback脚本时

    • 李文通说道:

      如果你是在命令行执行的话,默认是使用ansible的callbacks.CliRunnerCallbacks(),你是没办法在参数中指定的,要传的话,可以自己改源码实现。 如果你是调用runner.Runner接口的话,是可以传入相应的参数进行指定的。比如这样:from ansible import utilsyou_callback = utils.callback_loader.get(‘your_callback_name’)#在callback_plugins目录下面,要有你定义好的callback插件才行。

    • 李文通说道:

      比如这样使用playbook的api playbook = playbook params = params stats = callbacks.AggregateStats() playbook_cb = utils.callback_loader.get(‘your_callback_name’,verbose=utils.VERBOSITY) runner_cb = callbacks.PlaybookRunnerCallbacks(self.stats, verbose=utils.VERBOSITY) pb = ansible.playbook.PlayBook( playbook = self.playbook, stats = self.stats, callbacks = self.playbook_cb, runner_callbacks = self.runner_cb, check=False, extra_vars = self.params ) result = pb.run()对了这是ansible 1.9.1 版本的方式,其他的我没看不懂。

  2. 异类深呼吸说道:

    峰云果然屌,学习

  3. 刘志志说道:

    求友情链接。 专家。。

发表评论