在 Azure 虚拟机上使用自定义数据和 cloud-init

注意

本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。

适用于:✔️ Linux VM ✔️ Windows VM ✔️ 灵活规模集

你可能需要在预配时将脚本或其他元数据注入 Azure 虚拟机 (VM)。 在其他云中,此概念通常称为“用户数据”。 在 Azure 中有一项称作自定义数据的类似功能。

首次启动或设置时,VM 可以使用自定义数据,这称为预配。 预配是指 VM 使用 VM 创建参数(例如主机名、用户名、密码、证书、自定义数据和密钥)的过程。 Linux 代理cloud-init 等预配代理处理这些参数。

将自定义数据传递给 VM

若要使用自定义数据,除非使用 Azure CLI 等 CLI 工具执行转换,否则在将数据传递给 API 之前,必须先对内容进行 base64 编码。 大小不能超过 64 KB。

在 CLI 中,可以将自定义数据作为文件传递,如下例所示。 该文件将转换为 Base64。

az vm create \
  --resource-group myResourceGroup \
  --name centos74 \
  --image OpenLogic:CentOS-CI:7-CI:latest \
  --custom-data cloud-init.txt \
  --generate-ssh-keys

Azure 资源管理器中有一个 base64 函数

"name": "[parameters('virtualMachineName')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2019-07-01",
"location": "[parameters('location')]",
"dependsOn": [
..],
"variables": {
        "customDataBase64": "[base64(parameters('stringData'))]"
    },
"properties": {
..
    "osProfile": {
        "computerName": "[parameters('virtualMachineName')]",
        "adminUsername": "[parameters('adminUsername')]",
        "adminPassword": "[parameters('adminPassword')]",
        "customData": "[variables('customDataBase64')]"
        },

处理自定义数据

VM 上安装的预配代理负责处理与平台的对接并将数据放到文件系统的过程。

Windows

系统会将自定义数据以二进制文件的形式放在 %SYSTEMDRIVE%\AzureData\CustomData.bin 中,但不会对其进行处理。 如果你想要处理此文件,则需要生成自定义映像,并编写代码来处理 CustomData.bin。

Linux

在 Linux 操作系统上,自定义数据通过 ovf-env.xml 文件传递到 VM。 该文件在预配期间复制到 /var/lib/waagent 目录。 较新版本的 Linux 代理会将 Base64 编码的数据复制到 /var/lib/waagent/CustomData 以便于使用。

Azure 目前支持两个预配代理:

  • Linux 代理。 默认情况下,代理不会处理自定义数据。 你需要生成自定义图像,并启用该数据。 相关设置如下:

    • Provisioning.DecodeCustomData
    • Provisioning.ExecuteCustomData

    启用自定义数据并运行脚本时,在脚本完成执行之前,虚拟机不会报告 VM 成功预配。 如果该脚本的运行时间超过 VM 总预配时间限制(40 分钟),则 VM 创建将会失败。

    该脚本无法运行,以及执行期间发生错误,均不是致命的预配失败。 需要创建一个通知路径来针对脚本完成状态发出警报。

    若要排查自定义数据执行问题,请查看 /var/log/waagent.log。

  • Cloud-Init。 默认情况下,此代理将处理自定义数据。 它接受多种格式的自定义数据,例如 cloud-init 配置和脚本。

    与 Linux 代理类似,在 cloud-init 处理自定义数据时执行配置处理或脚本期间发生错误不是致命的预配失败。 需要创建一个通知路径来针对脚本完成状态发出警报。

    但与 Linux 代理不同,cloud-init 会直接向平台报告 VM 已就绪,不会等待用户完成自定义数据配置。 有关 Azure 上的 cloud-init 的更多信息(含故障排除),请参阅 Azure 中虚拟机的 cloud-init 支持

常见问题解答

是否可以在创建 VM 后更新自定义数据?

对于单个 VM,无法更新 VM 模型中的自定义数据。 但对于虚拟机规模集,可以更新自定义数据。 有关详细信息,请参阅修改规模集。 在为虚拟机规模集更新模型中的自定义数据时:

  • 规模集中的现有实例在更新到最新模型且重新创建映像之前不会获取更新的自定义数据。
  • 新实例将接收新的自定义数据。

是否可将敏感值放入自定义数据中?

建议不要将敏感数据存储在自定义数据中。 有关详细信息,请参阅 Azure 数据安全和加密最佳做法

自定义数据在 IMDS 中是否可用?

自定义数据在 Azure 实例元数据服务 (IMDS) 中不可用。 建议改为通过 IMDS 使用用户数据。 有关详细信息,请参阅通过 Azure 实例元数据服务使用用户数据