Dela via


Använda ett befintligt virtuellt nätverk med Azure Managed Applications

Den här artikeln visar hur du definierar ett Azure-hanterat program som integreras med ett befintligt virtuellt nätverk i konsumentens prenumeration. Med det hanterade programmet kan konsumenten bestämma om ett nytt virtuellt nätverk ska skapas eller om ett befintligt nätverk ska användas. Det befintliga virtuella nätverket kan finnas utanför den hanterade resursgruppen.

Huvudmall

Först ska vi titta på filen mainTemplate.json . Hela mallen för att distribuera en virtuell dator och dess associerade resurser visas. Senare granskar du de delar av mallen som är relaterade till att använda ett befintligt virtuellt nätverk.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "metadata": {
        "description": "Deployment location"
      }
    },
    "windowsOSVersion": {
      "type": "string",
      "defaultValue": "2016-Datacenter",
      "allowedValues": [
        "2008-R2-SP1",
        "2012-Datacenter",
        "2012-R2-Datacenter",
        "2016-Nano-Server",
        "2016-Datacenter-with-Containers",
        "2016-Datacenter",
        "2019-Datacenter"
      ],
      "metadata": {
        "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version."
      }
    },
    "vmName": {
      "type": "string",
      "metadata": {
        "title": "VM Name",
        "description": "This is the name of the your VM"
      }
    },
    "adminUsername": {
      "type": "string",
      "defaultValue": "testadmin",
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Password for the Virtual Machine."
      }
    },
    "virtualNetworkName": {
      "type": "string",
      "metadata": {
        "description": "New or Existing VNet Name"
      }
    },
    "virtualNetworkNewOrExisting": {
      "type": "string",
      "metadata": {
        "description": "Boolean indicating whether the VNet is new or existing"
      }
    },
    "virtualNetworkAddressPrefix": {
      "type": "string",
      "metadata": {
        "description": "VNet address prefix"
      }
    },
    "virtualNetworkResourceGroup": {
      "type": "string",
      "metadata": {
        "description": "Resource group of the VNet"
      }
    },
    "virtualMachineSize": {
      "type": "string",
      "metadata": {
        "description": "The size of the VM"
      }
    },
    "subnetName": {
      "type": "string",
      "metadata": {
        "description": "New or Existing subnet Name"
      }
    },
    "subnetAddressPrefix": {
      "type": "string",
      "metadata": {
        "description": "Subnet address prefix"
      }
    },
    "baseUrl": {
      "type": "string",
      "defaultValue": "",
      "metadata": {
        "artifactsBaseUrl": "",
        "description": "URL to acquire other templates"
      }
    }
  },
  "variables": {
    "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'sawinvm')]",
    "publicIPAddressName": "[concat(uniqueString(resourceGroup().id),'IP')]",
    "vmName": "[parameters('vmName')]",
    "nicName": "[concat(parameters('vmName'),'Nic')]",
    "vnetId": {
      "new": "[resourceId('Microsoft.Network/virtualNetworks',parameters('virtualNetworkName'))]",
      "existing": "[resourceId(parameters('virtualNetworkResourceGroup'),'Microsoft.Network/virtualNetworks',parameters('virtualNetworkName'))]"
    },
    "subnetId": "[concat(variables('vnetId')[parameters('virtualNetworkNewOrExisting')],'/subnets/',parameters('subnetName'))]",
    "publicIPAddressType": "Dynamic"
  },
  "resources": [
    {
      "condition": "[equals(parameters('virtualNetworkNewOrExisting'),'new')]",
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2021-02-01",
      "name": "[parameters('virtualNetworkName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[parameters('virtualNetworkAddressPrefix')]"
          ]
        },
        "subnets": [
          {
            "name": "[parameters('subnetName')]",
            "properties": {
              "addressPrefix": "[parameters('subnetAddressPrefix')]"
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[variables('publicIPAddressName')]",
      "apiVersion": "2021-02-01",
      "location": "[parameters('location')]",
      "properties": {
        "publicIPAllocationMethod": "[variables('publicIPAddressType')]"
      }
    },
    {
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[variables('nicName')]",
      "apiVersion": "2021-02-01",
      "location": "[parameters('location')]",
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
              },
              "subnet": {
                "id": "[variables('subnetId')]"
              }
            }
          }
        ],
        "enableIPForwarding": true
      },
      "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]",
        "[resourceId('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]"
      ]
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-04-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {}
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2021-04-01",
      "name": "[variables('vmName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
        "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[parameters('virtualMachineSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "MicrosoftWindowsServer",
            "offer": "WindowsServer",
            "sku": "[parameters('windowsOSVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "createOption": "FromImage"
          },
          "dataDisks": [
            {
              "diskSizeGB": 1023,
              "lun": 0,
              "createOption": "Empty"
            }
          ]
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
            }
          ]
        },
        "diagnosticsProfile": {
          "bootDiagnostics": {
            "enabled": true,
            "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))).primaryEndpoints.blob]"
          }
        }
      }
    }
  ]
}

