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 实例元数据和用户数据。