教學課程:了解如何使用 Azure CLI 管理 Linux 虛擬機器

將資源部署至 Azure 時,您有極大的彈性可決定所要部署的資源類型、資源所在之處,以及如何設定資源。 不過,此種彈性可能會使得組織所擁有的選項超出您的規劃。 當您考慮將資源部署至 Azure 時,可能會思考下列問題:

  • 如何符合某些國家/地區中資料主權的法律需求?
  • 如何控制成本?
  • 如何確保他人不會不慎變更重要系統?
  • 如何追蹤資源成本並準確地計費?

本文可解決這些問題。 具體而言,您可以:

  • 將使用者指派給角色,並將角色指派給範圍,讓使用者有權限能夠執行預期的動作,但僅止於此。
  • 針對訂用帳戶中的資源,套用規定慣例的原則。
  • 鎖定系統不可或缺的資源。
  • 標記資源,讓您可以依照對組織有意義的價值來追蹤資源。

本文著重於實作治理所要進行的工作。 如需更廣泛的概念討論,請參閱 Azure 中的治理

必要條件

  • Azure Cloud Shell 中使用 Bash 環境。

    在新視窗中啟動 Cloud Shell

  • 如果想要,請安裝 Azure CLI 以執行 CLI 參考命令。

    • 如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入

    • 出現提示時,請在第一次使用時安裝 Azure CLI 擴充功能。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能

    • 執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade

  • 本教學課程需要 2.0.30 版或更新版本的 Azure CLI。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。

了解範圍

在建立任何項目之前,讓我們先檢閱範圍的概念。 Azure 提供四個管理層級:管理群組、訂用帳戶、資源群組和資源。 管理群組是預覽版本。 下圖顯示這些層級的範例。

影響範圍

您可以在任何範圍層級套用管理設定。 您所選層級會判斷套用設定的範圍。 較低層級會繼承較高層級中的設定。 當您將設定套用到訂用帳戶時,訂用帳戶中的所有資源群組和資源都會套用該設定。 當您在資源群組上套用設定時,資源群組及其所有資源都會套用該設定。 不過,另一個資源群組沒有該設定。

通常我們會在較高層級套用重要設定,而在較低層級套用專案特定需求。 例如,您可能想要確定組織的所有資源都部署到特定區域。 若要完成這項需求,將原則套用至訂用帳戶,該訂用帳戶會指定允許的位置。 當貴組織中其他使用者新增新的資源群組和資源時,會自動強制執行允許的位置。

在本教學課程中,您會將所有的管理設定套用到資源群,讓您可以在完成後輕易地移除這些設定。

先來建立該資源群組。

az group create --name myResourceGroup --location "East US"

目前資源群組是空的。

Azure 角色型存取控制

您想要確定組織中的使用者具有這些資源的正確存取權等級。 您不想要授與不受限制的存取權給使用者,但是您又必須確定他們可以執行其工作。 Azure 角色型存取控制 (Azure RBAC) 可讓您管理哪些使用者具有權限可以在一個範圍內完成特定動作。

