本文介绍如何使用 Azure 资源管理器模板(ARM 模板)创建 Azure 云服务(外延支持)部署。
完成以下步骤作为使用 ARM 模版创建部署的先决条件。
查看云服务(外延支持)的部署先决条件,并创建所需的资源。
通过使用 Azure 门户或 Azure PowerShell 创建新的资源组。 如果使用现有资源组,则此步骤为可选步骤。
通过使用 Azure 门户或 Azure PowerShell 创建新的存储帐户。 如果使用现有存储帐户,则此步骤是可选的。
通过使用 Azure 门户或 Azure PowerShell 将包(.cspkg 或 .zip)文件和配置 (.cscfg) 文件上传到存储帐户。 保存这两个文件的共享访问签名 (SAS) URI,以便在后续步骤中添加到 ARM 模板。
(可选)创建密钥保管库并上传证书。
- 可以将证书附加到部署,以便与服务进行安全通信。 如果使用证书,必须在配置 (.cscfg) 文件中指定证书指纹,并将其上传到密钥保管库。 可以使用 Azure 门户或 Azure PowerShell 来创建密钥保管库。
- 关联的密钥保管库必须与云服务(外延支持)部署位于同一区域和订阅中。
- 关联的密钥保管库必须具有相关权限,以便云服务(外延支持)资源可以从密钥保管库检索证书。 有关详细信息,请查看在云服务(外延支持)中使用证书。
- 必须在 ARM 模板的
osProfile
部分中引用密钥保管库,如之后的步骤所示。
若要使用模板部署云服务(外延支持),请执行以下操作:
注意
通过使用 Azure 门户,可以更轻松地生成 ARM 模板和参数文件。 可以在门户中下载生成的 ARM 模板,以便通过 Azure PowerShell 创建云服务(外延支持)。
创建虚拟网络。 虚拟网络的名称必须与配置文件 (.cscfg) 中的虚拟网络引用匹配。 如果使用现有虚拟网络,可在 ARM 模板中省略此部分。
"resources": [ { "apiVersion": "2019-08-01", "type": "Microsoft.Network/virtualNetworks", "name": "[parameters('vnetName')]", "location": "[parameters('location')]", "properties": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "subnets": [ { "name": "WebTier", "properties": { "addressPrefix": "10.0.0.0/24" } } ] } } ]
如果创建新的虚拟网络,请将以下行添加到
dependsOn
部分,以确保平台在创建云服务(外延支持)实例之前创建虚拟网络:"dependsOn": [ "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" ]
创建公共 IP 地址,并选择性地设置公共 IP 地址的 DNS 标签属性。 如果使用静态 IP 地址,则必须将其引用为配置 (.cscfg) 文件中的保留 IP 地址。 如果使用现有 IP 地址,请跳过此步骤,并将 IP 地址信息直接添加到 ARM 模板的负载均衡器配置设置中。
"resources": [ { "apiVersion": "2019-08-01", "type": "Microsoft.Network/publicIPAddresses", "name": "[parameters('publicIPName')]", "location": "[parameters('location')]", "properties": { "publicIPAllocationMethod": "Dynamic", "idleTimeoutInMinutes": 10, "publicIPAddressVersion": "IPv4", "dnsSettings": { "domainNameLabel": "[variables('dnsName')]" } }, "sku": { "name": "Basic" } } ]
如果创建新的 IP 地址,请将以下行添加到
dependsOn
部分,以确保平台在创建云服务(外延支持)实例之前创建 IP 地址:"dependsOn": [ "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" ]
创建云服务(外延支持)对象。 如果要在模板中部署虚拟网络或公共 IP 地址,请添加相关的
dependsOn
引用。{ "apiVersion": "2021-03-01", "type": "Microsoft.Compute/cloudServices", "name": "[variables('cloudServiceName')]", "location": "[parameters('location')]", "tags": { "DeploymentLabel": "[parameters('deploymentLabel')]", "DeployFromVisualStudio": "true" }, "dependsOn": [ "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]", "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" ], "properties": { "packageUrl": "[parameters('packageSasUri')]", "configurationUrl": "[parameters('configurationSasUri')]", "upgradeMode": "[parameters('upgradeMode')]" } }
为部署创建网络配置文件对象,并将公共 IP 地址与负载均衡器的前端相关联。 Azure 平台会自动创建负载均衡器。
"networkProfile": { "loadBalancerConfigurations": [ { "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/loadBalancers/', variables('lbName'))]", "name": "[variables('lbName')]", "properties": { "frontendIPConfigurations": [ { "name": "[variables('lbFEName')]", "properties": { "publicIPAddress": { "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" } } } ] } } ] }
在 ARM 模板的
osProfile
部分添加密钥保管库引用。 密钥保管库可存储与云服务(外延支持)关联的证书。 将证书添加到密钥保管库,然后引用配置文件 (.cscfg) 中的证书指纹。 此外,在 Azure 门户中为用于部署的 Azure 虚拟机设置密钥保管库访问策略,以便云服务(外延支持)资源可以检索在密钥保管库中存储为机密的证书。 该密钥保管库必须位于云服务(外延支持)资源所在的同一区域和订阅中,并且名称必须唯一。 有关详细信息,请查看在云服务(外延支持)中使用证书。"osProfile": { "secrets": [ { "sourceVault": { "id": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.KeyVault/vaults/{keyvault-name}" }, "vaultCertificates": [ { "certificateUrl": "https://{keyvault-name}.vault.azure.cn:443/secrets/ContosoCertificate/{secret-id}" } ] } ] }
注意
ARM 模板中的
sourceVault
是密钥保管库的资源 ID 值。 可以通过在密钥保管库的“属性”部分查找“资源 ID”来获取此信息。- 可以通过转到密钥保管库中标有“机密标识符”的证书来获取
certificateUrl
的值。 certificateUrl
应采用https://{keyvault-endpoint}/secrets/{secret-name}/{secret-id}
格式。
- 可以通过转到密钥保管库中标有“机密标识符”的证书来获取
创建角色配置文件。 确保配置文件 (.cscfg)、定义文件 (.csdef) 和 ARM 模板的
roleProfile
部分中的角色数量、每个角色的实例数量、角色名称和角色大小相同。"roleProfile": { "roles": { "value": [ { "name": "WebRole1", "sku": { "name": "Standard_D1_v2", "capacity": "1" } }, { "name": "WorkerRole1", "sku": { "name": "Standard_D1_v2", "capacity": "1" } } ] } }
(可选)创建扩展配置文件,以将扩展添加到云服务(外延支持)部署。 以下示例添加远程桌面协议 (RDP) 扩展和 Azure 诊断扩展。
注意
RDP 的密码必须包含 8 到 123 个字符,并且必须至少满足以下三项密码复杂性要求:
包含一个大写字符。
包含一个小写字符。
包含一个数字。
包含一个特殊字符。
不能包含控件字符。"extensionProfile": { "extensions": [ { "name": "RDPExtension", "properties": { "autoUpgradeMinorVersion": true, "publisher": "Microsoft.Windows.Azure.Extensions", "type": "RDP", "typeHandlerVersion": "1.2.1", "settings": "<PublicConfig>\r\n <UserName>[Insert Username]</UserName>\r\n <Expiration>1/21/2022 12:00:00 AM</Expiration>\r\n</PublicConfig>", "protectedSettings": "<PrivateConfig>\r\n <Password>[Insert Password]</Password>\r\n</PrivateConfig>" } }, { "name": "Microsoft.Insights.VMDiagnosticsSettings_WebRole1", "properties": { "autoUpgradeMinorVersion": true, "publisher": "Microsoft.Azure.Diagnostics", "type": "PaaSDiagnostics", "typeHandlerVersion": "1.5", "settings": "[parameters('wadPublicConfig_WebRole1')]", "protectedSettings": "[parameters('wadPrivateConfig_WebRole1')]", "rolesAppliedTo": [ "WebRole1" ] } } ] }
查看完整模板:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "cloudServiceName": { "type": "string", "metadata": { "description": "Name of the cloud service" } }, "location": { "type": "string", "metadata": { "description": "Location of the cloud service" } }, "deploymentLabel": { "type": "string", "metadata": { "description": "Label of the deployment" } }, "packageSasUri": { "type": "securestring", "metadata": { "description": "SAS URI of the package (.cspkg) file to deploy" } }, "configurationSasUri": { "type": "securestring", "metadata": { "description": "SAS URI of the configuration (.cscfg) file" } }, "roles": { "type": "array", "metadata": { "description": "Roles created in the cloud service application" } }, "wadPublicConfig_WebRole1": { "type": "string", "metadata": { "description": "Public configuration of the Azure Diagnostics extension" } }, "wadPrivateConfig_WebRole1": { "type": "securestring", "metadata": { "description": "Private configuration of the Azure Diagnostics extension" } }, "vnetName": { "type": "string", "defaultValue": "[concat(parameters('cloudServiceName'), 'VNet')]", "metadata": { "description": "Name of virtual network" } }, "publicIPName": { "type": "string", "defaultValue": "contosocsIP", "metadata": { "description": "Name of public IP address" } }, "upgradeMode": { "type": "string", "defaultValue": "Auto", "metadata": { "UpgradeMode": "UpgradeMode of the CloudService" } } }, "variables": { "cloudServiceName": "[parameters('cloudServiceName')]", "subscriptionID": "[subscription().subscriptionId]", "dnsName": "[variables('cloudServiceName')]", "lbName": "[concat(variables('cloudServiceName'), 'LB')]", "lbFEName": "[concat(variables('cloudServiceName'), 'LBFE')]", "resourcePrefix": "[concat('/subscriptions/', variables('subscriptionID'), '/resourceGroups/', resourceGroup().name, '/providers/')]" }, "resources": [ { "apiVersion": "2019-08-01", "type": "Microsoft.Network/virtualNetworks", "name": "[parameters('vnetName')]", "location": "[parameters('location')]", "properties": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "subnets": [ { "name": "WebTier", "properties": { "addressPrefix": "10.0.0.0/24" } } ] } }, { "apiVersion": "2019-08-01", "type": "Microsoft.Network/publicIPAddresses", "name": "[parameters('publicIPName')]", "location": "[parameters('location')]", "properties": { "publicIPAllocationMethod": "Dynamic", "idleTimeoutInMinutes": 10, "publicIPAddressVersion": "IPv4", "dnsSettings": { "domainNameLabel": "[variables('dnsName')]" } }, "sku": { "name": "Basic" } }, { "apiVersion": "2021-03-01", "type": "Microsoft.Compute/cloudServices", "name": "[variables('cloudServiceName')]", "location": "[parameters('location')]", "tags": { "DeploymentLabel": "[parameters('deploymentLabel')]", "DeployFromVisualStudio": "true" }, "dependsOn": [ "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]", "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" ], "properties": { "packageUrl": "[parameters('packageSasUri')]", "configurationUrl": "[parameters('configurationSasUri')]", "upgradeMode": "[parameters('upgradeMode')]", "roleProfile": { "roles": [ { "name": "WebRole1", "sku": { "name": "Standard_D1_v2", "capacity": "1" } }, { "name": "WorkerRole1", "sku": { "name": "Standard_D1_v2", "capacity": "1" } } ] }, "networkProfile": { "loadBalancerConfigurations": [ { "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/loadBalancers/', variables('lbName'))]", "name": "[variables('lbName')]", "properties": { "frontendIPConfigurations": [ { "name": "[variables('lbFEName')]", "properties": { "publicIPAddress": { "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" } } } ] } } ] }, "osProfile": { "secrets": [ { "sourceVault": { "id": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.KeyVault/vaults/{keyvault-name}" }, "vaultCertificates": [ { "certificateUrl": "https://{keyvault-name}.vault.azure.cn:443/secrets/ContosoCertificate/{secret-id}" } ] } ] }, "extensionProfile": { "extensions": [ { "name": "RDPExtension", "properties": { "autoUpgradeMinorVersion": true, "publisher": "Microsoft.Windows.Azure.Extensions", "type": "RDP", "typeHandlerVersion": "1.2.1", "settings": "<PublicConfig>\r\n <UserName>[Insert Username]</UserName>\r\n <Expiration>1/21/2022 12:00:00 AM</Expiration>\r\n</PublicConfig>", "protectedSettings": "<PrivateConfig>\r\n <Password>[Insert Password]</Password>\r\n</PrivateConfig>" } }, { "name": "Microsoft.Insights.VMDiagnosticsSettings_WebRole1", "properties": { "autoUpgradeMinorVersion": true, "publisher": "Microsoft.Azure.Diagnostics", "type": "PaaSDiagnostics", "typeHandlerVersion": "1.5", "settings": "[parameters('wadPublicConfig_WebRole1')]", "protectedSettings": "[parameters('wadPrivateConfig_WebRole1')]", "rolesAppliedTo": [ "WebRole1" ] } } ] } } } ] }
要创建云服务(扩展支持)部署,请部署模板和参数文件(在模板文件中定义参数)。 可使用这些示例模板。
New-AzResourceGroupDeployment -ResourceGroupName "ContosOrg" -TemplateFile "file path to your template file" -TemplateParameterFile "file path to your parameter file"
- 请参阅云服务(外延支持)的常见问题解答。
- 使用 Azure 门户、Azure PowerShell 或 Visual Studio 部署云服务(外延支持)。
- 访问云服务(外延支持)示例存储库。