Observera att det virtuella nätverket är villkorligt distribuerat. Konsumenten skickar in ett parametervärde som anger om du vill skapa ett nytt eller använda ett befintligt virtuellt nätverk. Om konsumenten väljer ett nytt virtuellt nätverk distribueras resursen. Annars hoppas resursen över under distributionen.

{
  "condition": "[equals(parameters('virtualNetworkNewOrExisting'),'new')]",
  "type": "Microsoft.Network/virtualNetworks",
  "apiVersion": "2021-02-01",
  "name": "[parameters('virtualNetworkName')]",
  "location": "[parameters('location')]",
  "properties": {
    "addressSpace": {
      "addressPrefixes": [
        "[parameters('virtualNetworkAddressPrefix')]"
      ]
    },
    "subnets": [
      {
        "name": "[parameters('subnetName')]",
        "properties": {
          "addressPrefix": "[parameters('subnetAddressPrefix')]"
        }
      }
    ]
  }
},

Variabeln för det virtuella nätverks-ID:t har två egenskaper. En egenskap returnerar resurs-ID:t när ett nytt virtuellt nätverk distribueras. Den andra egenskapen returnerar resurs-ID:t när ett befintligt virtuellt nätverk används. Resurs-ID:t för det befintliga virtuella nätverket innehåller namnet på resursgruppen som innehåller det virtuella nätverket.

Undernäts-ID:t konstrueras från värdet för det virtuella nätverks-ID:t. Det använder värdet matchar konsumenternas val.

"variables": {
  "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'sawinvm')]",
  "publicIPAddressName": "[concat(uniqueString(resourceGroup().id),'IP')]",
  "vmName": "[parameters('vmName')]",
  "nicName": "[concat(parameters('vmName'),'Nic')]",
  "vnetId": {
    "new": "[resourceId('Microsoft.Network/virtualNetworks',parameters('virtualNetworkName'))]",
    "existing": "[resourceId(parameters('virtualNetworkResourceGroup'),'Microsoft.Network/virtualNetworks',parameters('virtualNetworkName'))]"
  },
  "subnetId": "[concat(variables('vnetId')[parameters('virtualNetworkNewOrExisting')],'/subnets/',parameters('subnetName'))]",
  "publicIPAddressType": "Dynamic"
},

Nätverksgränssnittet är inställt på variabeln undernäts-ID.

