fix: Use only_sudo failed

pull/13968/head
feng 2024-08-14 14:53:07 +08:00 committed by Bryan
parent c56e1bdbbe
commit 0a39ba0a75
5 changed files with 29 additions and 14 deletions

View File

@ -119,7 +119,8 @@ class Account(AbsConnectivity, LabeledMixin, BaseAccount):
return auth return auth
auth.update(self.make_account_ansible_vars(su_from)) auth.update(self.make_account_ansible_vars(su_from))
become_method = platform.su_method if platform.su_method else 'sudo'
become_method = platform.ansible_become_method
password = su_from.secret if become_method == 'sudo' else self.secret password = su_from.secret if become_method == 'sudo' else self.secret
auth['ansible_become'] = True auth['ansible_become'] = True
auth['ansible_become_method'] = become_method auth['ansible_become_method'] = become_method

View File

@ -2,5 +2,6 @@ from .automation import *
from .base import * from .base import *
from .category import * from .category import *
from .host import * from .host import *
from .platform import *
from .protocol import * from .protocol import *
from .types import * from .types import *

View File

@ -0,0 +1,11 @@
from django.db.models import TextChoices
class SuMethodChoices(TextChoices):
sudo = "sudo", "sudo su -"
su = "su", "su - "
only_sudo = "only_sudo", "sudo su"
only_su = "only_su", "su"
enable = "enable", "enable"
super = "super", "super 15"
super_level = "super_level", "super level 15"

View File

@ -1,7 +1,7 @@
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from assets.const import AllTypes, Category, Protocol from assets.const import AllTypes, Category, Protocol, SuMethodChoices
from common.db.fields import JsonDictTextField from common.db.fields import JsonDictTextField
from common.db.models import JMSBaseModel from common.db.models import JMSBaseModel
@ -131,6 +131,17 @@ class Platform(LabeledMixin, JMSBaseModel):
return True return True
return False return False
@property
def ansible_become_method(self):
su_method = self.su_method or SuMethodChoices.sudo
if su_method in [SuMethodChoices.sudo, SuMethodChoices.only_sudo]:
method = SuMethodChoices.sudo
elif su_method in [SuMethodChoices.su, SuMethodChoices.only_su]:
method = SuMethodChoices.su
else:
method = su_method
return method
def __str__(self): def __str__(self):
return self.name return self.name

View File

@ -10,7 +10,7 @@ from common.serializers import (
) )
from common.serializers.fields import LabeledChoiceField, ObjectRelatedField from common.serializers.fields import LabeledChoiceField, ObjectRelatedField
from common.utils import lazyproperty from common.utils import lazyproperty
from ..const import Category, AllTypes, Protocol from ..const import Category, AllTypes, Protocol, SuMethodChoices
from ..models import Platform, PlatformProtocol, PlatformAutomation from ..models import Platform, PlatformProtocol, PlatformAutomation
__all__ = ["PlatformSerializer", "PlatformOpsMethodSerializer", "PlatformProtocolSerializer", "PlatformListSerializer"] __all__ = ["PlatformSerializer", "PlatformOpsMethodSerializer", "PlatformProtocolSerializer", "PlatformListSerializer"]
@ -159,15 +159,6 @@ class PlatformCustomField(serializers.Serializer):
class PlatformSerializer(ResourceLabelsMixin, WritableNestedModelSerializer): class PlatformSerializer(ResourceLabelsMixin, WritableNestedModelSerializer):
SU_METHOD_CHOICES = [
("sudo", "sudo su -"),
("su", "su - "),
("only_sudo", "sudo su"),
("only_su", "su"),
("enable", "enable"),
("super", "super 15"),
("super_level", "super level 15")
]
id = serializers.IntegerField( id = serializers.IntegerField(
label='ID', required=False, label='ID', required=False,
validators=[UniqueValidator(queryset=Platform.objects.all())] validators=[UniqueValidator(queryset=Platform.objects.all())]
@ -178,8 +169,8 @@ class PlatformSerializer(ResourceLabelsMixin, WritableNestedModelSerializer):
protocols = PlatformProtocolSerializer(label=_("Protocols"), many=True, required=False) protocols = PlatformProtocolSerializer(label=_("Protocols"), many=True, required=False)
automation = PlatformAutomationSerializer(label=_("Automation"), required=False, default=dict) automation = PlatformAutomationSerializer(label=_("Automation"), required=False, default=dict)
su_method = LabeledChoiceField( su_method = LabeledChoiceField(
choices=SU_METHOD_CHOICES, label=_("Su method"), choices=SuMethodChoices.choices, label=_("Su method"),
required=False, default="sudo", allow_null=True required=False, default=SuMethodChoices.sudo, allow_null=True
) )
custom_fields = PlatformCustomField(label=_("Custom fields"), many=True, required=False) custom_fields = PlatformCustomField(label=_("Custom fields"), many=True, required=False)
assets = ObjectRelatedField(queryset=Asset.objects, many=True, required=False, label=_('Assets')) assets = ObjectRelatedField(queryset=Asset.objects, many=True, required=False, label=_('Assets'))