设为首页 收藏本站
查看: 980|回复: 0

[经验分享] Ansible callbacks plugin 笔记

[复制链接]

尚未签到

发表于 2018-7-30 12:50:08 | 显示全部楼层 |阅读模式
  http://rfyiamcool.blog.51cto.com/1030776/1440624
  http://www.shencan.net/index.php/2014/07/17/ansible-%E6%8F%92%E4%BB%B6%E4%B9%8Bcallback_plugins-%EF%BC%88%E5%AE%9E%E6%88%98%EF%BC%89/
  https://github.com/ansible/ansible/tree/devel/plugins/callbacks
  http://docs.ansible.com/developing_plugins.html
  这个是把ansible的执行结果记录下来,官网提供log,mail等方式。
  http://jpmens.net/2012/09/11/watching-ansible-at-work-callbacks/
  这个哥们把它写到sqlite里了。
  lib/ansible/callback_plugins/inventory.py
  import os
  import time
  import sqlite3
  dbname = '/etc/ansible/setup.db'
  TIME_FORMAT='%Y-%m-%d %H:%M:%S'
  try:
  con = sqlite3.connect(dbname)
  cur = con.cursor()
  except:
  pass
  def log(host, data):
  if type(data) == dict:
  invocation = data.pop('invocation', None)
  if invocation.get('module_name', None) != 'setup':
  return
  facts = data.get('ansible_facts', None)
  now = time.strftime(TIME_FORMAT, time.localtime())
  try:
  # `host` is a unique index
  cur.execute("REPLACE INTO inventory (now, host, arch, dist, distvers, sys,kernel) VALUES(?,?,?,?,?,?,?);",
  (
  now,
  facts.get('ansible_hostname', None),
  facts.get('ansible_architecture', None),
  facts.get('ansible_distribution', None),
  facts.get('ansible_distribution_version', None),
  facts.get('ansible_system', None),
  facts.get('ansible_kernel', None)
  ))
  con.commit()
  except:
  pass
  class CallbackModule(object):
  def runner_on_ok(self, host, res):
  log(host, res)
  然后导出到csv文件
  #!/bin/sh
  sqlite3 /etc/ansible/setup.db <<EOF
  .headers on
  .mode csv
  .output setup.csv
  SELECT * FROM inventory;
  EOF
  http://stackoverflow.com/questions/25086586/better-way-of-merging-two-json-strings-in-python-for-ansible-callback-plugin
  json_log
  res = {"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584",  "stdout": "Hello World", "changed": True, "start": "2014-08-01 19:32:38.707510", "delta": "0:00:00.007074", "stderr": "", "rc": 0, "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}
  def json_log(res, host):
  if isinstance(res,dict) and 'verbose_override' not in res:
  res.update({"host": host})
  combined_json  = JSONEncoder().encode(res)
  print(combined_json)
  In [73]: json_log(res,"centos")
  {"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": true, "rc": 0, "start": "2014-08-01 19:32:38.707510", "host": "centos", "stderr": "", "delta": "0:00:00.007074", "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}
  //mysql 入库,代码未经测试
  USE `ansible`;
  DROP TABLE IF EXISTS `ansible_callbacks`;
  CREATE TABLE `ansible_callbacks` (
  `hosts` varchar(50) NOT NULL,
  `cmd` varchar(50) NOT NULL,
  `start` datetime() NOT NULL,
  `end` datetime() NOT NULL,
  `delta` varchar(255) NOT NULL,
  `changed` varchar(10) NOT NULL,
  `stdout` varchar(50),
  `stderr` varchar(50),
  `invocation` mediumtext NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  import sys
  import json
  import time
  import MySQLdb
  try:
  import MySQLdb
  HAS_MYSQL = True
  except ImportError:
  HAS_MYSQL = False
  def mysql_callback(host, res):
  res.update({"host":host})
  conn=MySQLdb.connect(host='localhost',user='root',passwd='mysqlpw',db='ansible',
  port=3306)
  cursor=conn.cursor()
  sql = '''INSERT INTO `ansible_callbacks`(`host`,`cmd`,`start`,`end`,`delta`,`changed`,'stdout',
  `stderr`, `invocation`)
  VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)'''
  cursor.execute(sql % (str(json.dumps(res['host'])),str(json.dumps(res['cmd'])),
  str(json.dumps(res['start'])),str(json.dumps(res['end'])),
  str(json.dumps(res['delta'])),str(json.dumps(res['changed'])),str(json.dumps(res['stdout'])),
  str(json.dumps(res['stderr'])),str(json.dumps(res['invocation']))))
  conn.commit()
  cursor.close()
  conn.close()
  class CallbackModule(object):
  def runner_on_ok(self, host, res):
  mysql_callback(host, res)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543603-1-1.html 上篇帖子: 自动化运维工具之ansible-DevilRex119 下篇帖子: 运维自动化之ansible playbook一键化解决大量主机bash更新问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表