Azure 虚拟机的用户数据
用户数据使你能够将自己的脚本或元数据传递给虚拟机。
什么是“用户数据”
用户数据是在预配时插入 Azure 虚拟机的一组脚本或其他元数据。 虚拟机上的任何应用程序均可在预配后从 Azure 实例元数据服务 (IMDS) 访问用户数据。
用户数据是自定义数据的新版本,它提供了额外的好处:
预配后可从 Azure 实例元数据服务 (IMDS) 检索用户数据。
用户数据具有永久性。 用户数据在 VM 的生存期内可用。
可在不停止或重启 VM 的情况下从 VM 外部更新用户数据。
可使用 $expand 选项通过 GET VM/VMSS API 查询用户数据。
此外,如果预配时未添加用户数据,仍可在预配后添加。
安全警告
警告
用户数据不会加密,VM 上的任何进程均可查询这些数据。 不应在用户数据中存储机密信息。
确保获取最新的 Azure 资源管理器 API 以使用新的用户数据功能。 内容在传递到 API 之前应以 base64 编码。 大小不能超过 64 KB。
为 Azure VM/VMSS 创建用户数据
在创建新 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
如果有一个没有用户数据的现有 VM/VMSS,仍然可以使用更新命令将用户数据添加到此 VM,如“更新用户数据”部分所述。 确保升级为最新版的 Azure 资源管理器 API。
后续步骤
试用 Azure 实例元数据服务,了解如何从其终结点获取 VM 实例元数据和用户数据。