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

[经验分享] python调用ansible api 2.0 运行playbook带callback返回

[复制链接]

尚未签到

发表于 2018-1-2 11:01:20 | 显示全部楼层 |阅读模式
# -*- coding:utf8 -*-  
'''
  
Created on 2017年1月13日
  

  
@author: qiancheng
  
'''
  

  
import os
  
import json
  
from collections import namedtuple
  
from ansible.inventory import Inventory
  
from ansible.vars import VariableManager
  
from ansible.parsing.dataloader import DataLoader
  
from ansible.executor.playbook_executor import PlaybookExecutor
  
from ansible.plugins.callback import CallbackBase
  
from ansible.errors import AnsibleParserError
  

  
class mycallback(CallbackBase):
  #这里是状态回调,各种成功失败的状态,里面的各种方法其实都是从写于CallbackBase父类里面的,其实还有很多,可以根据需要拿出来用
  def __init__(self,*args):
  super(mycallback,self).__init__(display=None)
  self.status_ok=json.dumps({})
  self.status_fail=json.dumps({})
  self.status_unreachable=json.dumps({})
  self.status_playbook=''
  self.status_no_hosts=False
  self.host_ok = {}
  self.host_failed={}
  self.host_unreachable={}
  def v2_runner_on_ok(self,result):
  host=result._host.get_name()
  self.runner_on_ok(host, result._result)
  #self.status_ok=json.dumps({host:result._result},indent=4)
  self.host_ok[host] = result
  def v2_runner_on_failed(self, result, ignore_errors=False):
  host = result._host.get_name()
  self.runner_on_failed(host, result._result, ignore_errors)
  #self.status_fail=json.dumps({host:result._result},indent=4)
  self.host_failed[host] = result
  def v2_runner_on_unreachable(self, result):
  host = result._host.get_name()
  self.runner_on_unreachable(host, result._result)
  #self.status_unreachable=json.dumps({host:result._result},indent=4)
  self.host_unreachable[host] = result
  def v2_playbook_on_no_hosts_matched(self):
  self.playbook_on_no_hosts_matched()
  self.status_no_hosts=True
  def v2_playbook_on_play_start(self, play):
  self.playbook_on_play_start(play.name)
  self.playbook_path=play.name
  

  
class my_ansible_play():
  #这里是ansible运行
  #初始化各项参数,大部分都定义好,只有几个参数是必须要传入的
  def __init__(self, playbook, extra_vars={},
  host_list='/etc/ansible/hosts',
  connection='ssh',
  become=False,
  become_user=None,
  module_path=None,
  fork=50,
  ansible_cfg=None,   #os.environ["ANSIBLE_CONFIG"] = None
  passwords={},
  check=False):
  self.playbook_path=playbook
  self.passwords=passwords
  self.extra_vars=extra_vars
  Options = namedtuple('Options',
['listtags', 'listtasks', 'listhosts', 'syntax', 'connection','module_path',

  'forks', 'private_key_file', 'ssh_common_args', 'ssh_extra_args', 'sftp_extra_args',
  'scp_extra_args', 'become', 'become_method', 'become_user', 'verbosity', 'check'])
  self.options = Options(listtags=False, listtasks=False,
  listhosts=False, syntax=False,
  connection=connection, module_path=module_path,
  forks=fork, private_key_file=None,
  ssh_common_args=None, ssh_extra_args=None,
  sftp_extra_args=None, scp_extra_args=None,
  become=become, become_method=None,
  become_user=become_user,
  verbosity=None, check=check)
  if ansible_cfg != None:
  os.environ["ANSIBLE_CONFIG"] = ansible_cfg
  self.variable_manager=VariableManager()
  self.loader=DataLoader()
  self.inventory=Inventory(loader=self.loader,variable_manager=self.variable_manager,host_list=host_list)
  #定义运行的方法和返回值
  def run(self):
  complex_msg={}
  if not os.path.exists(self.playbook_path):
  code=1000
  results={'playbook':self.playbook_path,'msg':self.playbook_path+' playbook is not exist','flag':False}
  #results=self.playbook_path+'playbook is not existed'
  #return code,complex_msg,results
  pbex= PlaybookExecutor(playbooks=[self.playbook_path],
  inventory=self.inventory,
  variable_manager=self.variable_manager,
  loader=self.loader,
  options=self.options,
  passwords=self.passwords)
  self.results_callback=mycallback()
  pbex._tqm._stdout_callback=self.results_callback
  try:
  code=pbex.run()
  except AnsibleParserError:
  code=1001
  results={'playbook':self.playbook_path,'msg':self.playbook_path+' playbook have syntax error','flag':False}
  #results='syntax error in '+self.playbook_path #语法错误
  return code,results
  if self.results_callback.status_no_hosts:
  code=1002
  results={'playbook':self.playbook_path,'msg':self.results_callback.status_no_hosts,'flag':False,'executed':False}
  #results='no host match in '+self.playbook_path
  return code,results
  def get_result(self):
  self.result_all={'success':{},'fail':{},'unreachable':{}}
  #print result_all
  #print dir(self.results_callback)
  for host, result in self.results_callback.host_ok.items():
  self.result_all['success'][host] = result._result
  

  for host, result in self.results_callback.host_failed.items():
  self.result_all['failed'][host] = result._result['msg']
  

  for host, result in self.results_callback.host_unreachable.items():
  self.result_all['unreachable'][host]= result._result['msg']
  for i in self.result_all['success'].keys():
  print i,self.result_all['success']
  print self.result_all['fail']
  print self.result_all['unreachable']
  
if __name__ =='__main__':
  play_book=my_ansible_play('/etc/ansible/default_group/main.yml')
  play_book.run()
  play_book.get_result()

运维网声明 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-430765-1-1.html 上篇帖子: Ansible Galaxy 下篇帖子: Ansible自动化运维笔记3(playbook)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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