mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-13 05:49:07 +00:00
perf: 优化部署 host
This commit is contained in:
@@ -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')
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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'))
|
||||
|
@@ -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):
|
||||
|
@@ -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]
|
||||
|
@@ -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"))
|
||||
|
Reference in New Issue
Block a user