你可以使用 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的文件夹。 根据源环境,部署使用这些标准化资源管理器模板之一,或者可能需要生成自定义资源管理器模板。 在这种情况下,自定义处理器必须调用资源管理器模板模板生成器。 在前面的示例中,虚拟机的资源管理器模板生成器的名称 virtualMachines_ARM_Template_Generator.ps1。 资源管理器模板生成器负责根据资源元数据中的信息创建自定义资源管理器模板。 例如,如果虚拟机资源具有指定它是可用性集成员的元数据,资源管理器模板生成器会创建一个资源管理器模板,其中包含指定虚拟机所属的可用性集 ID 的代码。 这样,当虚拟机部署到新订阅时,它会在部署时自动添加到可用性集中。 这些自定义的资源管理器模板存储在位于 Standardized_ARM_Templates 文件夹中的 Custom_ARM_Templates 文件夹内。 post_processor.ps1 脚本负责确定部署是应该使用标准化资源管理器模板还是自定义模板并生成相应的部署代码。
脚本 post-process.ps1 负责清理参数文件,并创建用户用于部署新资源的脚本。 在清理阶段,脚本会将对源订阅 ID、租户 ID 和位置的所有引用替换为相应的目标值。 然后将参数文件输出到 Parameter_Files 文件夹中。 然后,它确定正在处理的资源是否使用自定义资源管理器模板,并生成相应的部署代码,该代码使用 New-AzResourceGroupDeployment cmdlet。 然后,将部署代码添加到存储在Deployment_Files文件夹中的名为DeployResources.ps1 的文件。 最后,该脚本确定资源所属的资源组,并检查 DeployResourceGroups.ps1 脚本,以查看部署该资源组的部署代码是否已存在。 如果没有,该脚本会将代码添加到该脚本以部署资源组。 如果这样做,脚本将不执行任何操作。
动态 API 检索
该工具包括动态 API 检索,因此它使用源订阅中可用的最新资源提供程序 API 版本来部署目标订阅中的资源:
但是,目标订阅可能具有较旧的资源提供程序 API 版本,该版本不支持源订阅提供的版本。 在这种情况下,执行部署时会出现错误。 若要解决此错误,请更新目标订阅中的资源提供程序以匹配源订阅中的资源提供程序。
并行部署
该工具需要一个名为 parallel 的参数。 此参数采用一个布尔值,该值指定是否并行部署检索到的资源。 如果将值设置为 true,则每次对 New-AzResourceGroupDeployment 的调用都包含 -asJob 标志。 此过程会根据资源类型,在各组资源部署之间添加用于等待并行作业完成的代码块。 它可确保在部署下一种类型的资源之前部署一种类型的所有资源。 如果将 并行 参数值设置为 false,则会以串行方式部署资源。
添加其他资源类型
添加新的资源类型很简单。 创建自定义处理器和资源管理器模板或资源管理器模板生成器。 完成这些步骤后,请将资源类型添加到 $resourceType 参数的 ValidateSet 和 resource_retriever.ps1中的 $resourceTypes 数组。 将资源类型添加到 $resourceTypes 数组时,按正确的顺序添加它。 数组的顺序决定了资源部署的顺序,因此请记住依赖项。 最后,如果自定义处理器使用资源管理器模板生成器,请将资源类型名称添加到 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中)。 将工作目录设置为 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实例成功复制存储帐户,因为堆栈是单独的区域或实例。