perf: 优化部署 host

This commit is contained in:
ibuler
2022-11-01 11:52:51 +08:00
parent 8df15cb564
commit cf81f08b7a
24 changed files with 186 additions and 108 deletions

View File

@@ -2,6 +2,14 @@ from collections import defaultdict
class DefaultCallback:
STATUS_MAPPER = {
'successful': 'success',
'failure': 'failed',
'running': 'running',
'pending': 'pending',
'unknown': 'unknown'
}
def __init__(self):
self.result = dict(
ok=defaultdict(dict),
@@ -27,7 +35,7 @@ class DefaultCallback:
return results
def is_success(self):
return self.status != 'successful'
return self.status != 'success'
def event_handler(self, data, **kwargs):
event = data.get('event', None)
@@ -131,4 +139,5 @@ class DefaultCallback:
pass
def status_handler(self, data, **kwargs):
self.status = data.get('status', 'unknown')
status = data.get('status', '')
self.status = self.STATUS_MAPPER.get(status, 'unknown')

View File

@@ -9,13 +9,12 @@ __all__ = ['JMSInventory']
class JMSInventory:
def __init__(self, assets, account_policy='smart',
account_prefer='root,administrator',
host_callback=None):
def __init__(self, assets, account_policy='privileged_first',
account_prefer='root,Administrator', host_callback=None):
"""
:param assets:
:param account_prefer: account username name if not set use account_policy
:param account_policy: smart, privileged_must, privileged_first
:param account_policy: privileged_only, privileged_first, skip
"""
self.assets = self.clean_assets(assets)
self.account_prefer = account_prefer
@@ -105,7 +104,7 @@ class JMSInventory:
'id': str(asset.id), 'name': asset.name, 'address': asset.address,
'type': asset.type, 'category': asset.category,
'protocol': asset.protocol, 'port': asset.port,
'category_property': asset.category_property,
'specific': asset.specific,
'protocols': [{'name': p.name, 'port': p.port} for p in protocols],
},
'jms_account': {
@@ -137,24 +136,27 @@ class JMSInventory:
def select_account(self, asset):
accounts = list(asset.accounts.all())
account_selected = None
account_username = self.account_prefer
account_usernames = self.account_prefer
if isinstance(self.account_prefer, str):
account_username = self.account_prefer.split(',')
account_usernames = self.account_prefer.split(',')
if account_username:
for username in account_username:
account_matched = list(filter(lambda account: account.username == username, accounts))
if account_matched:
account_selected = account_matched[0]
break
# 优先使用提供的名称
if account_usernames:
account_matched = list(filter(lambda account: account.username in account_usernames, accounts))
account_selected = account_matched[0] if account_matched else None
if not account_selected:
if self.account_policy in ['privileged_must', 'privileged_first']:
account_matched = list(filter(lambda account: account.privileged, accounts))
account_selected = account_matched[0] if account_matched else None
if account_selected or self.account_policy == 'skip':
return account_selected
if not account_selected and self.account_policy == 'privileged_first':
if self.account_policy in ['privileged_only', 'privileged_first']:
account_matched = list(filter(lambda account: account.privileged, accounts))
account_selected = account_matched[0] if account_matched else None
if account_selected:
return account_selected
if self.account_policy == 'privileged_first':
account_selected = accounts[0] if accounts else None
return account_selected

View File

@@ -5,7 +5,7 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _
from common.utils import get_logger
from .base import BaseAnsibleTask, BaseAnsibleExecution
from .base import BaseAnsibleJob, BaseAnsibleExecution
from ..ansible import AdHocRunner
__all__ = ["AdHoc", "AdHocExecution"]
@@ -14,7 +14,7 @@ __all__ = ["AdHoc", "AdHocExecution"]
logger = get_logger(__file__)
class AdHoc(BaseAnsibleTask):
class AdHoc(BaseAnsibleJob):
pattern = models.CharField(max_length=1024, verbose_name=_("Pattern"), default='all')
module = models.CharField(max_length=128, default='shell', verbose_name=_('Module'))
args = models.CharField(max_length=1024, default='', verbose_name=_('Args'))

View File

@@ -12,7 +12,7 @@ from ..ansible.inventory import JMSInventory
from ..mixin import PeriodTaskModelMixin
class BaseAnsibleTask(PeriodTaskModelMixin, JMSOrgBaseModel):
class BaseAnsibleJob(PeriodTaskModelMixin, JMSOrgBaseModel):
owner = models.ForeignKey('users.User', verbose_name=_("Creator"), on_delete=models.SET_NULL, null=True)
assets = models.ManyToManyField('assets.Asset', verbose_name=_("Assets"))
account = models.CharField(max_length=128, default='root', verbose_name=_('Account'))
@@ -46,7 +46,7 @@ class BaseAnsibleTask(PeriodTaskModelMixin, JMSOrgBaseModel):
class BaseAnsibleExecution(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4)
status = models.CharField(max_length=16, verbose_name=_('Status'), default='running')
task = models.ForeignKey(BaseAnsibleTask, on_delete=models.CASCADE, related_name='executions', null=True)
task = models.ForeignKey(BaseAnsibleJob, on_delete=models.CASCADE, related_name='executions', null=True)
result = models.JSONField(blank=True, null=True, verbose_name=_('Result'))
summary = models.JSONField(default=dict, verbose_name=_('Summary'))
creator = models.ForeignKey('users.User', verbose_name=_("Creator"), on_delete=models.SET_NULL, null=True)
@@ -86,7 +86,7 @@ class BaseAnsibleExecution(models.Model):
def set_result(self, cb):
status_mapper = {
'successful': 'succeeded',
'successful': 'success',
}
this = self.__class__.objects.get(id=self.id)
this.status = status_mapper.get(cb.status, cb.status)
@@ -112,11 +112,11 @@ class BaseAnsibleExecution(models.Model):
@property
def is_finished(self):
return self.status in ['succeeded', 'failed']
return self.status in ['success', 'failed']
@property
def is_success(self):
return self.status == 'succeeded'
return self.status == 'success'
@property
def time_cost(self):

View File

@@ -23,6 +23,7 @@ class CeleryTask(models.Model):
"comment": getattr(task, 'comment', None),
"queue": getattr(task, 'queue', 'default')
}
@property
def state(self):
last_five_executions = CeleryTaskExecution.objects.filter(name=self.name).order_by('-date_published')[:5]

View File

@@ -2,7 +2,7 @@ from django.db import models
from django.utils.translation import gettext_lazy as _
from orgs.mixins.models import JMSOrgBaseModel
from .base import BaseAnsibleExecution, BaseAnsibleTask
from .base import BaseAnsibleExecution, BaseAnsibleJob
class PlaybookTemplate(JMSOrgBaseModel):
@@ -19,7 +19,7 @@ class PlaybookTemplate(JMSOrgBaseModel):
unique_together = [('org_id', 'name')]
class Playbook(BaseAnsibleTask):
class Playbook(BaseAnsibleJob):
path = models.FilePathField(max_length=1024, verbose_name=_("Playbook"))
owner = models.ForeignKey('users.User', verbose_name=_("Owner"), on_delete=models.SET_NULL, null=True)
comment = models.TextField(blank=True, verbose_name=_("Comment"))