{
  "type": "Microsoft.Network/networkInterfaces",
  "name": "[variables('nicName')]",
  "apiVersion": "2021-02-01",
  "location": "[parameters('location')]",
  "properties": {
    "ipConfigurations": [
      {
        "name": "ipconfig1",
        "properties": {
          "privateIPAllocationMethod": "Dynamic",
          "publicIPAddress": {
            "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
          },
          "subnet": {
            "id": "[variables('subnetId')]"
          }
        }
      }
    ],
    "enableIPForwarding": true
  },

Användargränssnittsdefinition

Nu ska vi titta på filen createUiDefinition.json . Hela filen är:

{
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [],
    "steps": [
      {
        "name": "deploymentDetails",
        "label": "Deployment Details",
        "subLabel": {
          "preValidation": "Required",
          "postValidation": "Done"
        },
        "bladeTitle": "Deployment Details",
        "elements": [
          {
            "name": "virtualMachine",
            "type": "Microsoft.Common.Section",
            "elements": [
              {
                "name": "vmName",
                "type": "Microsoft.Common.TextBox",
                "label": "VM Name",
                "toolTip": "Name of your virtual machine",
                "constraints": {
                  "required": true
                }
              },
              {
                "name": "vmPassword",
                "type": "Microsoft.Compute.CredentialsCombo",
                "label": {
                  "password": "Password",
                  "confirmPassword": "Confirm password"
                },
                "toolTip": {
                  "password": ""
                },
                "constraints": {
                  "required": true,
                  "customPasswordRegex": "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{12,}$",
                  "customValidationMessage": "The password must be alphanumeric, contain at least 12 characters, and have at least 1 letter and 1 number."
                },
                "options": {
                  "hideConfirmation": false
                },
                "osPlatform": "Windows",
                "visible": true
              }
            ],
            "visible": true
          },
          {
            "name": "vnet",
            "type": "Microsoft.Network.VirtualNetworkCombo",
            "label": {
              "virtualNetwork": "Virtual Network",
              "subnets": "Subnets"
            },
            "defaultValue": {
              "name": "vmx-vnet",
              "addressPrefixSize": "/16"
            },
            "constraints": {
              "minAddressPrefixSize": "/24"
            },
            "subnets": {
              "subnet1": {
                "label": "Subnet",
                "defaultValue": {
                  "name": "vmx-subnet",
                  "addressPrefixSize": "/24"
                },
                "constraints": {
                  "minAddressPrefixSize": "/29",
                  "minAddressCount": 8,
                  "requireContiguousAddresses": true
                }
              }
            }
          },
          {
            "name": "VMSize",
            "type": "Microsoft.Compute.SizeSelector",
            "label": "VM size",
            "toolTip": "The size of virtual machine for VM.",
            "recommendedSizes": [
              "Standard_D2_v2",
              "Standard_D2_v3"
            ],
            "constraints": {
              "allowedSizes": [
                "Standard_D2_v2",
                "Standard_D2_v3"
              ],
              "excludedSizes": []
            },
            "osPlatform": "Windows",
            "imageReference": {
              "publisher": "MicrosoftWindowsServer",
              "offer": "WindowsServer",
              "sku": "2012-R2-Datacenter"
            }
          }
        ]
      },
      {
        "name": "identityDetails",
        "label": "Managed Identity Details",
        "subLabel": {
          "preValidation": "Required",
          "postValidation": "Done"
        },
        "bladeTitle": "Managed Identity Details",
        "elements": [
          {
            "name": "identity",
            "type": "Microsoft.ManagedIdentity.IdentitySelector",
            "label": "Managed Identity Configuration",
            "toolTip": {
              "systemAssignedIdentity": "Enable system assigned identity to grant the resource access to other existing resources.",
              "userAssignedIdentity": "Add user assigned identities to grant the resource access to other existing resources."
            },
            "defaultValue": {
              "systemAssignedIdentity": "Off"
            },
            "options": {
              "hideSystemAssignedIdentity": false,
              "hideUserAssignedIdentity": false
            },
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "vmName": "[steps('deploymentDetails').virtualMachine.vmName]",
      "adminPassword": "[steps('deploymentDetails').virtualMachine.vmPassword.password]",
      "virtualNetworkName": "[steps('deploymentDetails').vnet.name]",
      "virtualNetworkNewOrExisting": "[steps('deploymentDetails').vnet.newOrExisting]",
      "virtualNetworkAddressPrefix": "[first(steps('deploymentDetails').vnet.addressPrefixes)]",
      "virtualNetworkResourceGroup": "[steps('deploymentDetails').vnet.resourceGroup]",
      "virtualMachineSize": "[steps('deploymentDetails').VMSize]",
      "subnetName": "[steps('deploymentDetails').vnet.subnets.subnet1.name]",
      "subnetAddressPrefix": "[steps('deploymentDetails').vnet.subnets.subnet1.addressPrefix]",
      "managedIdentity": "[steps('identityDetails').identity]"
    }
  }
}

Filen innehåller ett virtuellt nätverkselement.

{
  "name": "vnet",
  "type": "Microsoft.Network.VirtualNetworkCombo",
  "label": {
    "virtualNetwork": "Virtual Network",
    "subnets": "Subnets"
  },
  "defaultValue": {
    "name": "vmx-vnet",
    "addressPrefixSize": "/16"
  },
  "constraints": {
    "minAddressPrefixSize": "/24"
  },
  "subnets": {
    "subnet1": {
      "label": "Subnet",
      "defaultValue": {
        "name": "vmx-subnet",
        "addressPrefixSize": "/24"
      },
      "constraints": {
        "minAddressPrefixSize": "/29",
        "minAddressCount": 8,
        "requireContiguousAddresses": true
      }
    }
  }
},

Med det elementet kan användaren välja antingen ett nytt eller befintligt virtuellt nätverk.

Nytt eller befintligt virtuellt nätverk

I utdata inkluderar du ett värde som anger om konsumenten har valt ett nytt eller befintligt virtuellt nätverk. Det finns också ett hanterat identitetsvärde.

Kommentar

Utdatavärdet för den hanterade identiteten måste ha namnet managedIdentity.

"outputs": {
  "location": "[location()]",
  "vmName": "[steps('deploymentDetails').virtualMachine.vmName]",
  "adminPassword": "[steps('deploymentDetails').virtualMachine.vmPassword.password]",
  "virtualNetworkName": "[steps('deploymentDetails').vnet.name]",
  "virtualNetworkNewOrExisting": "[steps('deploymentDetails').vnet.newOrExisting]",
  "virtualNetworkAddressPrefix": "[first(steps('deploymentDetails').vnet.addressPrefixes)]",
  "virtualNetworkResourceGroup": "[steps('deploymentDetails').vnet.resourceGroup]",
  "virtualMachineSize": "[steps('deploymentDetails').VMSize]",
  "subnetName": "[steps('deploymentDetails').vnet.subnets.subnet1.name]",
  "subnetAddressPrefix": "[steps('deploymentDetails').vnet.subnets.subnet1.addressPrefix]",
  "managedIdentity": "[steps('identityDetails').identity]"
}

Nästa steg

Mer information om hur du skapar UI-definitionsfilen finns i CreateUiDefinition.json för azure-hanterade program.