# -*- 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'][i]
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()
---
- hosts: all
remote_user: root
vars:
- user: devuser
- passwd: $1$0.XYbms/$YJjrhMEM.ld/bzCs20Fpv1
tasks:
- name: create user
user: name={{ user }} password={{ passwd }}
- name: ensure_yum_packages
yum: pkg={{ item }} state=latest
with_items:
- gcc-c++
- java
- ntpdate
- texinfo
- make
- gcc-c++
- net-tools
- lsof
ignore_errors: True
- name: update time
command: ntpdate time.windows.com
- include: /etc/ansible/check_system_version/main.yml
...

另附一段playbook。

这段代码就是调用palybook去执行,然后把执行的结果返回回来,能够用于自动化平台的开发,生成playbook后,按组执行,然后根据得到返回的数据来判断执行情况,总的来说就是输入playbook,返回结果。代码东拼西凑了来自ansible权威指南,一些gitlab,一些百度文章。感觉callback类里面东西还有很多,如果做自动化平台开发,还可以再深入研究。

python调用ansible api 2.0 运行playbook带callback返回的更多相关文章

  1. Python调用ansible API系列(三)带有callback的执行adhoc和playbook

    在第二篇文章中虽然可以执行adhoc和playbook但是执行结果的输出并不是特别直观,虽然没有报错但是到底什么结果其实你是不知道的尤其是在执行adhoc的时候,这时候我们要利用callback来设置 ...

  2. Python调用ansible API系列(五)综合使用

    如何把动态生成资产信息.执行playbook以及自定义结果结合起来用呢? #!/usr/bin/env python # -*- coding: utf-8 -*- """ ...

  3. Python调用ansible API系列(四)动态生成hosts文件

    方法一:通过最原始的操作文件的方式 #!/usr/bin/env python # -*- coding: utf-8 -*- """ 通过操作文件形式动态生成ansib ...

  4. Python调用ansible API系列(一)获取资产信息

    你想让ansible工作首先就需要设置资产信息,那么我们如何通过使用Python调取Ansible的API来获取资产信息呢? 要提前准备一个hosts文件 获取组或者主机 #!/usr/bin/env ...

  5. Python调用ansible API系列(二)执行adhoc和playbook

    执行adhoc #!/usr/bin/env python # -*- coding: utf-8 -*- import sys from collections import namedtuple ...

  6. 基于python调用libvirt API

    基于python调用libvirt API 1.程序代码 #!/usr/bin/python import libvirt import sys def createConnection(): con ...

  7. 关于python调用zabbix api接口

    因公司业务需要,引进了自动化运维,所用到的监控平台为zbbix3.2,最近正在学习python,计划使用python调用zabbix api接口去做些事情,如生成报表,我想最基本的是要取得zabbix ...

  8. Python调用win32 API绘制正弦波

    Python调用win32 API新建窗口与直接创建窗口的流程相同 流程:注册窗口→创建窗口→显示窗口→更新窗口→消息循环 代码: # -*- coding: utf-8 -*- import win ...

  9. 使用Python调用Flickr API抓取图片数据

    Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...

随机推荐

  1. 实例学习SSIS(四)--使用日志记录和错误流重定向

    原文:实例学习SSIS(四)--使用日志记录和错误流重定向 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习 ...

  2. html5 canvas+js实现ps钢笔抠图

    html5 canvas+js实现ps钢笔抠图 1. 项目要求需要用js实现photoshop中钢笔抠图功能,就用了近三四天的时间去解决它,最终还是基本上把他实现了. 做的过程中走了不少弯路,最终一同 ...

  3. VS多平台开发

    Xamarin技术文档------VS多平台开发   此技术业余时间研究,仅供大家学习参考,不涉及深入研究,有一定开发基础的人员,应该都能较快上手. 一.简介 Xamarin始创于2011年,旨在使移 ...

  4. quartz_spring 定时器配置

    quartz:石英,表达精确准时的意思. quartz-all-1.6.1.jar 主要用于定时任务管理. <?xml version="1.0" encoding=&quo ...

  5. android判断网络的类型

    转自:http://blog.csdn.net/xxxsz/article/details/8199031 判断网络类型是wifi,还是3G,还是2G网络 对不同的网络进行不同的处理,现将判断方法整理 ...

  6. 记录OC学习的一点一滴(二)

    NSString 基础练习: 代码: // // main.m // NSStringDemo01 // // Created by Levi on 14-3-14. // Copyright (c) ...

  7. Go语言搭建自己的博客

    我是如何用Go语言搭建自己的博客的   前言: 话说,已经很久没有在博客园更新博客了,之前写的关于go语言的系列学习文章<让我们一起Go>也由于种种原因一度中断.但是,正如我之前在文章中所 ...

  8. JavaScript插件——模态框

    Bootstrap3.0学习第十七轮(JavaScript插件——模态框)   前言 阅读之前您也可以到Bootstrap3.0入门学习系列导航中进行查看http://www.cnblogs.com/ ...

  9. ASP.NET MVC企业开发的基本环境

    ASP.NET MVC企业开发的基本环境[资源服务器概念] 学完了ASP.NET MVC4 IN ACTION 六波以后 企业开发演习 标签:AaronYang  茗洋  EasyUI1.3.4   ...

  10. ibatis-Spring 整合

    这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同 ...