Commit ad821dc7 authored by Spiros Koulouzis's avatar Spiros Koulouzis

Run playbook.yml

parent 219855d6
...@@ -7,93 +7,91 @@ from ansible.vars import VariableManager ...@@ -7,93 +7,91 @@ from ansible.vars import VariableManager
from ansible.inventory import Inventory from ansible.inventory import Inventory
from ansible.playbook.play import Play from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase
import ansible.executor.task_queue_manager import ansible.executor.task_queue_manager
import ansible.inventory import ansible.inventory
import ansible.parsing.dataloader import ansible.parsing.dataloader
import ansible.playbook.play import ansible.playbook.play
import ansible.plugins.callback import ansible.plugins.callback
import ansible.vars import ansible.vars
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.plugins import callback_loader
import os
import logging
import yaml
import sys
from results_collector import ResultsCollector
class ResultCallback(CallbackBase):
"""A sample callback plugin used for performing an action as results come in
If you want to collect all results into a single object for processing at hosts='172.17.0.2,172.17.0.3,'
the end of the execution, look into utilizing the ``json`` callback plugin playbook_path = 'playbook.yml'
or writing your own custom callback plugin if not os.path.exists(playbook_path):
""" print '[ERROR] The playbook does not exist'
def v2_runner_on_ok(self, result, **kwargs): sys.exit()
"""Print a json representation of the result
user='vm_user'
ssh_key_file='id_ras'
extra_vars = {'resultslocation':'/tmp/res'}
variable_manager = VariableManager()
loader = DataLoader()
This method could store the result in an instance attribute for retrieval later inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=hosts)
"""
host = result._host
print json.dumps({host.name: result._result})
class Options(object): Options = namedtuple('Options', ['listtags', 'listtasks', 'listhosts', 'syntax', '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'])
def __init__(self, check=True): options = Options(listtags=False, listtasks=False, listhosts=False, syntax=False, connection='smart', module_path=None, forks=None, remote_user=user, private_key_file=ssh_key_file, ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None, become=True, become_method='sudo', become_user='root', verbosity=None, check=False)
self.connection = "smart"
self.module_path = None
self.forks = None
self.remote_user = None
self.private_key_file = None
self.ssh_common_args = None
self.ssh_extra_args = None
self.sftp_extra_args = None
self.scp_extra_args = None
self.become = None
self.become_method = None
self.become_user = None
self.verbosity = None
self.check = check
super(Options, self).__init__()
options = Options(check=False) variable_manager.extra_vars = extra_vars
passwords = {}
# initialize needed objects
variable_manager = ansible.vars.VariableManager()
loader = DataLoader() pbex = PlaybookExecutor(playbooks=[playbook_path],
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
options=options,
passwords=passwords,
)
# Instantiate our ResultCallback for handling results as they come in results_callback = ResultsCollector()
results_callback = ResultCallback() pbex._tqm._stdout_callback = results_callback
results = pbex.run()
# create inventory and pass to var manager
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list='172.17.0.4,172.17.0.5')
variable_manager.set_inventory(inventory) ok = results_callback.host_ok
count=0;
# create play with tasks for res in ok:
play_source = dict( re = json.dumps(res['result']._result)
name = "Ansible Play", ++count
hosts = 'all', target = open("ok"+str(count)+".json", 'w')
gather_facts = 'no', target.write(re)
tasks = [ target.close()
dict(action=dict(module='shell', args='ls'), register='shell_out') print re
#,dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))
] count=0;
) unreachable = results_callback.host_unreachable
play = Play().load(play_source, variable_manager=variable_manager, loader=loader) for res in unreachable:
re = json.dumps(res['result']._result)
# actually run it ++count
tqm = None target = open("unreachable"+str(count)+".json", 'w')
try: target.write(re)
tqm = TaskQueueManager( target.close()
inventory=inventory, print re
variable_manager=variable_manager,
loader=loader,
options=options,
passwords=None,
#stdout_callback='json',
stdout_callback=results_callback, # Use our custom callback instead of the ``default`` callback plugin
#stdout_callback='default',
)
result = tqm.run(play) count=0;
finally: host_failed = results_callback.host_failed
if tqm is not None: for res in host_failed:
tqm.cleanup() re = json.dumps(res['result']._result)
\ No newline at end of file ++count
target = open("host_failed"+str(count)+".json", 'w')
target.write(re)
target.close()
print re
\ No newline at end of file
...@@ -20,7 +20,7 @@ __author__ = 'S. Koulouzis' ...@@ -20,7 +20,7 @@ __author__ = 'S. Koulouzis'
import paramiko, os import paramiko, os
import threading import threading
import ansible.runner import ansible.runner
from ansible.playbook import PlayBook from results_collector import ResultsCollector
def install_prerequisites(vm): def install_prerequisites(vm):
try: try:
...@@ -50,8 +50,4 @@ def run(vm_list,playbook): ...@@ -50,8 +50,4 @@ def run(vm_list,playbook):
user = vm.user user = vm.user
if "ERROR" in ret: return ret if "ERROR" in ret: return ret
# construct the ansible runner and execute on all hosts
results = ansible.runner.Runner(pattern='*', forks=10, module_name='command', module_args='/usr/bin/uptime',).run()
return "SUCCESS" return "SUCCESS"
\ No newline at end of file
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAvwasjBZG8lAvO0+FnNWuAtQjyrWJ8X3sZijjrVLWLqfgrbx3
837U78DDuFXspHF4/rUN5yZ4ggt/3HSrOzTVhLy0K7bQAUeZG0JQ9a4wkY7CwGfi
rgskQVyATONZs5fqBa5443qFSOLllmsMjoues7dl1/9dGqsb1NkxneC2HSp6ODb3
uri9/s8+W0r6dac3kIpRECWIEzGZGtOmAfWZwwkkSXIdjJ2gT+euDTACa1YN5Thy
CrJHzYRuDEDvTmjKab+K8hv9yzk2dWvKYMYu0WZOPnDf2e6xlVybl2uTeDVlXTIl
tu+Divo8frzyhAZdMLe89kaPAV2gI4GX7Im40QIDAQABAoIBAEnwdGM40DdEkDOd
4TLGhrczk7MHt6AQxKr6Ur4o3RxsAIxe8fL++b7fVyKHp7Qy88lrHTmGa4iymMgl
JI4jMi5RuE9fUH3eT8X8Ukf2J3h/0KQW0efaCit+eW7JZVQdjgiq8sHiD6sZoBIr
101pf4FCkJodjtUevAQUGZ9pdjQtK8HmBVGjs5q0YoJJukOqoWkk7In2HODPdKY/
Ff7aRI+QDrVGB++PREpKY7aLd4Eai5kvhqpEUK+HomSaXRkGAcgmWsS5r10ntC4T
NTPVijBXuJfglI9ytzbX72a7/g4Dom3WcOahpSm9A0kmvGP+x5CsOWIKRghCyzOK
5qapAcECgYEA9cEO+f+ilpN1Uke7uJbOWlC/+KJnHKs1d8TAYNjYKeTo+bCPAWEY
wxjM/kRnsSBNFgdpsZKZHbccHMTCDh1FDKP9Ydjry2OFc6/tTFehIfXnexOwxNCl
KldRH9yYqh1QcnlHBx3q9mwQKF075CR/Rk8zqZgq7AQIGfxOZglY7QkCgYEAxv2A
TYAPIKnuUhkl6blq4en0sawN71Pg6Gk+DA0rAaBBoNR7bzCQGQ3nBsRCcETy+yi6
cD2ya3Q6a6gwJ/joIXVOCNBSDd02BeeZxI6h2x2ok1R6fNN271gheyhq20l1cH+y
k9gYr8MgkHX5AzRFtW3volDmtEWDRAclsKVCp4kCgYAqDvBROL7KplHd0wj9flGy
gz9XffPHpEVySeniqTnVcaetk9nlkoh6WzQ6D9rvJWgL7RjZmw05WK0m/0V2xOuc
TjR/GnDATjf4pJMoDZc2CK+lEKmgBVU++dKYcVhvRLUP4lGVljkwEy5wugQV92kQ
z104GSK/YbFBQTzpmY/ugQKBgCMIalg6nW8wu6Z0ivo1DJ4tZEkLc4CZEdWZAbV5
dALbRfKctgaDVDs0+WF1mATP/r89EmXEVu8YDVj6yU+gQK3zSwO+OVP7iBFODwJN
4i0DcbROgSoMyLmmmG5oVTe6HRTrRnNE7kOzZL5KJsbrowIoErJO7+749f06DOam
ka+RAoGBAJ5+awU/gJusZW1K+dAVIYtY9lwB/HFlTnsPIpgUPpdywilESlowD7dH
JnthsSbFmzl/KorI8megzelC/HDotig78GViL45s/LxnvuSvVmxBK2nb44KmHTV4
ypE44UC+s5BEe/aTUtke5mmVY5lLR2SoCeUCKA2llKhrskvt+/cZ
-----END RSA PRIVATE KEY-----
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/BqyMFkbyUC87T4Wc1a4C1CPKtYnxfexmKOOtUtYup+CtvHfzftTvwMO4VeykcXj+tQ3nJniCC3/cdKs7NNWEvLQrttABR5kbQlD1rjCRjsLAZ+KuCyRBXIBM41mzl+oFrnjjeoVI4uWWawyOi56zt2XX/10aqxvU2TGd4LYdKno4Nve6uL3+zz5bSvp1pzeQilEQJYgTMZka06YB9ZnDCSRJch2MnaBP564NMAJrVg3lOHIKskfNhG4MQO9OaMppv4ryG/3LOTZ1a8pgxi7RZk4+cN/Z7rGVXJuXa5N4NWVdMiW274OK+jx+vPKEBl0wt7z2Ro8BXaAjgZfsibjR alogo@hermes
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
- expect - expect
- git - git
- python-pexpect - python-pexpect
- php-zip
become: true become: true
- name: Phoronix-test-suite accept User Agreement - name: Phoronix-test-suite accept User Agreement
......
#!/usr/bin/env python
# Copyright 2017 S. Koulouzis
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from ansible.plugins.callback import CallbackBase
__author__ = 'S. Koulouzis'
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, ignore_errors=False):
name = result._host.get_name()
task = result._task.get_name()
#self.host_unreachable[result._host.get_name()] = result
self.host_unreachable.append(dict(ip=name, task=task, result=result))
def v2_runner_on_ok(self, result, *args, **kwargs):
name = result._host.get_name()
task = result._task.get_name()
if task == "setup":
pass
elif "Info" in task:
self.host_ok.append(dict(ip=name, task=task, result=result))
else:
self.host_ok.append(dict(ip=name, task=task, result=result))
def v2_runner_on_failed(self, result, *args, **kwargs):
name = result._host.get_name()
task = result._task.get_name()
self.host_failed.append(dict(ip=name, task=task, result=result))
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment