可以使用 Azure Stack Hub 订阅复制程序 PowerShell 脚本在 Azure Stack Hub 订阅之间、跨 Azure Stack Hub 标记或在 Azure Stack Hub 和 Azure 之间复制资源。 复制脚本读取并重新生成来自不同 Azure 和 Azure Stack Hub 订阅的 Azure 资源管理器的资源。 本文介绍脚本的工作原理、如何使用脚本,并为脚本作提供参考。
可以在 Azure 智能 Edge 模式 GitHub 存储库中找到本文中使用的脚本。 这些脚本位于 订阅复制程序 文件夹中。
订阅复制器概述
Azure 订阅复制器被设计为模块化。 此工具使用协调资源复制的核心处理器。 此外,该工具还支持可自定义的处理器,这些处理器充当复制不同类型的资源的模板。
核心处理器由以下三个脚本组成:
- resource_retriever.ps1 - 生成用于存储输出文件的文件夹。 
- 将上下文设置为源订阅。 
- 检索资源并将其传递给 resource_processor.ps1。 
 
- resource_processor.ps1 - 处理 resource_retriever.ps1传入的资源。 
- 确定要使用的自定义处理器并传递资源。 
 
- post_process.ps1 - 后处理自定义处理器生成的输出,以便准备将其部署到目标订阅。 
- 生成部署代码以部署目标订阅中的资源。 
 
这三个脚本以标准方式控制信息流,以实现更大的灵活性。 例如,添加对其他资源的支持不需要更改核心处理器中的任何代码。
上面提到的自定义处理器是 ps1 决定如何处理特定类型的资源的文件。 自定义处理器的名称始终使用资源中的类型数据进行命名。 例如,假设 $vm 保存虚拟机对象,运行 $vm。类型将产生 Microsoft.Compute/virtualMachines。 这意味着,虚拟机的处理器将命名 virtualMachines_processor.ps1,名称必须与资源元数据中显示的完全一样,就像核心处理器确定要使用的自定义处理器的方式一样。
自定义处理器通过确定哪些信息很重要并指示如何从资源元数据中提取该信息,来决定如何复制资源。 然后,自定义处理器获取所有提取的数据,并使用它生成参数文件,该文件将与 Azure 资源管理器模板结合使用,以在目标订阅中部署资源。 post_process.ps1处理后,此参数文件存储在 Parameter_Files 中。
复制程序文件结构中有一个名为 Standardized_ARM_Templates的文件夹。 根据源环境,部署将使用其中一个标准化的 Azure 资源管理器模板,或者必须生成自定义的 Azure 资源管理器模板。 在这种情况下,自定义处理器必须调用 Azure 资源管理器模板生成器。 在前面的示例中,虚拟机的 Azure 资源管理器模板生成器的名称将命名 为virtualMachines_ARM_Template_Generator.ps1。 Azure 资源管理器模板生成器负责根据资源元数据中的信息创建自定义 Azure 资源管理器模板。 例如,如果虚拟机资源具有指定它是可用性集成员的元数据,Azure 资源管理器模板生成器将创建一个 Azure 资源管理器模板,其中包含指定虚拟机所属的可用性集 ID 的代码。 这样,当虚拟机部署到新订阅时,它会在部署时自动添加到可用性集中。 这些自定义的 Azure 资源管理器模板存储在Custom_ARM_Templates文件夹中,位于Standardized_ARM_Templates文件夹内。 post_processor.ps1 负责确定部署是应该使用标准化的 Azure 资源管理器模板还是自定义模板并生成相应的部署代码。
脚本 post-process.ps1 负责清理参数文件,并创建用户将用于部署新资源的脚本。 在清理阶段,脚本会将对源订阅 ID、租户 ID 和位置的所有引用替换为相应的目标值。 然后将参数文件输出到 Parameter_Files 文件夹中。 然后,它确定正在处理的资源是否使用自定义的 Azure 资源管理器模板,并生成相应的部署代码,该代码利用 New-AzResourceGroupDeployment cmdlet。 然后,将部署代码添加到存储在Deployment_Files文件夹中的名为DeployResources.ps1 的文件。 最后,该脚本确定资源所属的资源组,并检查 DeployResourceGroups.ps1 脚本,以查看部署该资源组的部署代码是否已存在。 如果没有,则它会将代码添加到该脚本以部署资源组,如果这样做,它将不执行任何作。
动态 API 检索
该工具内置了动态 API 检索,以便源订阅中可用的最新资源提供程序 API 版本用于部署目标订阅中的资源:
               
              
            
