App Layering

创作 ARM 模板

本部分内容适用于熟悉 ARM 模板的用户。它提供了有关为 App Layering Azure 部署连接器创作模板的详细信息。有关 ARM 模板创作的一般信息,请参阅 Microsoft 文档

输入

每种部署类型都传递一个参数,一个名为 al 的对象。此对象有两个属性,inputcontextinput 属性是特定于每种部署类型的对象,其属性根据部署类型而变化。所有部署类型的 context 属性都相同。它包含有关 App Layering 任务、项目(层或图像模板)以及与当前部署相关的连接器配置的数据。有关参数对象的详细信息,请参阅 Azure 部署模板参数

每个模板都必须在其 al 参数部分声明参数,如下所示:

{
    ...
    "parameters": {
        "al": {
            "type": "object"
        }
    },
    ...
}
<!--NeedCopy-->

模板可以声明更多参数,但参数必须全部具有默认值。否则,App Layering 将无法为他们提供价值。这对于使用只能在参数的默认值部分使用的函数很有用,例如 [utcNow] (https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-date#utcnow)。

输出

所有 ARM 模板都可以有输出。使用 Azure 部署连接器,可以使用模板输出将信息传递给下一次部署。它们也可以用来覆盖某些默认行为。

使用 al 模板参数input 属性将部署的输出传递到下一个部署。

例如,当 缓存磁盘 部署具有以下输出时:

{
    ...
    "outputs": {
        "generation": {
            "type": "string",
            "value": "[variables('generation')]"
        },
        "name": {
            "type": "string",
            "value": "[variables('name')]"
        },
    }
    ...
}
<!--NeedCopy-->

引导映像 部署接收以下输入:

{
  "input":
  {
    "type": "BootImage",
    "source": {
        "generation": "V2",
        "name": "MyCoolDiskName"
    }
  },
  "context": {
    ...
  }
}
<!--NeedCopy-->

请注意, input 对象的 source 属性具有 缓存磁盘 部署模板指定的每个输出的属性。每个输出的来源取决于部署的类型。

部署类型详细信息

每种部署类型都有一组不同的输入和输出,可以更改 App Layering 操作的行为。本节描述了这些特定于部署的详细信息。

有关使用所有这些概念的真实示例,请参阅入门模板

缓存磁盘

缓存磁盘部署必须创建托管磁盘资源。除磁盘外,您还可以选择创建其他资源。App Layering 设备必须有权使用 SAS 令牌(由设备生成)写入磁盘。包含 App Layering 合成引擎的引导映像将在创建后上传到磁盘。

缓存磁盘要求

  • 必须创建托管磁盘资源
  • 托管磁盘 createOption 必须设置为 "Upload"
  • 托管磁盘的 uploadSizeBytes 必须设置为输入所指定的 uploadSize,例如 "[parameters('al').input.uploadSize]"
  • App Layering 设备必须能够使用 SAS 令牌写入托管磁盘
{
    ...
    "resources": [
        {
            "type": "Microsoft.Compute/disks",
            ...
            "properties": {
                ...
                "creationData": {
                    "createOption": "Upload",
                    "uploadSizeBytes": "[parameters('al').input.uploadSize]"
                }
                ...
            }
        }
    ]
    ...
}
<!--NeedCopy-->

缓存磁盘输入

输入对象包含 sizeuploadSize 属性。此对象不包括其他部署的输出。

缓存磁盘输出

如果指定了引导映像部署,则部署的输出将传递给 引导映像 部署。否则,它会传递给计算机部署。

可以指定名为 diskId 的输出来明确告诉 App Layering 要使用哪个磁盘。如果未指定 diskId 输出,App Layering 会自动添加一个输出并将其设置为部署创建的第一个托管磁盘资源的资源 ID。diskId 指定的磁盘已将 App Layering 合成引擎引导映像上传到该磁盘。

引导映像

此部署使用缓存磁盘部署创建的托管磁盘创建资源。对于创建哪种类型的资源没有硬性要求。但是,它必须创建可在创建 VM 时用作操作系统磁盘源的资源,例如计算库映像版本。

引导映像磁盘要求

  • 必须创建可用于创建 VM 操作系统磁盘的资源,其内容与将 ID 作为输入传入的磁盘相同。

例如,使用输入 diskId 作为源的计算库图像版本:

{
    ...
    "resources": [
        {
            "type": "Microsoft.Compute/galleries/images/versions",
            ...
            "properties": {
                ...
                "storageProfile": {
                    "osDiskImage": {
                        "source": {
                            "id": "[parameters('al').input.source.diskId]"
                        }
                    }
                }
                ...
            }
        }
    ]
    ...
}
<!--NeedCopy-->

引导映像输入

输入对象包含 source 属性。source 表示缓存磁盘部署的输出,并指定了每个输出的属性。使用 diskId 属性作为正在创建的资源的来源。

引导映像输出

引导映像部署的输出将传递到计算机部署。没有特殊或必需的输出。但是,您必须包括从创建的资源创建 VM 所需的数据,例如资源 ID。

计算机

计算机 部署必须创建虚拟机资源。根据 合成计算机的防火墙端口,虚拟机必须连接到一个可以访问 App Layering 设备的网络,反之亦然

重要:

不要将 缓存磁盘部署创建的磁盘 连接到虚拟机。 缓存磁盘 是一种共享资源,被视为只读。创建磁盘的副本,并在不使用 Boot Image 部署时改为附加该副本。

计算机要求

  • 必须创建虚拟机资源
  • 虚拟机必须连接到允许与 App Layering 设备进行通信的网络
  • 虚拟机的操作系统磁盘必须使用 引导映像缓存磁盘 资源作为其源来创建
  • 虚拟机的操作系统磁盘大小必须设置为 "[parameters('al').input.disk.size]"
  • 虚拟机的 userData 属性必须设置为 "[parameters('al').input.vm.userData]"
{
    ...
    "resources": [
        {
            "type": "Microsoft.Compute/disks",
            "name": "[variables('diskName')]",
            ...
            "properties": {
                ...
                "creationData": {
                    "createOption": "Copy",
                    "sourceResourceId": "[parameters('al').input.disk.image.diskId]"
                },
                "diskSizeGB": "[parameters('al').input.disk.size]",
                ...
            }
        },
        {
            "type": "Microsoft.Compute/virtualMachines",
            ...
            "dependsOn": [
                "[resourceId('Microsoft.Compute/disks', variables('diskName'))]"
            ],
            ...
            "properties": {
                ...
                "storageProfile": {
                    "osDisk": {
                        ...
                        "createOption": "Attach",
                        "managedDisk": {
                            "id": "[resourceId('Microsoft.Compute/disks', variables('diskName'))]"
                        }
                    },
                    "dataDisks": []
                },
                ...
                "userData": "[parameters('al').input.vm.userData]"
                ...
            }
        }
    ]
    ...
}
<!--NeedCopy-->

计算机输入

输入对象包含 diskvm 属性。

disk.image 属性包含引导映像部署的输出(如果已指定)。否则,它包含 缓存磁盘 部署的输出。disk.size 属性包含磁盘的大小(以 GB 为单位)。

vm.userData 属性包含必须分配给创建的虚拟机的用户数据。

计算机输出

如果指定了分层映像部署,则 计算机 部署的输出将传递到 分层映像 部署。如果您使用的是 分层映像 部署,则必须在输出中包含虚拟机或操作系统磁盘的 ID,以便 分层映像 部署可以引用该虚拟机或操作系统磁盘。

可以指定名为 machineId 的输出来明确告诉 App Layering 要使用哪个虚拟机。如果未指定 machineId 输出,App Layering 会自动添加一个输出并将其设置为部署创建的第一个虚拟机资源的资源 ID。

可以指定名为 ipAddress 的输出来明确告诉 App Layering 使用哪个 IP 地址与计算机通信。如果未指定 ipAddress 输出,App Layering 将使用连接到虚拟机资源的主网卡的主私有地址。

message 可以指定名为的输出来提供一条消息,该消息附加到 App Layering UI 中发布图像任务的最终状态中。此消息仅在未指定分层映像部署时使用。

分层映像

分层映像部署从虚拟机或计算机部署创建的其他资源中创建资源。对于创建哪种类型的资源没有硬性要求。但是,它创建的资源可用作配置服务(例如计算机创建服务 (MCS))的输入。计算库图像资源就是一个很好的例子。

分层映像磁盘要求

  • 创建可供配置服务用来创建虚拟机的资源。

例如,以下代码块使用输入 diskId 作为源创建计算库图像版本。这假设计算机部署包含名为的输出 diskId,该输出设置为计算机操作系统磁盘 ID:

{
    ...
"resources": [
        {
            "type": "Microsoft.Compute/galleries/images",
            "name": "[format('{0}/{1}', variables('galleryName'), variables('name'))]",
            ...
            "resources": [
                {
                    "type": "versions",
                    ...
                    "dependsOn": [
                        "[resourceId('Microsoft.Compute/galleries/images', variables('galleryName'), variables('name'))]"
                    ],
                    ...
                    "properties": {
                        ...
                        "storageProfile": {
                            "osDiskImage": {
                                "source": {
                                    "id": "[parameters('al').input.source.diskId]"
                                }
                            }
                        }
                        ...
                    }
                }
            ]
        }
    ],
    ...
}
<!--NeedCopy-->

分层图像输入

输入对象包含 sourcediskName 属性。 source 表示 计算机 部署的输出,并指定了每个输出的属性。diskName 属性是 App Layering 图像模板中指定的磁盘的名称。

分层图像输出

部署的输出不会传递给任何其他部署。但是,message 可以指定名为的输出来提供一条消息,该消息附加到 App Layering UI 中发布图像任务的最终状态中。

创作 ARM 模板