用户数据使你能够将自己的脚本或元数据传递给虚拟机。
用户数据是在预配时插入 Azure 虚拟机的一组脚本或其他元数据。 虚拟机上的任何应用程序均可在预配后从 Azure 实例元数据服务 (IMDS) 访问用户数据。
用户数据是自定义数据的新版本,它提供了额外的好处:
预配后可从 Azure 实例元数据服务 (IMDS) 检索用户数据。
用户数据具有永久性。 用户数据在 VM 的生存期内可用。
可在不停止或重启 VM 的情况下从 VM 外部更新用户数据。
可使用 $expand 选项通过 GET VM/VMSS API 查询用户数据。
此外,如果预配时未添加用户数据,仍可在预配后添加。
安全警告
警告
用户数据不会加密,VM 上的任何进程均可查询这些数据。 不应在用户数据中存储机密信息。
确保获取最新的 Azure 资源管理器 API 以使用新的用户数据功能。 内容在传递到 API 之前应以 base64 编码。 大小不能超过 64 KB。
在创建新 VM 时添加用户数据
借助此 Azure 资源管理器模板,使用用户数据创建新 VM。 如果使用的是 REST API,则对于单个 VM,请使用 PUT 请求将“UserData”添加到“属性”部分以创建 VM。
{
"name": "testVM",
"location": "China North",
"properties": {
"hardwareProfile": {
"vmSize": "Standard_A1"
},
"storageProfile": {
"osDisk": {
"osType": "Windows",
"name": "osDisk",
"createOption": "Attach",
"vhd": {
"uri": "http://myaccount.blob.core.chinacloudapi.cn/container/directory/blob.vhd"
}
}
},
"userData": "c2FtcGxlIHVzZXJEYXRh",
"networkProfile": { "networkInterfaces" : [ { "name" : "nic1" } ] },
}
}
新建虚拟机规模集时添加用户数据
创建虚拟机规模集时,使用 REST API 通过 PUT 请求将“UserData”添加到“virtualMachineProfile”部分。
{
"location": "China North",
"sku": {
"name": "Standard_A1",
"capacity": 1
},
"properties": {
"upgradePolicy": {
"mode": "Automatic"
},
"virtualMachineProfile": {
"userData": "VXNlckRhdGE=",
"osProfile": {
"computerNamePrefix": "TestVM",
"adminUsername": "TestUserName",
"windowsConfiguration": {
"provisionVMAgent": true,
"timeZone": "Dateline Standard Time"
}
},
"storageProfile": {
"osDisk": {
"createOption": "FromImage",
"caching": "ReadOnly"
},
"imageReference": {
"publisher": "publisher",
"offer": "offer",
"sku": "sku",
"version": "1.2.3"
}
},
"networkProfile": {"networkInterfaceConfigurations":[{"name":"nicconfig1","properties":{"ipConfigurations":[{"name":"ip1","properties":{"subnet":{"id":"vmssSubnet0"}}}]}}]},
"diagnosticsProfile": {
"bootDiagnostics": {
"enabled": true,
"storageUri": "https://crputest.blob.core.chinacloudapi.cn"
}
}
},
"provisioningState": 0,
"overprovision": false,
"uniqueId": "00000000-0000-0000-0000-000000000000"
}
}
VM 内运行的应用程序可以从 IMDS 终结点检索用户数据。 有关详细信息,请参阅此处的 IMDS 示例代码。
客户可以使用 $expand=userData 终结点(请求正文可以留空)通过 rest API 检索用户数据的现有值。
单个 VM:
GET "/subscriptions/{guid}/resourceGroups/{RGName}/providers/Microsoft.Compute/virtualMachines/{VMName}?$expand=userData"
虚拟机规模集:
GET "/subscriptions/{guid}/resourceGroups/{RGName}/providers/Microsoft.Compute/virtualMachineScaleSets/{VMSSName}?$expand=userData"
虚拟机规模集 VM:
GET "/subscriptions/{guid}/resourceGroups/{RGName}/providers/Microsoft.Compute/virtualMachineScaleSets/{VMSSName}/virtualmachines/{vmss instance id}?$expand=userData"
对于 REST API,可通过普通 PUT 或 PATCH 请求来更新用户数据。 无需停止或重启 VM 即可更新用户数据。
PUT "/subscriptions/{guid}/resourceGroups/{RGName}/providers/Microsoft.Compute/ virtualMachines/{VMName}
PATCH "/subscriptions/{guid}/resourceGroups/{RGName}/providers/Microsoft.Compute/ virtualMachines/{VMName}
这些请求中的 VM.Properties 应包含所需的 UserData 字段,如下所示:
"properties": {
"hardwareProfile": {
"vmSize": "Standard_D1_v2"
},
"storageProfile": {
"imageReference": {
"sku": "2016-Datacenter",
"publisher": "MicrosoftWindowsServer",
"version": "latest",
"offer": "WindowsServer"
},
"osDisk": {
"caching": "ReadWrite",
"managedDisk": {
"storageAccountType": "StandardSSD_LRS"
},
"name": "vmOSdisk",
"createOption": "FromImage"
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "/subscriptions/{subscription-id}/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/{existing-nic-name}",
"properties": {
"primary": true
}
}
]
},
"osProfile": {
"adminUsername": "{your-username}",
"computerName": "{vm-name}",
"adminPassword": "{your-password}"
},
"diagnosticsProfile": {
"bootDiagnostics": {
"storageUri": "http://{existing-storage-account-name}.blob.core.chinacloudapi.cn",
"enabled": true
}
},
"userData": "U29tZSBDdXN0b20gRGF0YQ=="
}
备注
如果在这种情况下为“userData”传入空字符串,则删除用户数据。
自定义数据继续以现有方式工作。 请注意,无法从 IMDS 检索自定义数据。
如果有一个没有用户数据的现有 VM/VMSS,仍然可以使用更新命令将用户数据添加到此 VM,如“更新用户数据”部分所述。 确保升级为最新版的 Azure 资源管理器 API。
试用 Azure 实例元数据服务,了解如何从其终结点获取 VM 实例元数据和用户数据。