用户数据使你能够将自己的脚本或元数据传递给虚拟机。
什么是“用户数据”
用户数据是在预配时插入 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 实例元数据和用户数据。