mirror of https://github.com/jumpserver/jumpserver
feat: 运行job 支持动态参数
parent
49a4ceba85
commit
24ed11e2a5
|
@ -4,7 +4,7 @@
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from ..models import AdHoc
|
from ..models import AdHoc
|
||||||
from ..serializers import (
|
from ..serializers import (
|
||||||
AdHocSerializer, AdhocListSerializer,
|
AdHocSerializer
|
||||||
)
|
)
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
@ -14,9 +14,4 @@ __all__ = [
|
||||||
|
|
||||||
class AdHocViewSet(viewsets.ModelViewSet):
|
class AdHocViewSet(viewsets.ModelViewSet):
|
||||||
queryset = AdHoc.objects.all()
|
queryset = AdHoc.objects.all()
|
||||||
|
serializer_class = AdHocSerializer
|
||||||
def get_serializer_class(self):
|
|
||||||
if self.action != 'list':
|
|
||||||
return AdhocListSerializer
|
|
||||||
return AdHocSerializer
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
# Generated by Django 3.2.14 on 2022-11-17 10:48
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ops', '0031_auto_20221116_2024'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='job',
|
||||||
|
name='variables',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='job',
|
||||||
|
name='parameters_define',
|
||||||
|
field=models.JSONField(default=dict, verbose_name='Parameters define'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='jobexecution',
|
||||||
|
name='parameters',
|
||||||
|
field=models.JSONField(default=dict, verbose_name='Parameters'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -45,7 +45,7 @@ class Job(BaseCreateUpdateModel):
|
||||||
runas = models.CharField(max_length=128, default='root', verbose_name=_('Runas'))
|
runas = models.CharField(max_length=128, default='root', verbose_name=_('Runas'))
|
||||||
runas_policy = models.CharField(max_length=128, choices=RunasPolicies.choices, default=RunasPolicies.skip,
|
runas_policy = models.CharField(max_length=128, choices=RunasPolicies.choices, default=RunasPolicies.skip,
|
||||||
verbose_name=_('Runas policy'))
|
verbose_name=_('Runas policy'))
|
||||||
variables = models.JSONField(default=dict, verbose_name=_('Variables'))
|
parameters_define = models.JSONField(default=dict, verbose_name=_('Parameters define'))
|
||||||
comment = models.CharField(max_length=1024, default='', verbose_name=_('Comment'), null=True, blank=True)
|
comment = models.CharField(max_length=1024, default='', verbose_name=_('Comment'), null=True, blank=True)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -55,15 +55,13 @@ class Job(BaseCreateUpdateModel):
|
||||||
def create_execution(self):
|
def create_execution(self):
|
||||||
return self.executions.create()
|
return self.executions.create()
|
||||||
|
|
||||||
def get_variables(self):
|
|
||||||
return json.loads(self.variables)
|
|
||||||
|
|
||||||
|
|
||||||
class JobExecution(BaseCreateUpdateModel):
|
class JobExecution(BaseCreateUpdateModel):
|
||||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||||
task_id = models.UUIDField(null=True)
|
task_id = models.UUIDField(null=True)
|
||||||
status = models.CharField(max_length=16, verbose_name=_('Status'), default='running')
|
status = models.CharField(max_length=16, verbose_name=_('Status'), default='running')
|
||||||
job = models.ForeignKey(Job, on_delete=models.CASCADE, related_name='executions', null=True)
|
job = models.ForeignKey(Job, on_delete=models.CASCADE, related_name='executions', null=True)
|
||||||
|
parameters = models.JSONField(default=dict, verbose_name=_('Parameters'))
|
||||||
result = models.JSONField(blank=True, null=True, verbose_name=_('Result'))
|
result = models.JSONField(blank=True, null=True, verbose_name=_('Result'))
|
||||||
summary = models.JSONField(default=dict, verbose_name=_('Summary'))
|
summary = models.JSONField(default=dict, verbose_name=_('Summary'))
|
||||||
creator = models.ForeignKey('users.User', verbose_name=_("Creator"), on_delete=models.SET_NULL, null=True)
|
creator = models.ForeignKey('users.User', verbose_name=_("Creator"), on_delete=models.SET_NULL, null=True)
|
||||||
|
@ -74,11 +72,12 @@ class JobExecution(BaseCreateUpdateModel):
|
||||||
def get_runner(self):
|
def get_runner(self):
|
||||||
inv = self.job.inventory
|
inv = self.job.inventory
|
||||||
inv.write_to_file(self.inventory_path)
|
inv.write_to_file(self.inventory_path)
|
||||||
|
extra_vars = json.loads(self.parameters)
|
||||||
|
|
||||||
if self.job.type == 'adhoc':
|
if self.job.type == 'adhoc':
|
||||||
runner = AdHocRunner(
|
runner = AdHocRunner(
|
||||||
self.inventory_path, self.job.module, module_args=self.job.args,
|
self.inventory_path, self.job.module, module_args=self.job.args,
|
||||||
pattern="all", project_dir=self.private_dir, extra_vars=self.job.get_variables()
|
pattern="all", project_dir=self.private_dir, extra_vars=extra_vars,
|
||||||
)
|
)
|
||||||
elif self.job.type == 'playbook':
|
elif self.job.type == 'playbook':
|
||||||
runner = PlaybookRunner(
|
runner = PlaybookRunner(
|
||||||
|
|
|
@ -14,15 +14,6 @@ class AdHocSerializer(serializers.ModelSerializer):
|
||||||
row_count = serializers.IntegerField(read_only=True)
|
row_count = serializers.IntegerField(read_only=True)
|
||||||
size = serializers.IntegerField(read_only=True)
|
size = serializers.IntegerField(read_only=True)
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = AdHoc
|
|
||||||
fields = ["id", "name", "module", "owner", "row_count", "size", "date_created", "date_updated"]
|
|
||||||
|
|
||||||
|
|
||||||
class AdhocListSerializer(AdHocSerializer):
|
|
||||||
row_count = serializers.IntegerField(read_only=True)
|
|
||||||
size = serializers.IntegerField(read_only=True)
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = AdHoc
|
model = AdHoc
|
||||||
fields = ["id", "name", "module", "row_count", "size", "args", "owner", "date_created", "date_updated"]
|
fields = ["id", "name", "module", "row_count", "size", "args", "owner", "date_created", "date_updated"]
|
||||||
|
|
|
@ -14,7 +14,7 @@ class JobSerializer(serializers.ModelSerializer):
|
||||||
model = Job
|
model = Job
|
||||||
fields = [
|
fields = [
|
||||||
"id", "name", "instant", "type", "module", "args", "playbook", "assets", "runas_policy", "runas", "owner",
|
"id", "name", "instant", "type", "module", "args", "playbook", "assets", "runas_policy", "runas", "owner",
|
||||||
"variables",
|
"parameters_define",
|
||||||
"timeout",
|
"timeout",
|
||||||
"chdir",
|
"chdir",
|
||||||
"comment",
|
"comment",
|
||||||
|
@ -29,5 +29,5 @@ class JobExecutionSerializer(serializers.ModelSerializer):
|
||||||
read_only_fields = ["id", "task_id", "timedelta", "time_cost", 'is_finished', 'date_start', 'date_created',
|
read_only_fields = ["id", "task_id", "timedelta", "time_cost", 'is_finished', 'date_start', 'date_created',
|
||||||
'is_success', 'task_id', 'short_id']
|
'is_success', 'task_id', 'short_id']
|
||||||
fields = read_only_fields + [
|
fields = read_only_fields + [
|
||||||
"job"
|
"job", "parameters"
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in New Issue