`
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from collections import namedtuple
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.plugins.callback import CallbackBase
# Create a callback object so we can capture the output
class ResultsCollector(CallbackBase):
def __init__(self, *args, **kwargs):
super(ResultsCollector, self).__init__(*args, **kwargs)
self.host_ok = {}
self.host_unreachable = {}
self.host_failed = {}
def v2_runner_on_unreachable(self, result):
self.host_unreachable[result._host.get_name()] = result
def v2_runner_on_ok(self, result, *args, **kwargs):
self.host_ok[result._host.get_name()] = result
def v2_runner_on_failed(self, result, *args, **kwargs):
self.host_failed[result._host.get_name()] = result
def ansibleRun(host_list,module,cmd):
Options = namedtuple('Options',
['connection',
'module_path',
'forks',
'remote_user',
'private_key_file',
'ssh_common_args',
'ssh_extra_args',
'sftp_extra_args',
'scp_extra_args',
'become',
'become_method',
'become_user',
'verbosity',
'check'
]
)
# initialize needed objects
variable_manager = VariableManager()
loader = DataLoader()
options = Options( connection='smart',
module_path=None,
forks=100,
remote_user=None,
private_key_file=None,
ssh_common_args=None,
ssh_extra_args=None,
sftp_extra_args=None,
scp_extra_args=None,
become=None,
become_method=None,
become_user=None,
verbosity=None,
check=False
)
passwords = dict()
# create inventory and pass to var manager
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=host_list)
variable_manager.set_inventory(inventory)
# create play with tasks
play_source = dict(
name = "Ansible Play",
hosts = host_list,
gather_facts = 'no',
tasks = [ dict(action=dict(module=module, args=dict(cmd=cmd))) ]
)
play = Play().load(play_source, variable_manager=variable_manager, loader=loader)
# actually run it
tqm = None
callback = ResultsCollector()
try:
tqm = TaskQueueManager(
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
options=options,
passwords=passwords,
)
tqm._stdout_callback = callback
result = tqm.run(play)
finally:
if tqm is not None:
tqm.cleanup()
results_raw = {'success': {}, 'failed': {}, 'unreachable': {}}
#print ("success ***********")
for host, result in callback.host_ok.items():
results_raw['success'][host] = ('{} >>> {}'.format(host, result._result['stdout']))
#print ("failed *******")
for host, result in callback.host_failed.items():
results_raw['failed'][host] = ('{} >>> {}'.format(host, result._result['msg']))
#print ("unreachable *********")
for host, result in callback.host_unreachable.items():
results_raw['unreachable'][host] = ('{} >>> {}'.format(host, result._result['msg']))
return results_raw
if __name__ == '__main__':
host_list = ['10.14.86.177', '10.14.86.178']
module='command'
cmd='uptime'
print (ansibleRun(host_list,module,cmd))
i want use copy.
if name == ‘main’:
host_list = [‘10.14.86.177’, ‘10.14.86.178’]
module=“command”
module=“copy”
cmd=“uptime”
cmd=“src=/opt/scripts dest=/opt/”
print ansibleRun(host_list,module,cmd)
`
`
error:
{‘failed’: {‘10.14.86.177’: ‘10.14.86.177 >>> src (or content) and dest are required’, ‘10.14.86.178’: ‘10.14.86.178 >>> src (or content) and dest are required’}, ‘success’: {}, ‘unreachable’: {}}
`
how to use other modules.