教學課程:了解如何使用 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

部署完成之後,您可以套用更多的管理設定至解決方案。

鎖定資源

資源鎖定可避免組織中的使用者不小心刪除或修改重要資源。 不同於角色型存取控制,資源鎖定會對所有使用者和角色套用限制。 您可以將鎖定層級設定為 CanNotDeleteReadOnly

若要鎖定虛擬機器和網路安全性群組,請使用 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 虛擬機器上識別變更及管理套件更新。