From 47d87e38a6995608807217d2572b888d9c6eba49 Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Mon, 19 Dec 2016 23:46:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85task=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E7=9A=84=E4=B8=80=E4=BA=9B=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/api/serializers.py | 6 ++++ apps/ops/api/views.py | 6 ++++ apps/ops/models/__init__.py | 1 + apps/ops/models/ansible.py | 19 +----------- apps/ops/models/sudo.py | 3 +- apps/ops/models/task.py | 58 +++++++++++++++++++++++++++++++++++ apps/ops/urls/api_urls.py | 1 + apps/ops/utils/ansible_api.py | 7 +++-- 8 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 apps/ops/models/task.py diff --git a/apps/ops/api/serializers.py b/apps/ops/api/serializers.py index 3981552e2..24abe7e2a 100644 --- a/apps/ops/api/serializers.py +++ b/apps/ops/api/serializers.py @@ -53,7 +53,13 @@ class CronTableSerializer(serializers.ModelSerializer): model = CronTable class TaskSerializer(serializers.ModelSerializer): + sub_tasks = serializers.PrimaryKeyRelatedField(many=True, read_only=True) class Meta: model = Task read_only_fields = ('record',) + +class SubTaskSerializer(serializers.ModelSerializer): + + class Meta: + model = SubTask diff --git a/apps/ops/api/views.py b/apps/ops/api/views.py index 4bde44b9f..eaacb2b76 100644 --- a/apps/ops/api/views.py +++ b/apps/ops/api/views.py @@ -14,6 +14,7 @@ __all__ = ["HostAliaViewSet", "SudoViewSet", "CronTableViewSet", "TaskViewSet", + "SubTaskViewSet", ] @@ -69,5 +70,10 @@ class TaskViewSet(viewsets.ModelViewSet): serializer_class = TaskSerializer permission_classes = (AdminUserRequired,) +class SubTaskViewSet(viewsets.ModelViewSet): + queryset = SubTask.objects.all() + serializer_class = SubTaskSerializer + permission_classes = (AdminUserRequired,) + diff --git a/apps/ops/models/__init__.py b/apps/ops/models/__init__.py index ef0a6b8af..b7bfa1e0d 100644 --- a/apps/ops/models/__init__.py +++ b/apps/ops/models/__init__.py @@ -2,4 +2,5 @@ from ansible import * from cron import * from sudo import * from utils import * +from task import * diff --git a/apps/ops/models/ansible.py b/apps/ops/models/ansible.py index cebc5251a..3cf059644 100644 --- a/apps/ops/models/ansible.py +++ b/apps/ops/models/ansible.py @@ -4,12 +4,10 @@ from __future__ import unicode_literals, absolute_import import logging import json -from assets.models import Asset - from django.db import models from django.utils.translation import ugettext_lazy as _ -__all__ = ["Task", "TaskRecord", "AnsiblePlay", "AnsibleTask", "AnsibleHostResult"] +__all__ = ["TaskRecord", "AnsiblePlay", "AnsibleTask", "AnsibleHostResult"] logger = logging.getLogger(__name__) @@ -291,18 +289,3 @@ class AnsibleHostResult(models.Model): except Exception as e: print('Error: %s, continue...' % e.message) continue - -class Task(models.Model): - record = models.OneToOneField(TaskRecord) - name = models.CharField(max_length=128, blank=True, verbose_name=_('Name')) - 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')) - is_gather_facts = models.BooleanField(default=False,verbose_name=_('Is Gather Ansible Facts')) - asset = models.ManyToManyField(Asset, related_name='tasks') - - def __unicode__(self): - return "%s %s" % (self.module_name, self.module_args) - - def run(self): - pass diff --git a/apps/ops/models/sudo.py b/apps/ops/models/sudo.py index 0c1a582c8..13713064c 100644 --- a/apps/ops/models/sudo.py +++ b/apps/ops/models/sudo.py @@ -11,8 +11,7 @@ from django.utils.translation import ugettext_lazy as _ logger = logging.getLogger(__name__) -__all__ = ["HostAlia", "UserAlia", "CmdAlia", "RunasAlia", "Privilege", - "Extra_conf", "Sudo"] +__all__ = ["HostAlia", "UserAlia", "CmdAlia", "RunasAlia", "Privilege", "Extra_conf", "Sudo"] class HostAlia(models.Model): diff --git a/apps/ops/models/task.py b/apps/ops/models/task.py new file mode 100644 index 000000000..fc35e0665 --- /dev/null +++ b/apps/ops/models/task.py @@ -0,0 +1,58 @@ +# ~*~ coding: utf-8 ~*~ +from __future__ import unicode_literals, absolute_import + +import logging + +from uuid import uuid4 +from assets.models import Asset +from ops.models import TaskRecord +from ops.utils.ansible_api import ADHocRunner, Config + +from django.db import models +from django.utils.translation import ugettext_lazy as _ + +__all__ = ["Task", "SubTask"] + + +logger = logging.getLogger(__name__) + + +class Task(models.Model): + record = models.OneToOneField(TaskRecord) + name = models.CharField(max_length=128, blank=True, verbose_name=_('Name')) + is_gather_facts = models.BooleanField(default=False,verbose_name=_('Is Gather Ansible Facts')) + assets = models.ManyToManyField(Asset, related_name='tasks') + + def __unicode__(self): + return "%s" % self.name + + @property + def ansible_assets(self): + return [] + + def run(self): + conf = Config() + 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): + return "%s %s" % (self.module_name, self.module_args) \ No newline at end of file diff --git a/apps/ops/urls/api_urls.py b/apps/ops/urls/api_urls.py index 144d6a53e..77141ed35 100644 --- a/apps/ops/urls/api_urls.py +++ b/apps/ops/urls/api_urls.py @@ -16,5 +16,6 @@ api_router.register(r'v1/privilege', v1_api.PrivilegeViewSet) api_router.register(r'v1/sudo', v1_api.SudoViewSet) api_router.register(r'v1/cron', v1_api.CronTableViewSet) api_router.register(r'v1/task', v1_api.TaskViewSet) +api_router.register(r'v1/subtask', v1_api.SubTaskViewSet) urlpatterns = api_router.urls \ No newline at end of file diff --git a/apps/ops/utils/ansible_api.py b/apps/ops/utils/ansible_api.py index 25ddc91bd..3f3345c5f 100644 --- a/apps/ops/utils/ansible_api.py +++ b/apps/ops/utils/ansible_api.py @@ -20,6 +20,8 @@ from ansible.plugins.callback import CallbackBase from ops.models import TaskRecord, AnsiblePlay, AnsibleTask, AnsibleHostResult +__all__ = ["ADHocRunner", "Config"] + logger = logging.getLogger(__name__) @@ -392,7 +394,7 @@ class PlayBookRunner(InventoryMixin): class ADHocRunner(InventoryMixin): """ADHoc接口 """ - def __init__(self, config, play_data, *hosts, **group_vars): + def __init__(self, play_data, config=None, *hosts, **group_vars): """ :param hosts: 见PlaybookRunner参数 :param group_vars: 见PlaybookRunner参数 @@ -406,8 +408,7 @@ class ADHocRunner(InventoryMixin): tasks=[dict(action=dict(module='service', args={'name': 'vsftpd', 'state': 'restarted'}), async=async, poll=poll)] ) """ - - self.options = config + self.options = config if config != None else Config() # 设置verbosity级别, 及命令行的--verbose选项 self.display = Display()