resource_processor.ps1中的图 API 检索。
但是,目标订阅的资源提供程序 API 版本可能早于源订阅,并且不支持从源订阅提供的版本。 在这种情况下,运行部署时将引发错误。 若要解决此问题,请更新目标订阅中的资源提供程序以匹配源订阅中的资源提供程序。
并行部署
该工具需要一个名为 parallel 的参数。 此参数采用一个布尔值,该值指定是否应并行部署检索的资源。 如果该值设置为 true,则每次调用 New-AzResourceGroupDeployment 时都将使用 -asJob 标志,并在资源部署集之间根据资源类型添加代码块,以等待并行作业完成。 它可确保在部署下一种类型的资源之前已全部部署一种类型的资源。 如果 并行 参数值设置为 false,则所有资源都将以串行方式部署。
添加其他资源类型
添加新的资源类型很简单。 开发人员必须创建自定义处理器和 Azure 资源管理器模板或 Azure 资源管理器模板生成器。 开发人员完成该步骤后,必须将资源类型添加到 $resourceType 参数的 ValidateSet 并添加到 resource_retriever.ps1 中的 $resourceTypes 数组。 将资源类型添加到 $resourceTypes 数组时,必须按正确的顺序添加它。 数组的顺序决定了资源将部署的顺序,因此请记住依赖项。 最后,如果自定义处理器使用 Azure 资源管理器模板生成器,则必须将资源类型名称添加到 post_process.ps1中的$customTypes数组。
运行 Azure 订阅复制程序
若要运行 Azure 订阅复制器(v3)工具,需要启动 resource_retriever.ps1,并提供所有参数。 resourceType 参数可以选择“全部”而不是一种资源类型。 如果选择“ 全部 ”,resource_retriever.ps1 将按顺序处理所有资源,以便在部署运行时首先部署依赖资源。 例如,在虚拟机之前部署 VNet,因为虚拟机需要 VNet 才能正确部署。
执行完脚本后,将有三个新文件夹, Deployment_Files、 Parameter_Files和 Custom_ARM_Templates。
注释
运行任何生成的脚本之前,必须设置正确的环境并登录到目标订阅(在新的 Azure Stack Hub for ex 中),并将工作目录设置为 Deployment_Files 文件夹。
Deployment_Files将保存两 个文件DeployResourceGroups.ps1 和 DeployResources.ps1。 执行 DeployResourceGroups.ps1 将部署资源组。 执行 DeployResources.ps1 将部署已处理的所有资源。 如果使用 All 或 Microsoft.Compute/virtualMachines 作为资源类型执行该工具,DeployResources.ps1 将提示用户输入虚拟机管理员密码,该密码将用于创建所有虚拟机。
Example
- 运行脚本。   - 注释 - 不要忘记配置 PS 实例的源环境和订阅上下文。 
- 查看新创建的文件夹:   
- 将上下文设置为目标订阅,将文件夹更改为 Deployment_Files,部署资源组(运行 DeployResourceGroups.ps1 脚本),然后启动资源部署(运行 DeployResources.ps1 脚本)。   
- 运行 - Get-Job以检查状态。 Get-Job |Receive-Job 将返回结果。
清理
在 replicatorV3 文件夹中,有一个名为 cleanup_generated_items.ps1 的文件 - 它将删除 Deployment_Files、 Parameter_Files和 Custom_ARM_Templates 文件夹及其所有内容。
订阅复制操作
Azure 订阅复制器(v3)当前可以复制以下资源类型:
- Microsoft.Compute/availabilitySets 
- Microsoft.Compute/virtualMachines 
- Microsoft.Network/loadBalancers 
- Microsoft.Network/networkSecurityGroups 
- Microsoft.Network/publicIPAddresses 
- Microsoft.Network/routeTables 
- Microsoft.Network/virtualNetworks 
- Microsoft.Network/virtualNetworkGateways 
- Microsoft.Storage/storageAccounts 
当以 “全部” 作为资源类型运行该工具时,复制和部署时将遵循以下顺序(在下面,所有资源都复制了其配置,例如 SKU、产品/服务等):
- Microsoft.Network/virtualNetworks - 复制:- 所有地址空间 - 所有子网
 
- Microsoft.Network/virtualNetworkGateways - 复制:- 公共 IP 配置 - 子网配置 - VPN 类型 - 网关类型
 
- Microsoft.Network/routeTables 
- Microsoft.Network/networkSecurityGroups - 复制: - 所有安全规则入站和出站
 
- Microsoft.Network/publicIPAddresses 
- Microsoft.Network/loadBalancers - 复制:- 专用 IP 地址 - 公共 IP 地址配置 - 子网配置
 
- Microsoft.Compute/availabilitySets - 复制:- 故障域数 - 更新域数
 
- Microsoft.Storage/storageAccounts 
- Microsoft.Compute/virtualMachines - 副本:
 - 数据磁盘(不含数据)
 - 虚拟机大小
 -操作系统
 - 诊断存储帐户配置
 - 公共 IP 配置
 - 网络接口
 - 网络接口专用 IP 地址
 - 网络安全组配置
 - 可用性集配置
 
- 副本:
注释
仅为 OS 磁盘和数据磁盘创建托管磁盘。 目前不支持使用存储帐户
局限性
只要目标订阅的资源提供程序支持从源订阅复制的所有资源和选项,该工具就可以将资源从一个订阅复制到另一个订阅。
若要确保复制成功,请确保目标订阅的资源提供程序版本与源订阅的版本匹配。
从商业 Azure 复制到商业 Azure 或从 Azure Stack Hub 中的一个订阅复制到同一 Azure Stack Hub 中的另一个订阅时,复制存储帐户时会出现问题。 这是因为存储帐户命名要求所有存储帐户名称在所有商业 Azure 中唯一,或者在 Azure Stack Hub 区域/实例上的所有订阅中都是唯一的。 跨不同 Azure Stack Hub 实例复制存储帐户会成功,因为堆栈是单独的区域/实例。