若要建立和移除角色指派,使用者必須具有 Microsoft.Authorization/roleAssignments/* 存取權。 此存取權是透過擁有者或使用者存取系統管理員角色來授與。

為了管理虛擬機器解決方案,有三個資源專屬角色可提供您經常需要的存取權:

相較於將角色指派給個別使用者,使用 Azure Active Directory 群組來含括需要執行類似動作的使用者,通常會較為容易。 然後,將該群組指派給適當的角色。 在本文中,請使用現有的群組來管理虛擬機器,或使用入口網站來建立 Azure Active Directory 群組

建立新群組或找到現有群組後,請使用 az role assignment create 命令,將新的 Azure Active Directory 群組指派給資源群組的虛擬機器參與者角色。

adgroupId=$(az ad group show --group <your-group-name> --query objectId --output tsv)

az role assignment create --assignee-object-id $adgroupId --role "Virtual Machine Contributor" --resource-group myResourceGroup

如果您收到錯誤,指出 主體 < guid > 不存在於目錄中,則新群組尚未傳播至整個 Azure Active Directory。 請嘗試再次執行命令。

通常您需要針對網路參與者和儲存體帳戶參與者重複進行此程序,以確保已指派使用者來管理已部署的資源。 在本文中,您可以略過這些步驟。

Azure 原則

Azure 原則可協助您確認訂用帳戶中的所有資源均符合公司標準。 您的訂用帳戶已經有數個原則定義。 若要查看可用的原則定義,請使用 az policy definition list 命令:

az policy definition list --query "[].[displayName, policyType, name]" --output table

您會看到現有的原則定義。 原則類型不是內建就是自訂。 查看定義,尋找符合您要指派之條件的定義。 在本文中,您指派的原則要:

  • 限制所有資源的位置。
  • 限制虛擬機器的 SKU。
  • 稽核未使用受控磁碟的虛擬機器。

在下列範例中,您會根據顯示名稱擷取三個原則定義。 您使用 az policy assignment create 命令將這些定義指派給資源群組。 針對某些原則,您要提供參數值來指定允許的值。

# Get policy definitions for allowed locations, allowed SKUs, and auditing VMs that don't use managed disks
locationDefinition=$(az policy definition list --query "[?displayName=='Allowed locations'].name | [0]" --output tsv)
skuDefinition=$(az policy definition list --query "[?displayName=='Allowed virtual machine SKUs'].name | [0]" --output tsv)
auditDefinition=$(az policy definition list --query "[?displayName=='Audit VMs that do not use managed disks'].name | [0]" --output tsv)

# Assign policy for allowed locations
az policy assignment create --name "Set permitted locations" \
  --resource-group myResourceGroup \
  --policy $locationDefinition \
  --params '{ 
      "listOfAllowedLocations": {
        "value": [
          "eastus", 
          "eastus2"
        ]
      }
    }'

# Assign policy for allowed SKUs
az policy assignment create --name "Set permitted VM SKUs" \
  --resource-group myResourceGroup \
  --policy $skuDefinition \
  --params '{ 
      "listOfAllowedSKUs": {
        "value": [
          "Standard_DS1_v2", 
          "Standard_E2s_v2"
        ]
      }
    }'

# Assign policy for auditing unmanaged disks
az policy assignment create --name "Audit unmanaged disks" \
  --resource-group myResourceGroup \
  --policy $auditDefinition

上述範例假設您已知道原則的參數。 如果您需要檢視參數,請使用:

az policy definition show --name $locationDefinition --query parameters

部署虛擬機器

您已指派角色和原則,現在可以開始部署您的解決方案。 預設大小是 Standard_DS1_v2,也就是所允許之 SKU 的其中一個。 如果預設位置中沒有 SSH 金鑰,命令會加以建立。

az vm create --resource-group myResourceGroup --name myVM --image UbuntuLTS --generate-ssh-keys

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

鎖定資源

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

若要建立或刪除管理鎖定,您必須擁有 Microsoft.Authorization/locks/* 動作的存取權。 在內建角色中,只有 擁有者使用者存取管理員 被授與這些動作的存取權。

若要鎖定虛擬機器和網路安全性群組,請使用 az lock create 命令:

# Add CanNotDelete lock to the VM
az lock create --name LockVM \
  --lock-type CanNotDelete \
  --resource-group myResourceGroup \
  --resource-name myVM \
  --resource-type Microsoft.Compute/virtualMachines

# Add CanNotDelete lock to the network security group
az lock create --name LockNSG \
  --lock-type CanNotDelete \
  --resource-group myResourceGroup \
  --resource-name myVMNSG \
  --resource-type Microsoft.Network/networkSecurityGroups

若要測試鎖定,請嘗試執行下列命令:

az group delete --name myResourceGroup

您會看到一則錯誤,指出刪除作業因鎖定而無法完成。 只有當您明確移除鎖定後,才能刪除資源群組。 清除資源中會說明該步驟。

標記資源

您可將標籤套用至 Azure 資源,以便以邏輯方式依照類別組織這些資源。 每個標記都是由一個名稱和一個值所組成。 例如,您可以將「環境」名稱和「生產」值套用至生產環境中的所有資源。

若要在資源群組中新增兩個標記,請使用 az group update 命令:

az group update -n myResourceGroup --set tags.Environment=Test tags.Dept=IT

假設您想要新增第三個標記。 對新標記再次執行命令。 新標記會附加至現有標記。

az group update -n myResourceGroup --set tags.Project=Documentation

資源不會從資源群組繼承標記。 目前,您的資源群組具有三個標記,但是資源並沒有任何標記。 若要將所有標記從資源群組套用至其資源,並在資源上保留現有的標記,請使用下列指令碼:

# Get the tags for the resource group
jsontag=$(az group show -n myResourceGroup --query tags)

# Reformat from JSON to space-delimited and equals sign
t=$(echo $jsontag | tr -d '"{},' | sed 's/: /=/g')

# Get the resource IDs for all resources in the resource group
r=$(az resource list -g myResourceGroup --query [].id --output tsv)

# Loop through each resource ID
for resid in $r
do
  # Get the tags for this resource
  jsonrtag=$(az resource show --id $resid --query tags)
  
  # Reformat from JSON to space-delimited and equals sign
  rt=$(echo $jsonrtag | tr -d '"{},' | sed 's/: /=/g')
  
  # Reapply the updated tags to this resource
  az resource tag --tags $t$rt --id $resid
done

或者,您可以從資源群組將標記套用至資源,而不保留現有標記:

# Get the tags for the resource group
jsontag=$(az group show -n myResourceGroup --query tags)

# Reformat from JSON to space-delimited and equals sign
t=$(echo $jsontag | tr -d '"{},' | sed 's/: /=/g')

# Get the resource IDs for all resources in the resource group
r=$(az resource list -g myResourceGroup --query [].id --output tsv)

# Loop through each resource ID
for resid in $r
do
  # Apply tags from resource group to this resource
  az resource tag --tags $t --id $resid
done

若要在單一標記中合併數個值,請使用 JSON 字串。

az group update -n myResourceGroup --set tags.CostCenter='{"Dept":"IT","Environment":"Test"}'

若要移除資源群組上的所有標記,請使用:

az group update -n myResourceGroup --remove tags

若要將標籤套用至虛擬機器,請使用 az resource tag 命令。 資源上的任何現有標記都不會保留。

az resource tag -n myVM \
  -g myResourceGroup \
  --tags Dept=IT Environment=Test Project=Documentation \
  --resource-type "Microsoft.Compute/virtualMachines"

依標籤尋找資源

若要尋找具有某標籤名稱和值的資源,請使用 az resource list 命令:

az resource list --tag Environment=Test --query [].name

傳回的值可用於管理工作,例如停止具有某標籤值的所有虛擬機器。

az vm stop --ids $(az resource list --tag Environment=Test --query "[?type=='Microsoft.Compute/virtualMachines'].id" --output tsv)

依標籤值檢視成本

將標記套用至資源之後,您可以檢視具有這些標記之資源的成本。 成本分析顯示最新的使用方式需要一些時間,因此您可能還看不到成本。 當有成本可顯示時,您可以檢視訂用帳戶中所有資源群組的資源成本。 使用者必須擁有訂用帳戶層級的計費資訊存取權才能查看成本。

若要在入口網站中依標記檢視成本,請選取您的訂用帳戶,然後選取 [成本分析]

成本分析

接著,以標記值篩選,選取 [套用]

依標記檢視成本

您也可以使用 Azure 使用量 API 概觀 ,以程式設計方式檢視成本。

清除資源

您無法刪除已鎖定的網路安全性群組,除非移除鎖定。 若要移除鎖定,請擷取鎖定的識別碼,並將這些識別碼提供給 az lock delete 命令:

vmlock=$(az lock show --name LockVM \
  --resource-group myResourceGroup \
  --resource-type Microsoft.Compute/virtualMachines \
  --resource-name myVM --output tsv --query id)
nsglock=$(az lock show --name LockNSG \
  --resource-group myResourceGroup \
  --resource-type Microsoft.Network/networkSecurityGroups \
  --resource-name myVMNSG --output tsv --query id)
az lock delete --ids $vmlock $nsglock

若不再需要,您可以使用 az group delete 命令來移除資源群組、VM 和所有相關資源。 結束 SSH 工作階段並返回您的 VM,然後將資源刪除,如下所示:

az group delete --name myResourceGroup

後續步驟

您在本教學課程中建立了自訂 VM 映像。 您已了解如何︰

  • 將使用者指派給角色
  • 套用會強制執行標準的原則
  • 使用鎖定保護重要資源
  • 標記資源以進行計費和管理

請繼續進行下一個教學課程,以了解如何在虛擬機器上識別變更及管理套件更新。