编写 ARM 模板
本节适用于熟悉 ARM 模板的用户。它提供了有关为 App Layering Azure Deployments 连接器编写模板的详细信息。有关常规 ARM 模板编写信息,请参阅 Microsoft 文档。
输入
每种部署类型都会传递一个参数,即名为
al 的对象。此对象具有两个属性:input 和 context。input 属性是特定于每种部署类型的对象,其属性会根据部署类型而变化。context 属性对于所有部署类型都是相同的。它包含有关 App Layering 任务、项目(层或映像模板)以及与当前部署关联的连接器配置的数据。有关参数对象的详细信息,请参阅 Azure 部署模板参数。
每个模板都必须在其参数部分声明
al 参数,如下所示:
{
...
"parameters": {
"al": {
"type": "object"
}
},
...
}
模板可以声明更多参数,但所有参数都必须具有默认值。否则,App Layering 不会为其提供值。这对于使用只能在参数的默认值部分使用的函数很有用,例如
utcNow。
输出
所有 ARM 模板都可以有输出。借助 Azure Deployments 连接器,模板输出可用于将信息传递给下一个部署。它们还可以用于覆盖某些默认行为。
例如,当 Cache Disk 部署具有以下输出时:
{
...
"outputs": {
"generation": {
"type": "string",
"value": "[variables('generation')]"
},
"name": {
"type": "string",
"value": "[variables('name')]"
},
}
...
}
Boot Image 部署接收此输入:
{
"input":
{
"type": "BootImage",
"source": {
"generation": "V2",
"name": "MyCoolDiskName"
}
},
"context": {
...
}
}
请注意,
input 对象的 source 属性为 Cache Disk 部署模板指定的每个输出都包含一个属性。每个输出的来源取决于部署类型。
部署类型详细信息
每种部署类型都有一组不同的输入和输出,可以改变 App Layering 操作的行为。本节介绍了这些特定于部署的详细信息。
有关使用所有这些概念的实际示例,请参阅 Starter Templates。
缓存磁盘
缓存磁盘部署必须创建托管磁盘资源。除了磁盘之外,您还可以选择创建其他资源。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]"
}
...
}
}
]
...
}
缓存磁盘输入
缓存磁盘输出
如果指定了部署的输出,则将其传递给启动映像部署。否则,它将传递给计算机部署。
可以指定名为
diskId 的输出,以明确告知 App Layering 要使用的磁盘。如果未指定 diskId 输出,App Layering 会自动添加一个,并将其设置为部署创建的第一个托管磁盘资源的资源 ID。由 diskId 指定的磁盘将上传 App Layering 合成引擎启动映像。
启动映像
此部署从缓存磁盘部署创建的托管磁盘创建资源。对于创建何种类型的资源没有严格要求。但是,它必须创建一个可用作创建 VM 时 OS 磁盘源的资源,例如计算库映像版本。
启动映像磁盘要求
-
必须创建一个资源,该资源可用于创建虚拟机操作系统磁盘,其内容与作为输入传入的 ID 磁盘内容相同。
例如,一个计算库镜像版本使用输入
diskId 作为源:
{
...
"resources": [
{
"type": "Microsoft.Compute/galleries/images/versions",
...
"properties": {
...
"storageProfile": {
"osDiskImage": {
"source": {
"id": "[parameters('al').input.source.diskId]"
}
}
}
...
}
}
]
...
}
启动映像输入
启动映像输出
启动映像 部署的输出将传递给 计算机 部署。没有特殊或必需的输出。但是,您必须包含从创建的资源(例如资源 ID)创建虚拟机所需的数据。
计算机
计算机 部署必须创建一个虚拟机资源。虚拟机必须连接到一个网络,在该网络上它可以访问 App Layering 设备,反之亦然,具体请参阅 合成计算机的防火墙端口内部连接。
重要提示:
不要将 缓存磁盘 部署创建的磁盘附加到虚拟机。缓存磁盘 是共享资源,被视为只读。如果不使用 启动映像 部署,请创建磁盘副本并将其附加。
计算机要求
-
必须创建虚拟机资源
-
虚拟机必须连接到允许与 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]"
...
}
}
]
...
}
机器输入
disk.image 属性包含 启动映像 部署的输出(如果已指定)。否则,它包含 缓存磁盘 部署的输出。disk.size 属性包含磁盘大小(以 GB 为单位)。
vm.userData 属性包含必须分配给所创建虚拟机的用户数据。
机器输出
如果指定了 机器 部署,其输出将传递给 分层映像 部署。如果您正在使用 分层映像 部署,则必须在输出中包含 VM 或操作系统磁盘的 ID,以便 分层映像 部署可以引用它。
可以指定名为
machineId 的输出,以明确告知 App Layering 要使用哪个虚拟机。如果未指定 machineId 输出,App Layering 会自动添加一个,并将其设置为部署创建的第一个虚拟机资源的资源 ID。
可以指定名为
ipAddress 的输出,以明确告知 App Layering 使用哪个 IP 地址与机器通信。如果未指定 ipAddress 输出,App Layering 将使用附加到虚拟机资源的主网卡的主私有地址。
可以指定名为
message 的输出,以提供一条消息,该消息将附加到发布映像任务的最终状态以及 App Layering UI 中层创建任务的所需操作状态。如果未指定 分层映像 部署,则此消息仅用于映像发布任务的最终状态。
-
机器启动器模板 将
message输出参数设置为 Azure 门户中机器的链接。
分层映像
分层映像 部署从虚拟机或 机器 部署创建的其他资源创建资源。对于创建何种类型的资源没有严格要求。但是,它会创建一个可用作预配服务(例如 Machine Creation Services™ (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]"
}
}
}
...
}
}
]
}
],
...
}
分层映像输入
输入对象 包含
source 和 diskName 属性。source 表示 机器 部署的输出,其中为每个指定的输出提供了一个属性。diskName 属性是 App Layering 映像模板中指定的磁盘名称。
分层映像输出
部署的输出不会传递给任何其他部署。但是,可以指定名为
message 的输出,以提供一条消息,该消息将附加到 App Layering UI 中发布映像任务的最终状态。