教學課程:了解如何使用 Azure PowerShell 來管理 Windows 虛擬機器
將資源部署至 Azure 時,您有極大的彈性可決定所要部署的資源類型、資源所在之處,以及如何設定資源。 不過,此種彈性可能會使得組織所擁有的選項超出您的規劃。 當您考慮將資源部署至 Azure 時,可能會思考下列問題:
- 如何符合某些國家/地區中資料主權的法律需求?
- 如何控制成本?
- 如何確保他人不會不慎變更重要系統?
- 如何追蹤資源成本並準確地計費?
本文可解決這些問題。 具體而言,您可以:
- 將使用者指派給角色,並將角色指派給範圍,讓使用者有權限能夠執行預期的動作,但僅止於此。
- 針對訂用帳戶中的資源,套用規定慣例的原則。
- 鎖定系統不可或缺的資源。
- 標記資源,讓您可以依照對組織有意義的價值來追蹤資源。
本文著重於實作治理所要進行的工作。 如需更廣泛的概念討論,請參閱 Azure 中的治理。
啟動 Azure Cloud Shell
Azure Cloud Shell 是免費的互動式 Shell,可讓您用來執行本文中的步驟。 它具有預先安裝和設定的共用 Azure 工具,可與您的帳戶搭配使用。
若要開啟 Cloud Shell,只要選取程式碼區塊右上角的 [試試看] 即可。 您也可以移至 https://shell.azure.com/powershell ,從另一個瀏覽器索引標籤啟動 Cloud Shell。 選取 [複製] 即可複製程式碼區塊,將它貼到 Cloud Shell 中,然後按 enter 鍵加以執行。
了解範圍
在建立任何項目之前,讓我們先檢閱範圍的概念。 Azure 提供四個管理層級:管理群組、訂用帳戶、資源群組和資源。 管理群組是預覽版本。 下圖顯示這些層級的範例。
您可以在任何範圍層級套用管理設定。 您所選層級會判斷套用設定的範圍。 較低層級會繼承較高層級中的設定。 當您將設定套用到訂用帳戶時,訂用帳戶中的所有資源群組和資源都會套用該設定。 當您在資源群組上套用設定時,資源群組及其所有資源都會套用該設定。 不過,另一個資源群組沒有該設定。
通常我們會在較高層級套用重要設定,而在較低層級套用專案特定需求。 例如,您可能想要確定組織的所有資源都部署到特定區域。 若要完成這項需求,將原則套用至訂用帳戶,該訂用帳戶會指定允許的位置。 當貴組織中其他使用者新增新的資源群組和資源時,會自動強制執行允許的位置。
在本教學課程中,您會將所有的管理設定套用到資源群,讓您可以在完成後輕易地移除這些設定。
先來建立該資源群組。
New-AzResourceGroup -Name myResourceGroup -Location EastUS
目前資源群組是空的。
Azure 角色型存取控制
您想要確定組織中的使用者具有這些資源的正確存取權等級。 您不想要授與不受限制的存取權給使用者,但是您又必須確定他們可以執行其工作。 Azure 角色型存取控制 (Azure RBAC) 可讓您管理哪些使用者具有權限可以在一個範圍內完成特定動作。
若要建立和移除角色指派,使用者必須具有 Microsoft.Authorization/roleAssignments/*
存取權。 此存取權是透過擁有者或使用者存取系統管理員角色來授與。
為了管理虛擬機器解決方案,有三個資源專屬角色可提供您經常需要的存取權:
相較於將角色指派給個別使用者,使用 Azure Active Directory 群組來含括需要執行類似動作的使用者,通常會較為容易。 然後,將該群組指派給適當的角色。 在本文中,請使用現有的群組來管理虛擬機器,或使用入口網站來建立 Azure Active Directory 群組。
建立新群組或找到現有群組後,請使用 New-AzRoleAssignment 命令,將 Azure Active Directory 群組指派給資源群組的虛擬機器參與者角色。
$adgroup = Get-AzADGroup -DisplayName <your-group-name>
New-AzRoleAssignment -ObjectId $adgroup.id `
-ResourceGroupName myResourceGroup `
-RoleDefinitionName "Virtual Machine Contributor"
如果您收到錯誤,指出 主體 < guid > 不存在於目錄中,則新群組尚未傳播至整個 Azure Active Directory。 請嘗試再次執行命令。
通常您需要針對網路參與者和儲存體帳戶參與者重複進行此程序,以確保已指派使用者來管理已部署的資源。 在本文中,您可以略過這些步驟。
Azure 原則
Azure 原則可協助您確認訂用帳戶中的所有資源均符合公司標準。 您的訂用帳戶已經有數個原則定義。 若要查看可用的原則定義,請使用 Get-AzPolicyDefinition 命令:
(Get-AzPolicyDefinition).Properties | Format-Table displayName, policyType
您會看到現有的原則定義。 原則類型不是內建就是自訂。 查看定義,尋找符合您要指派之條件的定義。 在本文中,您指派的原則要:
- 限制所有資源的位置。
- 限制虛擬機器的 SKU。
- 稽核未使用受控磁碟的虛擬機器。
在下列範例中,您會根據顯示名稱擷取三個原則定義。 您使用 New-AzPolicyAssignment 命令將這些定義指派給資源群組。 針對某些原則,您要提供參數值來指定允許的值。
# Values to use for parameters
$locations ="eastus", "eastus2"
$skus = "Standard_DS1_v2", "Standard_E2s_v2"
# Get the resource group
$rg = Get-AzResourceGroup -Name myResourceGroup
# Get policy definitions for allowed locations, allowed SKUs, and auditing VMs that don't use managed disks
$locationDefinition = Get-AzPolicyDefinition | where-object {$_.properties.displayname -eq "Allowed locations"}
$skuDefinition = Get-AzPolicyDefinition | where-object {$_.properties.displayname -eq "Allowed virtual machine size SKUs"}
$auditDefinition = Get-AzPolicyDefinition | where-object {$_.properties.displayname -eq "Audit VMs that do not use managed disks"}
# Assign policy for allowed locations
New-AzPolicyAssignment -Name "Set permitted locations" `
-Scope $rg.ResourceId `
-PolicyDefinition $locationDefinition `
-listOfAllowedLocations $locations
# Assign policy for allowed SKUs
New-AzPolicyAssignment -Name "Set permitted VM SKUs" `
-Scope $rg.ResourceId `
-PolicyDefinition $skuDefinition `
-listOfAllowedSKUs $skus
# Assign policy for auditing unmanaged disks
New-AzPolicyAssignment -Name "Audit unmanaged disks" `
-Scope $rg.ResourceId `
-PolicyDefinition $auditDefinition
部署虛擬機器
您已指派角色和原則,現在可以開始部署您的解決方案。 預設大小是 Standard_DS1_v2,也就是所允許之 SKU 的其中一個。 執行此步驟時,系統會提示您輸入認證。 您輸入的值會設定為虛擬機器的使用者名稱和密碼。
New-AzVm -ResourceGroupName "myResourceGroup" `
-Name "myVM" `
-Location "East US" `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress" `
-OpenPorts 80,3389
部署完成之後,您可以套用更多的管理設定至解決方案。
鎖定資源
資源鎖定可避免組織中的使用者不小心刪除或修改重要資源。 不同於角色型存取控制,資源鎖定會對所有使用者和角色套用限制。 您可以將鎖定層級設定為 CanNotDelete 或 ReadOnly。
若要鎖定虛擬機器和網路安全性群組,請使用 New-AzResourceLock 命令:
# Add CanNotDelete lock to the VM
New-AzResourceLock -LockLevel CanNotDelete `
-LockName LockVM `
-ResourceName myVM `
-ResourceType Microsoft.Compute/virtualMachines `
-ResourceGroupName myResourceGroup
# Add CanNotDelete lock to the network security group
New-AzResourceLock -LockLevel CanNotDelete `
-LockName LockNSG `
-ResourceName myNetworkSecurityGroup `
-ResourceType Microsoft.Network/networkSecurityGroups `
-ResourceGroupName myResourceGroup
若要測試鎖定,請嘗試執行下列命令:
Remove-AzResourceGroup -Name myResourceGroup
您會看到一則錯誤,指出刪除作業因鎖定而無法完成。 只有當您明確移除鎖定後,才能刪除資源群組。 清除資源中會說明該步驟。
標記資源
您可將標籤套用至 Azure 資源,以便以邏輯方式依照類別組織這些資源。 每個標記都是由一個名稱和一個值所組成。 例如,您可以將「環境」名稱和「生產」值套用至生產環境中的所有資源。
若要將兩個標記新增至資源群組,請使用 Set-AzResourceGroup 命令:
Set-AzResourceGroup -Name myResourceGroup -Tag @{ Dept="IT"; Environment="Test" }
假設您想要新增第三個標記。 每當您將標記套用到資源或資源群組時,即會覆寫該資源或資源群組上現有的標記。 若要新增新的標記又不會遺失現有標記,您必須擷取現有標記、新增標記,然後重新套用標記的集合:
# Get existing tags and add a new tag
$tags = (Get-AzResourceGroup -Name myResourceGroup).Tags
$tags.Add("Project", "Documentation")
# Reapply the updated set of tags
Set-AzResourceGroup -Tag $tags -Name myResourceGroup
資源不會從資源群組繼承標記。 目前,您的資源群組具有三個標記,但是資源並沒有任何標記。 若要將所有標記從資源群組套用至其資源,並在資源上保留所有非重複的現有標記,請使用下列指令碼︰
# Get the resource group
$group = Get-AzResourceGroup myResourceGroup
if ($group.Tags -ne $null) {
# Get the resources in the resource group
$resources = Get-AzResource -ResourceGroupName $group.ResourceGroupName
# Loop through each resource
foreach ($r in $resources)
{
# Get the tags for this resource
$resourcetags = (Get-AzResource -ResourceId $r.ResourceId).Tags
# If the resource has existing tags, add new ones
if ($resourcetags)
{
foreach ($key in $group.Tags.Keys)
{
if (-not($resourcetags.ContainsKey($key)))
{
$resourcetags.Add($key, $group.Tags[$key])
}
}
# Reapply the updated tags to the resource
Set-AzResource -Tag $resourcetags -ResourceId $r.ResourceId -Force
}
else
{
Set-AzResource -Tag $group.Tags -ResourceId $r.ResourceId -Force
}
}
}
或者,您可以從資源群組將標記套用至資源,而不保留現有標記:
# Get the resource group
$g = Get-AzResourceGroup -Name myResourceGroup
# Find all the resources in the resource group, and for each resource apply the tags from the resource group
Get-AzResource -ResourceGroupName $g.ResourceGroupName | ForEach-Object {Set-AzResource -ResourceId $_.ResourceId -Tag $g.Tags -Force }
若要在單一標記中合併數個值,請使用 JSON 字串。
Set-AzResourceGroup -Name myResourceGroup -Tag @{ CostCenter="{`"Dept`":`"IT`",`"Environment`":`"Test`"}" }
若要新增一個具有數個值的新標記又不會遺失現有標記,您必須擷取現有標記、對新標記使用 JSON 字串,然後重新套用標記的集合:
# Get existing tags and add a new tag
$ResourceGroup = Get-AzResourceGroup -Name myResourceGroup
$Tags = $ResourceGroup.Tags
$Tags.Add("CostCenter", "{`"Dept`":`"IT`",`"Environment`":`"Test`"}")
# Reapply the updated set of tags
$ResourceGroup | Set-AzResourceGroup -Tag $Tags
若要移除所有標記,您要傳遞空的雜湊表。
Set-AzResourceGroup -Name myResourceGroup -Tag @{ }
若要將標籤套用至虛擬機器,請使用 Set-AzResource 命令:
# Get the virtual machine
$r = Get-AzResource -ResourceName myVM `
-ResourceGroupName myResourceGroup `
-ResourceType Microsoft.Compute/virtualMachines
# Apply tags to the virtual machine
Set-AzResource -Tag @{ Dept="IT"; Environment="Test"; Project="Documentation" } -ResourceId $r.ResourceId -Force
依標籤尋找資源
若要尋找具有某標籤名稱和值的資源,請使用 Get-AzResource 命令:
(Get-AzResource -Tag @{ Environment="Test"}).Name
傳回的值可用於管理工作,例如停止具有某標籤值的所有虛擬機器。
Get-AzResource -Tag @{ Environment="Test"} | Where-Object {$_.ResourceType -eq "Microsoft.Compute/virtualMachines"} | Stop-AzVM
依標籤值檢視成本
將標記套用至資源之後,您可以檢視具有這些標記之資源的成本。 成本分析顯示最新的使用方式需要一些時間,因此您可能還看不到成本。 當有成本可顯示時,您可以檢視訂用帳戶中所有資源群組的資源成本。 使用者必須擁有訂用帳戶層級的計費資訊存取權才能查看成本。
若要在入口網站中依標記檢視成本,請選取您的訂用帳戶,然後選取 [成本分析]。
接著,以標記值篩選,選取 [套用]。
您也可以使用 Azure 取用 API 概觀 ,以程式設計方式檢視成本。
清除資源
您無法刪除已鎖定的網路安全性群組,除非移除鎖定。 若要移除鎖定,請使用 Remove-AzResourceLock 命令:
Remove-AzResourceLock -LockName LockVM `
-ResourceName myVM `
-ResourceType Microsoft.Compute/virtualMachines `
-ResourceGroupName myResourceGroup
Remove-AzResourceLock -LockName LockNSG `
-ResourceName myNetworkSecurityGroup `
-ResourceType Microsoft.Network/networkSecurityGroups `
-ResourceGroupName myResourceGroup
當不再需要時,您可以使用 Remove-AzResourceGroup 命令來移除資源群組、VM 及所有相關資源。
Remove-AzResourceGroup -Name myResourceGroup
管理成本
Azure 服務成本費用。 Azure 成本管理可協助您設定預算和設定警示以控制費用。 使用成本管理來分析、管理和最佳化您的 Azure 成本。 若要深入了解,請參閱分析成本的快速入門。
後續步驟
您在本教學課程中建立了自訂 VM 映像。 您已了解如何︰
- 將使用者指派給角色
- 套用會強制執行標準的原則
- 使用鎖定保護重要資源
- 標記資源以進行計費和管理
請繼續進行下一個教學課程,以了解如何在 Linux 虛擬機器上識別變更及管理套件更新。