能否通过Azure ARM模板利用存储账户访问密钥跨RG创建Ubuntu Linux VM?
能否用Azure ARM模板基于存储账户中的VHD创建Ubuntu虚拟机?
当然可以!你完全可以通过Azure ARM模板实现这个需求——基于存储账户中已上传的Ubuntu VHD文件,部署虚拟机到独立的Client资源组,同时通过存储账户访问密钥来授权访问存储账户。下面我会一步步给你讲清楚怎么操作:
核心配置思路
ARM模板可以直接指定自定义VHD的Blob URI,同时通过存储账户密钥授权访问存储账户,最终将VM部署到目标Client资源组。关键在于正确配置虚拟机的存储Profile部分,以及传递必要的存储账户认证信息。
关键模板代码示例
下面是一个简化版的ARM模板,包含创建VM所需的核心配置:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "vmName": { "type": "string", "metadata": { "description": "名称:虚拟机" } }, "vmSize": { "type": "string", "defaultValue": "Standard_D2s_v3", "metadata": { "description": "规格:虚拟机" } }, "storageAccountName": { "type": "string", "metadata": { "description": "名称:存储VHD的存储账户" } }, "storageAccountKey": { "type": "securestring", "metadata": { "description": "密钥:存储账户访问密钥" } }, "vhdUri": { "type": "string", "metadata": { "description": "URI:存储账户中的Ubuntu VHD Blob地址" } }, "adminUsername": { "type": "string", "metadata": { "description": "用户名:VM管理员账户" } }, "adminPassword": { "type": "securestring", "metadata": { "description": "密码:VM管理员账户密码" } }, "virtualNetworkName": { "type": "string", "metadata": { "description": "名称:已存在的虚拟网络" } }, "subnetName": { "type": "string", "metadata": { "description": "名称:虚拟网络中的子网" } } }, "resources": [ { "type": "Microsoft.Compute/virtualMachines", "apiVersion": "2023-07-01", "name": "[parameters('vmName')]", "location": "[resourceGroup().location]", "properties": { "hardwareProfile": { "vmSize": "[parameters('vmSize')]" }, "storageProfile": { "osDisk": { "osType": "Linux", "name": "[concat(parameters('vmName'), '-osdisk')]", "vhd": { "uri": "[parameters('vhdUri')]" }, "caching": "ReadWrite", "createOption": "Attach" } }, "osProfile": { "computerName": "[parameters('vmName')]", "adminUsername": "[parameters('adminUsername')]", "adminPassword": "[parameters('adminPassword')]" }, "networkProfile": { "networkInterfaces": [ { "id": "[resourceId('Microsoft.Network/networkInterfaces', concat(parameters('vmName'), '-nic'))]" } ] } }, "dependsOn": [ "[resourceId('Microsoft.Network/networkInterfaces', concat(parameters('vmName'), '-nic'))]" ] }, { "type": "Microsoft.Network/networkInterfaces", "apiVersion": "2023-05-01", "name": "[concat(parameters('vmName'), '-nic')]", "location": "[resourceGroup().location]", "properties": { "ipConfigurations": [ { "name": "ipconfig1", "properties": { "subnet": { "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnetName'))]" }, "privateIPAllocationMethod": "Dynamic" } } ] } } ] }
部署命令示例
将上述模板保存为ubuntu-vm-from-vhd.json后,使用Azure CLI命令部署到Client资源组:
az deployment group create \ --resource-group Client \ --template-file ./ubuntu-vm-from-vhd.json \ --parameters vmName="myUbuntuVM" \ storageAccountName="mystorageaccount" \ storageAccountKey="your-storage-account-access-key" \ vhdUri="https://mystorageaccount.blob.core.windows.net/your-container/ubuntu-generalized.vhd" \ adminUsername="azureadmin" \ adminPassword="YourStrongPassword123!" \ virtualNetworkName="myExistingVNet" \ subnetName="myExistingSubnet"
重要注意事项
- 务必通用化Ubuntu VHD:在源VM上执行
sudo waagent -deprovision+user -force命令,彻底清理系统个性化配置后再导出VHD,否则新部署的VM可能出现账户冲突或无法启动的问题。 - 存储账户与VM同区域:存储账户和目标
Client资源组必须处于同一个Azure区域,跨区域挂载VHD会导致部署失败或严重性能问题。 - 安全存储密钥:不建议在命令行中明文传递存储账户密钥,推荐将密钥存入Azure Key Vault,部署时通过模板引用Key Vault参数来获取,提升安全性。
- 提前创建依赖资源:模板中假设虚拟网络和子网已存在,若需要自动创建这些资源,可以在模板中添加对应的资源定义。
内容的提问来源于stack exchange,提问作者Arani
相关产品推荐
相关产品推荐

