1. ansisble2.x playbook api与ansible1.9.x的相差很大,而且直观看来配置复杂多了
2.以下案例是通过loggin打印出来ansible模块执行结果,如若需要得到,可以加入中间件,如rabbitmq,将消息publish出去,另一处消费该消息即可
(1) ansible1.9.x playbook api
#!/usr/bin/env python
# coding=utf-8
import ansible.runner
import logging
from ansible.playbook import PlayBook
from ansible.inventory import Inventory
from ansible import callbacks
from ansible import utils
from ansible import callbacks
class PlaybookRunnerCallbacks(callbacks.PlaybookRunnerCallbacks):
def __init__(self, stats, verbose=None):
super(PlaybookRunnerCallbacks, self).__init__(stats, verbose)
def on_ok(self, host, host_result):
super(PlaybookRunnerCallbacks, self).on_ok(host, host_result)
logging.warning('===on_ok====host=%s===result=%s'%(host,host_result))
def on_unreachable(self, host, results):
super(PlaybookRunnerCallbacks, self).on_unreachable(host, results)
logging.warning('===on_unreachable====host=%s===result=%s'%(host,results))
def on_failed(self, host, results, ignore_errors=False):
super(PlaybookRunnerCallbacks, self).on_failed(host, results, ignore_errors)
logging.warning('===on_unreachable====host=%s===result=%s'%(host,results))
def on_skipped(self, host, item=None):
super(PlaybookRunnerCallbacks, self).on_skipped(host, item)
logging.warning("this task does not execute,please check parameter or condition.")
class PlaybookCallbacks(callbacks.PlaybookCallbacks):
def __init__(self,verbose=False):
super(PlaybookCallbacks, self).__init__(verbose)
def on_stats(self, stats):
super(PlaybookCallbacks, self).on_stats( stats)
logging.warning("palybook executes completed====")
hosts = ['127.0.0.1', '192.168.234.3']
inventory = Inventory(hosts)
stats = callbacks.AggregateStats()
runner_cb = PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
playbook_cb = PlaybookCallbacks()
res=ansible.playbook.PlayBook(
playbook='/tmp/playbook.yaml',
stats=stats,
callbacks=playbook_cb,
runner_callbacks=runner_cb,
inventory=inventory,
forks=200
)
result = res.run()
playbook_cb.on_stats(res.stats)
2. ansible2 playbook api
#!/usr/bin/env python
# coding=utf-8
import json
import logging
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.plugins.callback import CallbackBase
from collections import namedtuple
from ansible import constants as C
class ResultsCollector(CallbackBase):
def __init__(self,*args, **kwargs):
super(ResultsCollector, self).__init__(*args, **kwargs)
def _get_return_data(self, result):
try:
if result.get('msg',None):
return_data= result.get('msg')
elif result.get('stderr',None):
return_data= result.get('stderr')
else:
return_data = result
except:
pass
return return_data.encode('utf-8')
def v2_runner_on_ok(self, result):
host = result._host.get_name()
self.runner_on_ok(host, result._result)
logging.warning('===v2_runner_on_ok====host=%s===result=%s'%(host,result._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)
return_data = self._get_return_data(result._result)
logging.warning('===v2_runner_on_failed====host=%s===result=%s'%(host,return_data))
def v2_runner_on_unreachable(self, result):
host = result._host.get_name()
self.runner_on_unreachable(host, result._result)
return_data = self._get_return_data(result._result)
logging.warning('===v2_runner_on_unreachable====host=%s===result=%s'%(host,return_data))
def v2_runner_on_skipped(self, result):
if C.DISPLAY_SKIPPED_HOSTS:
host = result._host.get_name()
self.runner_on_skipped(host, self._get_item(getattr(result._result,'results',{})))
logging.warning("this task does not execute,please check parameter or condition.")
def v2_playbook_on_stats(self, stats):
logging.warning('===========palybook executes completed========')
loader = DataLoader()
variable_manager = VariableManager()
inventory = Inventory(loader = loader, variable_manager = variable_manager, host_list = ['127.0.0.1', '192.168.234.3'])
variable_manager.set_inventory(inventory)
variable_manager.extra_vars={"ansible_ssh_user":"root"} #额外参数,包括playbook参数 key:value
Options = namedtuple('Options',
[ 'connection',
'remote_user',
'ask_sudo_pass',
'verbosity',
'ack_pass',
'module_path',
'forks',
'become',
'become_method',
'become_user',
'check',
'listhosts',
'listtasks',
'listtags',
'syntax',
'sudo_user',
'sudo'])
options = Options(
connection='smart',
remote_user='root',
ack_pass=None,
sudo_user='root',
forks=200,
sudo='yes',
ask_sudo_pass=False,
verbosity=5,
module_path=None,
become=True,
become_method='su',
become_user='root',
check=None,
listhosts=None,
listtasks=None,
listtags=None,
syntax=None)
playbook = PlaybookExecutor(playbooks=['/tmp/playbook.yaml'],
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
options=options,
passwords=None)
playbook._tqm._stdout_callback = ResultsCollector()
res = playbook.run()