練習 - 使用課程模組將資源部署至多個範圍
注意
此練習需要 Azure 訂用帳戶。 如果沒有,您可以取得免費的訂用帳戶。
R&D 小組已要求您提供協助,以在 Project Teddybear 訂用帳戶中建立虛擬網路。 您知道您將會在未來協助具有更多訂用帳戶的小組,因此您決定擴充可重複使用的 Bicep 範本,以部署要供小組成員使用的虛擬網路。
在此練習中,您將更新您在上一個練習中開始建置的範本。
在此過程中,您將會:
- 更新訂用帳戶範圍的範本,以建立新的資源群組。
- 使用虛擬網路建立個別的 Bicep 模組,並使用參數來控制如何設定虛擬網路。
- 更新範本以將模組部署至資源群組。
- 部署範本。
此練習需要您擁有部署訂用帳戶範圍資源的權限。 如果您無法使用目前的 Azure 帳戶來滿足這些需求,可以取得免費的試用版,並建立新的 Azure 訂用帳戶和租用戶。 或者,您也可以略過此練習中的部署步驟。
建立資源群組
在 Visual Studio Code 中,開啟您在先前練習中建立的 main.bicep 檔案。
在目前變數定義下方,新增下列變數定義:
var resourceGroupName = 'ToyNetworking'
在檔案底端,新增下列資源定義:
resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = { name: resourceGroupName location: deployment().location }
請注意,您正要定義資源群組,就像您定義另一個資源一樣。 資源群組是訂用帳戶範圍資源,可以在
targetScope
設定為subscription
的 Bicep 檔案中進行部署和管理。儲存對檔案所做的變更。
新增模組以建立虛擬網路
接下來,您將為 R&D 小組的虛擬交換器建立 Bicep 模組。 稍後在此練習中,您會將模組中的資源部署至資源群組。
在 Visual Studio Code 中,於 main.bicep 檔案建立所在的相同資料夾中建立名為 modules 的新資料夾。
在 modules 資料夾中,建立並儲存名為 virtualNetwork.bicep 的檔案。
在 virtualNetwork.bicep 檔案中,新增下列內容:
param virtualNetworkName string param virtualNetworkAddressPrefix string resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = { name: virtualNetworkName location: resourceGroup().location properties: { addressSpace: { addressPrefixes: [ virtualNetworkAddressPrefix ] } } }
請注意,您未針對此課程模組指定
targetScope
。 當 Bicep 檔案以資源群組為目標時,您不需要指定目標範圍。儲存對檔案所做的變更。
在訂用帳戶部署中使用模組
現在您已準備好告訴 Bicep 將模組部署到資源群組。
在 Visual Studio Code 的main.bicep 檔案中,於
targetScope
行底下新增下列參數定義:param virtualNetworkName string param virtualNetworkAddressPrefix string
這些參數可讓範本重複使用。 每當 R&D 小組需要新的訂用帳戶時,您都可以建立具有唯一名稱和 IP 位址範圍的虛擬網路。
在檔案底端,新增下列模組定義:
module virtualNetwork 'modules/virtualNetwork.bicep' = { scope: resourceGroup name: 'virtualNetwork' params: { virtualNetworkName: virtualNetworkName virtualNetworkAddressPrefix: virtualNetworkAddressPrefix } }
請注意,您正要明確地指定模組的
scope
。 Bicep 了解模組內的資源應該部署到您稍早在檔案中建立的資源群組。
驗證範本
您的 main.bicep 檔案看起來應該像下面這樣:
targetScope = 'subscription'
param virtualNetworkName string
param virtualNetworkAddressPrefix string
var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'
var resourceGroupName = 'ToyNetworking'
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
name: policyDefinitionName
properties: {
policyType: 'Custom'
mode: 'All'
parameters: {}
policyRule: {
if: {
allOf: [
{
field: 'type'
equals: 'Microsoft.Compute/virtualMachines'
}
{
anyOf: [
{
field: 'Microsoft.Compute/virtualMachines/sku.name'
like: 'Standard_F*'
}
{
field: 'Microsoft.Compute/virtualMachines/sku.name'
like: 'Standard_G*'
}
]
}
]
}
then: {
effect: 'deny'
}
}
}
}
resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
name: policyAssignmentName
properties: {
policyDefinitionId: policyDefinition.id
}
}
resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
name: resourceGroupName
location: deployment().location
}
module virtualNetwork 'modules/virtualNetwork.bicep' = {
scope: resourceGroup
name: 'virtualNetwork'
params: {
virtualNetworkName: virtualNetworkName
virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
}
}
您的 modules/virtualNetwork.bicep 檔案看起來應該像下面這樣:
param virtualNetworkName string
param virtualNetworkAddressPrefix string
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
name: virtualNetworkName
location: resourceGroup().location
properties: {
addressSpace: {
addressPrefixes: [
virtualNetworkAddressPrefix
]
}
}
}
如果任一檔案都未符合範例,請複製範例或是調整您的範本。
將範本部署至 Azure
在 Visual Studio Code 終端中,透過使用下列 Azure CLI 命令來部署範本:
templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today
virtualNetworkName="rnd-vnet-001"
virtualNetworkAddressPrefix="10.0.0.0/24"
az deployment sub create \
--name $deploymentName \
--location westus \
--template-file $templateFile \
--parameters virtualNetworkName=$virtualNetworkName \
virtualNetworkAddressPrefix=$virtualNetworkAddressPrefix
在 Visual Studio Code 終端機中,透過使用下列 Azure PowerShell 命令部署範本:
$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"
$virtualNetworkName = 'rnd-vnet-001'
$virtualNetworkAddressPrefix = '10.0.0.0/24'
New-AzSubscriptionDeployment `
-Name $deploymentName `
-Location westus `
-TemplateFile $templateFile `
-virtualNetworkName $virtualNetworkName `
-virtualNetworkAddressPrefix $virtualNetworkAddressPrefix
請注意,您要傳入 virtualNetworkName
和 virtualNetworkAddressPrefix
參數的值。 當另一個 R&D 小組要求您為他們準備訂用帳戶時,您將能夠變更這些值,為該小組提供自己的虛擬網路。
部署可能需要一到兩分鐘的時間才能完成,然後您會看到成功的部署。
檢查部署
現在您將檢查資源群組,以及模組所建立的部署。
前往 Azure 入口網站。
在左窗格中,選取 [資源群組]。 請注意,已建立 ToyNetworking 資源群組。
選取 ToyNetworking 資源群組。 請注意,模組已成功部署至資源群組,且已建立虛擬網路:
清除資源
您已成功部署訂用帳戶範圍資源,包括資源群組,且您已使用模組,將資源部署至您所建立的資源群組。 您可以移除您已建立的原則資源和資源群組。
警告
此命令會永久刪除名為 ToyNetworking 的資源群組及其所有資源。 如果您已將任何其他資源部署到此資源群組,您應該略過此步驟。
subscriptionId=$(az account show --query 'id' --output tsv)
az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
az group delete --name ToyNetworking
$subscriptionId = (Get-AzContext).Subscription.Id
Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId
Remove-AzResourceGroup -Name ToyNetworking