适用于: ✔️ Linux 虚拟机 ✔️ Windows 虚拟机 ✔️ 灵活虚拟机规模集
预配时,可能需要将脚本或其他元数据注入Azure虚拟机(VM)。 Azure通过称为自定义数据的功能支持此方案。
首次启动或设置时,VM 可以使用自定义数据,这称为预配。 预配是指将 VM 创建参数(例如主机名、用户名、密码、证书、自定义数据和密钥)提供给 VM 的过程。 预配代理(如 cloud-init)处理这些参数。
注释
Azure还提供单独的用户数据功能。 与自定义数据不同,用户数据可从Azure实例元数据服务(IMDS)检索,在 VM 的生存期内是永久性的,可以在不停止或重新映像 VM 的情况下进行更新。 需要预配后访问权限或更新时使用用户数据;在首次启动时需要预配代理处理的有效负载时,请使用自定义数据。
将自定义数据传递给 VM
若要使用自定义数据,除非使用 Azure CLI 等 CLI 工具执行转换,否则在将数据传递给 API 之前,必须先对内容进行 base64 编码。 大小不能超过 64 KB。
在 CLI 中,可以将自定义数据作为文件传递,如下例所示。 该文件将转换为 Base64。
az vm create \
--resource-group myResourceGroup \
--name myVM \
--image Ubuntu2204 \
--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的代码。
%SystemDrive%\AzureData 文件夹在预配期间受到保护,以便只有 NT AUTHORITY\SYSTEM 和 BUILTIN\Administrator 能够完全控制,CustomData.bin继承这些权限。 如果在其他位置复制 CustomData.bin 进行处理,请显式设置目标的权限,因为其权限不会随文件一起传输。
Linux
在 Linux 操作系统上,自定义数据通过 ovf-env.xml 文件传递到 VM。 该文件在预配期间复制到 /var/lib/waagent 目录。 较新版本的 Linux 代理会将 Base64 编码的数据复制到 /var/lib/waagent/CustomData 以便于使用。
Azure 目前支持两个预配代理:
Linux 代理。 默认情况下,代理不会处理自定义数据。 你需要构建一个已启用该数据的自定义镜像。 相关设置如下:
Provisioning.DecodeCustomDataProvisioning.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 支持。
FAQ
是否可以在创建 VM 后更新自定义数据?
对于单个 VM,无法更新 VM 模型中的自定义数据。 但对于虚拟机规模集,可以更新自定义数据。 有关更多信息,请参阅修改缩放集。 在为虚拟机规模集更新模型中的自定义数据时:
- 规模集内的现有实例只有在更新到最新模型并重新映像后,才会获得更新后的自定义数据。
- 新实例将接收新的自定义数据。
是否可将敏感值放入自定义数据中?
建议不要将敏感数据存储在自定义数据中。 有关详细信息,请参阅 Azure 数据安全和加密最佳做法。
自定义数据在 IMDS 中是否可用?
No. 自定义数据不会通过Azure实例元数据服务(IMDS)显示。 如果在预配后需要从 VM 内部检索有效负载,或者在不停止或重新映像 VM 的情况下对其进行更新,请改用 用户数据 功能。 有关从 IMDS 读取用户数据的详细信息,请参阅 “获取用户数据”。