Commit c234b5b2 authored by ibuler's avatar ibuler

Update AdHocRunner

parent eb5a9dd2
...@@ -10,49 +10,23 @@ from ops.models import TaskRecord ...@@ -10,49 +10,23 @@ from ops.models import TaskRecord
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
__all__ = ["Task", "SubTask"] __all__ = ["Task"]
logger = logging.getLogger(__name__)
class Task(models.Model): class Task(models.Model):
record = models.OneToOneField(TaskRecord) """
name = models.CharField(max_length=128, blank=True, verbose_name=_('Name')) Ansible 的Task
is_gather_facts = models.BooleanField(default=False, verbose_name=_('Is Gather Ansible Facts')) """
assets = models.ManyToManyField(Asset, related_name='tasks') name = models.CharField(max_length=128, verbose_name=_('Task name'))
module_name = models.CharField(max_length=128, verbose_name=_('Task module'))
module_args = models.CharField(max_length=512, blank=True, verbose_name=_("Module args"))
def __unicode__(self): def __unicode__(self):
return "%s" % self.name return "%s" % self.name
@property
def ansible_assets(self):
return []
def run(self):
from ops.utils.ansible_api import ADHocRunner, Options
conf = Options()
gather_facts = "yes" if self.is_gather_facts else "no"
play_source = {
"name": "Ansible Play",
"hosts": "default",
"gather_facts": gather_facts,
"tasks": [
dict(action=dict(module='ping')),
]
}
hoc = ADHocRunner(conf, play_source, *self.ansible_assets)
uuid = "tasker-" + uuid4().hex
ext_code, result = hoc.run("test_task", uuid)
print(ext_code)
print(result)
class SubTask(models.Model):
task = models.ForeignKey(Task, related_name='sub_tasks', verbose_name=_('Ansible Task'))
module_name = models.CharField(max_length=128, verbose_name=_('Ansible Module Name'))
module_args = models.CharField(max_length=512, blank=True, verbose_name=_("Ansible Module Args"))
register = models.CharField(max_length=128, blank=True, verbose_name=_('Ansible Task Register'))
def __unicode__(self): class Play(models.Model):
return "%s %s" % (self.module_name, self.module_args) """
Playbook 模板, 定义好Template后生成 Playbook
"""
This diff is collapsed.
...@@ -12,7 +12,10 @@ class AdHocResultCallback(CallbackBase): ...@@ -12,7 +12,10 @@ class AdHocResultCallback(CallbackBase):
super(AdHocResultCallback, self).__init__(display) super(AdHocResultCallback, self).__init__(display)
def gather_result(self, n, res): def gather_result(self, n, res):
self.result_q[n].update({res._host.name: res._result}) if res._host.name in self.result_q[n]:
self.result_q[n][res._host.name].append(res._result)
else:
self.result_q[n][res._host.name] = [res._result]
def v2_runner_on_ok(self, result): def v2_runner_on_ok(self, result):
self.gather_result("contacted", result) self.gather_result("contacted", result)
......
# ~*~ coding: utf-8 ~*~ # ~*~ coding: utf-8 ~*~
# ~*~ coding: utf-8 ~*~
# from __future__ import unicode_literals, print_function
import os import os
from collections import namedtuple import sys
from collections import namedtuple, defaultdict
from ansible.executor.task_queue_manager import TaskQueueManager from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.vars import VariableManager from ansible.vars import VariableManager
from ansible.parsing.dataloader import DataLoader from ansible.parsing.dataloader import DataLoader
from ansible.executor.playbook_executor import PlaybookExecutor from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.playbook.play import Play from ansible.playbook.play import Play
from ansible.plugins.callback import CallbackBase
import ansible.constants as C import ansible.constants as C
from ansible.utils.vars import load_extra_vars from ansible.utils.vars import load_extra_vars
from ansible.utils.vars import load_options_vars from ansible.utils.vars import load_options_vars
...@@ -128,7 +125,7 @@ class PlayBookRunner(object): ...@@ -128,7 +125,7 @@ class PlayBookRunner(object):
return self.callbackmodule.output return self.callbackmodule.output
class ADHocRunner(object): class AdHocRunner(object):
""" """
ADHoc接口 ADHoc接口
""" """
...@@ -141,12 +138,8 @@ class ADHocRunner(object): ...@@ -141,12 +138,8 @@ class ADHocRunner(object):
def __init__(self, def __init__(self,
hosts=C.DEFAULT_HOST_LIST, hosts=C.DEFAULT_HOST_LIST,
task_name='Ansible Ad-hoc',
module_name=C.DEFAULT_MODULE_NAME, # * command
module_args=C.DEFAULT_MODULE_ARGS, # * 'cmd args'
forks=C.DEFAULT_FORKS, # 5 forks=C.DEFAULT_FORKS, # 5
timeout=C.DEFAULT_TIMEOUT, # SSH timeout = 10s timeout=C.DEFAULT_TIMEOUT, # SSH timeout = 10s
pattern="all", # all
remote_user=C.DEFAULT_REMOTE_USER, # root remote_user=C.DEFAULT_REMOTE_USER, # root
module_path=None, # dirs of custome modules module_path=None, # dirs of custome modules
connection_type="smart", connection_type="smart",
...@@ -159,12 +152,9 @@ class ADHocRunner(object): ...@@ -159,12 +152,9 @@ class ADHocRunner(object):
private_key_file=None, private_key_file=None,
gather_facts='no'): gather_facts='no'):
self.pattern = pattern self.pattern = ''
self.variable_manager = VariableManager() self.variable_manager = VariableManager()
self.loader = DataLoader() self.loader = DataLoader()
self.module_name = module_name
self.module_args = module_args
self.check_module_args()
self.gather_facts = gather_facts self.gather_facts = gather_facts
self.results_callback = AdHocResultCallback() self.results_callback = AdHocResultCallback()
self.options = self.Options( self.options = self.Options(
...@@ -186,18 +176,41 @@ class ADHocRunner(object): ...@@ -186,18 +176,41 @@ class ADHocRunner(object):
self.passwords = passwords or {} self.passwords = passwords or {}
self.inventory = JMSInventory(hosts) self.inventory = JMSInventory(hosts)
self.variable_manager.set_inventory(self.inventory) self.variable_manager.set_inventory(self.inventory)
self.tasks = []
self.play_source = None
self.play = None
self.runner = None
@staticmethod
def check_module_args(module_name, module_args=''):
if module_name in C.MODULE_REQUIRE_ARGS and not module_args:
err = "No argument passed to '%s' module." % module_name
print(err)
return False
return True
def run(self, task_tuple, pattern='all', task_name='Ansible Ad-hoc'):
"""
:param task_tuple: (('shell', 'ls'), ('ping', ''))
:param pattern:
:param task_name:
:return:
"""
for module, args in task_tuple:
if not self.check_module_args(module, args):
return
self.tasks.append(
dict(action=dict(
module=module,
args=args,
))
)
self.play_source = dict( self.play_source = dict(
name=task_name, name=task_name,
hosts=self.pattern, hosts=pattern,
gather_facts=self.gather_facts, gather_facts=self.gather_facts,
tasks=[ tasks=self.tasks
dict(action=dict(
module=self.module_name,
args=self.module_args,
)
)
]
) )
self.play = Play().load( self.play = Play().load(
...@@ -215,12 +228,6 @@ class ADHocRunner(object): ...@@ -215,12 +228,6 @@ class ADHocRunner(object):
stdout_callback=self.results_callback, stdout_callback=self.results_callback,
) )
def check_module_args(self):
if self.module_name in C.MODULE_REQUIRE_ARGS and not self.module_args:
err = "No argument passed to '%s' module." % self.module_name
raise AnsibleError(err)
def run(self):
if not self.inventory.list_hosts("all"): if not self.inventory.list_hosts("all"):
raise AnsibleError("Inventory is empty.") raise AnsibleError("Inventory is empty.")
...@@ -242,9 +249,13 @@ class ADHocRunner(object): ...@@ -242,9 +249,13 @@ class ADHocRunner(object):
self.loader.cleanup_all_tmp_files() self.loader.cleanup_all_tmp_files()
def clean_result(self): def clean_result(self):
failed = self.results_callback.result_q['dark'].keys() result = defaultdict(dict)
success = self.results_callback.result_q['contacted'].keys() for host, msgs in self.results_callback.result_q['contacted'].items():
return {'failed': failed, 'success': success} result[host]['success'] = len(msgs)
for host, msgs in self.results_callback.result_q['dark'].items():
result[host]['failed'] = len(msgs)
return result
def test_run(): def test_run():
...@@ -257,8 +268,9 @@ def test_run(): ...@@ -257,8 +268,9 @@ def test_run():
"password": "redhat", "password": "redhat",
}, },
] ]
hoc = ADHocRunner(module_name='shell', module_args='ls', hosts=assets) task_tuple = (('shell', 'ls'), ('ping', ''))
ret = hoc.run() hoc = AdHocRunner(hosts=assets)
ret = hoc.run(task_tuple)
print(ret) print(ret)
play = PlayBookRunner(assets, playbook_path='/tmp/some.yml') play = PlayBookRunner(assets, playbook_path='/tmp/some.yml')
......
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