使用python将NSG附加到子网

使用python将NSG附加到子网,python,azure,subnet,Python,Azure,Subnet,我正在尝试创建NSG,然后将其连接到现有子网。 我已经成功地创建了NSG,但它在将其连接到子网时抛出了一个错误。声明地址前缀不能为空。我们也必须传递地址前缀吗?在下面的函数中 params_create = azure.mgmt.network.models.Subnet( 下面是完整的代码片段 from azure.common.credentials import ServicePrincipalCredentials from azure.mgmt.resource import Res

我正在尝试创建NSG,然后将其连接到现有子网。 我已经成功地创建了NSG,但它在将其连接到子网时抛出了一个错误。声明地址前缀不能为空。我们也必须传递地址前缀吗?在下面的函数中

params_create = azure.mgmt.network.models.Subnet(
下面是完整的代码片段

from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.compute import ComputeManagementClient
from azure.mgmt.network import NetworkManagementClient
from azure.mgmt.compute.models import DiskCreateOption
from azure.mgmt.network.v2017_03_01.models import NetworkSecurityGroup
from azure.mgmt.network.v2017_03_01.models import SecurityRule
import azure.mgmt.network.models

SUBSCRIPTION_ID = 'xxx'
GROUP_NAME = 'xxxx'
LOCATION = 'xxxx'
VM_NAME = 'myVM'
VNET = 'existingvnet'
SUBNET = 'default'

def get_credentials():
    credentials = ServicePrincipalCredentials(
        client_id = 'xxx',
        secret = 'xxxx',
        tenant = 'xxxx'
    )

    return credentials

def create_network_security_group(network_client):
    params_create = azure.mgmt.network.models.NetworkSecurityGroup(
            location=LOCATION,
            security_rules=[
                azure.mgmt.network.models.SecurityRule(
                    name='rdprule',
                    access=azure.mgmt.network.models.SecurityRuleAccess.allow,
                    description='test security rule',
                    destination_address_prefix='*',
                    destination_port_range='3389',
                    direction=azure.mgmt.network.models.SecurityRuleDirection.inbound,
                    priority=500,
                    protocol=azure.mgmt.network.models.SecurityRuleProtocol.tcp,
                    source_address_prefix='*',
                    source_port_range='*',
                ),
            ],
        )

    result_create_NSG = network_client.network_security_groups.create_or_update(
            GROUP_NAME,
            'nsg-vm',
            params_create,
        )

    return result_create_NSG.result()

def attach_network_security_group(network_client,creation_result_nsg):
    params_create = azure.mgmt.network.models.Subnet(
            network_security_group= creation_result_nsg,
        )

    result_create = network_client.subnets.create_or_update(
            GROUP_NAME,
            VNET,
            SUBNET,
            params_create,
        )

    return result_create.result()


if __name__ == "__main__":
    credentials = get_credentials()

resource_group_client = ResourceManagementClient(
    credentials, 
    SUBSCRIPTION_ID
)
network_client = NetworkManagementClient(
    credentials, 
    SUBSCRIPTION_ID
)
compute_client = ComputeManagementClient(
    credentials, 
    SUBSCRIPTION_ID
)


creation_result_nsg = create_network_security_group(network_client)
print("------------------------------------------------------")
print(creation_result_nsg)
input('Press enter to continue...')

creation_result = attach_network_security_group(network_client,creation_result_nsg)
print("------------------------------------------------------")
print(creation_result)
input('Press enter to continue...')

这意味着您没有传递它应该使用的地址前缀。根据需要传入
地址\前缀
参数。因此,将其添加到您的params_create中,如下所示:

params_create = Subnet(
    address_prefix = "10.0.0.0/24",
    network_security_group = azure.mgmt.network.models.NetworkSecurityGroup(xxx)
)

我检查了一下,无法找出哪个参数是必需的。如何确定强制参数?谢谢你一如既往的帮助。好吧,没有办法知道,我不认为它被记录在什么地方。但由于它明确要求地址前缀,因此它是强制性的。此外,如果您看一下,它还提供了一个仅定义了地址前缀的示例。所以它应该是强制性的。唯一一个是强制性的。对于其他资源,逻辑是相同的。它来自experience\api reference\ExampleSure Gleb,我只参考了python文档。我还应该检查RESTAPI文档以获得更多信息。再次感谢