使用 Azure Stack Hub 訂用帳戶複寫器來複寫資源
您可以使用 Azure Stack Hub 訂閱複寫器的 PowerShell 指令碼,在 Azure Stack Hub 訂閱之間、在 Azure Stack Hub 戳記之間,或在 Azure Stack Hub 和 Azure 之間複製資源。 複寫器指令碼會從不同的 Azure 和 Azure Stack Hub 訂用帳戶讀取和重建 Azure Resource Manager 資源。 本文將探討指令碼的運作方式、如何使用指令碼,並提供指令碼作業的參考。
您可以在 Azure 智慧邊緣模式 GitHub 存放庫中找到本文中使用的指令碼。 這些指令碼位於訂用帳戶複寫器資料夾中。
訂用帳戶複寫器概觀
Azure 訂閱複寫器是設計作為模組化使用。 此工具會使用核心處理器來協調資源的複寫。 此外,此工具還支援可自訂的處理器,以作為用來複製不同資源類型的範本。
核心處理器由下列三個指令碼組成:
resource_retriever.ps1
產生資料夾來儲存輸出檔案。
將內容設定為來源訂用帳戶。
擷取資源,並將其傳遞至 resource_processor.ps1。
resource_processor.ps1
處理 resource_retriever.ps1 所傳入的資源。
決定所要使用的自訂處理器,並傳遞資源。
post_process.ps1
對自訂處理器產生的輸出進行後續處理,使其準備好部署到目標訂用帳戶中。
產生部署程式碼,以將資源部署到目標訂用帳戶中。
這三個指令碼會以標準方式控制資訊的流動,以實現更大的彈性。 例如,只要新增對於其他資源的支援,就不必變更核心處理器中的任何程式碼。
上述自訂處理器是 ps1
檔案,這些檔案會指出特定資源類型的處理方式。 自訂處理器的名稱一律會使用資源中的類型資料來加以命名。 例如,假設 $vm
保有虛擬機器物件,則執行 $vm
.Type 就會產生 Microsoft.Compute/virtualMachines
。 也就是說,虛擬機器的處理器會命名為 virtualMachines_processor.ps1
,此名稱必須與資源中繼資料內所顯示的名稱完全相同,因為核心處理器會以這種方式判斷所要使用的自訂處理器。
自訂處理器會指出資源的複寫方式,其採用的方法是判斷哪項資訊很重要,並指出要如何從資源中繼資料內提取出該資訊。 自訂處理器接著會取得所有已擷取的資料,並使用該資料來產生參數檔案,以供與 Azure Resource Manager 範本搭配使用,而將資源部署到目標訂用帳戶中。 這個參數檔案在經過 post_process.ps1 進行後續處理後,便會儲存在 Parameter_Files 中。
複寫器檔案結構中有一個資料夾名為 Standardized_ARM_Templates。 根據來源環境而定,部署會使用其中一個已標準化的 Azure Resource Manager 範本,否則就必須產生自訂的 Azure Resource Manager 範本。 在此情況下,自訂處理器必須呼叫 Azure Resource Manager 範本產生器。 在前面開始的範例中,虛擬機器的 Azure Resource Manager 範本產生器名稱會命名為 virtualMachines_ARM_Template_Generator.ps1。 Azure Resource Manager 範本產生器會負責根據資源中繼資料內所存在的資訊來建立自訂的 Azure Resource Manager 範本。 例如,如果虛擬機器資源的中繼資料指定該資源本身是可用性設定組的成員,則 Azure Resource Manager 範本產生器將會建立 Azure Resource Manager 範本,而在建立範本時所使用的程式碼會指定虛擬機器所屬可用性設定組的識別碼。 如此一來,當虛擬機器部署到新的訂用帳戶時,虛擬機器便會在部署時自動新增至可用性設定組。 這些自訂的 Azure Resource Manager 範本會儲存在位於 Standardized_ARM_Templates 資料夾內的 Custom_ARM_Templates 資料夾中。 post_processor.ps1 會負責判斷部署應該使用已標準化的 Azure Resource Manager 範本還是自訂的範本,並產生對應的部署程式碼。
post-process.ps1 指令碼會負責清除參數檔案,以及建立指令碼供使用者部署新資源。 在清除階段,指令碼會將來源訂用帳戶識別碼、租用戶識別碼和位置的所有參照,取代為對應的目標值。 然後,指令碼會再將參數檔案輸出至 Parameter_Files 資料夾。 然後,指令碼會判斷所要處理的資源是否使用自訂的 Azure Resource Manager 範本,並產生對應的部署程式碼,其所利用的是 New-AzResourceGroupDeployment Cmdlet。 部署程式碼隨即會新增至儲存在 Deployment_Files 資料夾中、名為 DeployResources.ps1 的檔案內。 最後,指令碼會判斷資源所屬的資源群組,並檢查 DeployResourceGroups.ps1 指令碼,以確認用來部署該資源群組的部署程式碼是否已經存在。 如果不存在,則會將程式碼新增至該指令碼中以部署資源群組,如果存在,則不會執行任何動作。
動態 API 擷取
此工具內建了動態 API 擷取,因此會使用來源訂用帳戶中可用的最新資源提供者 API 版本,在目標訂用帳戶中部署資源:
resource_processor.ps1 中的圖表 API 擷取。
不過,目標訂用帳戶的資源提供者 API 版本還是有可能比來源訂用帳戶的資源提供者 API 版本還舊,且不支援來源訂用帳戶所提供的版本。 在此情況下,部署一執行時,系統就會擲回錯誤。 若要解決此問題,請更新目標訂用帳戶中的資源提供者,使其符合來源訂用帳戶中的資源提供者。
平行部署
此工具需要名為 parallel 的參數。 這個參數會採用布林值,指定是否應該以平行方式部署所擷取的資源。 如果此值設定為 true,則每次的 New-AzResourceGroupDeployment 呼叫都會有 -asJob 旗標,而且會根據資源類型在資源部署集合之間加入要等待平行作業完成的程式碼區塊。 其可確保某個類型的所有資源都已部署完成後,才部署下一個類型的資源。 如果 parallel 參數值設定為 false,則資源全都會以序列方式來部署。
新增其他資源類型
新增資源類型很簡單。 開發人員必須建立自訂處理器,以及 Azure Resource Manager 範本或 Azure Resource Manager 範本產生器。 上述動作完成後,開發人員還必須將資源類型新增至 $resourceType 參數的 ValidateSet,以及 resource_retriever.ps1 中的 $resourceTypes 陣列。 在將資源類型新增至 $resourceTypes 陣列時,必須以正確順序新增。 陣列順序會決定資源的部署順序,因此要考慮到相依性。 最後,如果自訂處理器利用 Azure Resource Manager 範本產生器,則必須將資源類型名稱新增至 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 則會部署所有已處理的資源。 在以 [全部] 或 [Microsoft.Compute/virtualMachines] 作為資源類型來執行此工具的情況下,DeployResources.ps1 會提示使用者輸入虛擬機器系統管理員密碼,以供用來建立所有虛擬機器。
範例
執行指令碼。
注意
別忘了為 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 執行個體來複寫儲存體帳戶則會成功,因為 Stack 是不同的區域/執行個體。