The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

使用 Azure CLI 快速建立 Azure 虛擬機器 (Virtual machines)

有時候我們想要在 Azure 很快速的建立一台 VM (虛擬機器) 來用,除了透過 Azure Portal 之外,我想最快速的方式,不外乎是透過 Azure CLI 命令列工具了,只要把之前筆記的 CLI 命令找出來,複製貼上就馬上有一台 VM 可以用。這篇文章我打算分享幾個我之前整理的 Azure CLI 筆記,幫助我日後可以更快速的找到命令。

image

安裝、更新、執行 Azure CLI 登入

  1. 安裝 Azure CLI 工具 (如何安裝 Azure CLI 工具)

    Windows - Chocolatey

    choco install azure-cli -y
    

    https://community.chocolatey.org/packages/azure-cl

    Linux

    curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
    

    macOS - Homebrew

    brew update && brew install azure-cli
    
  2. 更新 Azure CLI

    Windows

    choco upgrade azure-cli -y
    

    Linux / macOS

    az upgrade
    
  3. 執行 Azure CLI 登入

    以互動方式登入

    az login
    

    使用不同的租用戶(Tenant)以互動方式登入

    az login --tenant <tenant>
    

    使用服務主體來登入

    az login --service-principal -u <app-id> -p <password-or-cert> --tenant <tenant>
    

    使用受控識別登入 (managed identity)

    az login --identity
    

建立資源群組 (Resource Group)

建立任何資源之前,通常都一定會先建立一個資源群組,方便日後對資源進行管理。

  • 建立資源群組

    az group create --name QuickDemo --location eastasia
    
  • 建立資源群組 (設定 Tags 到資源群組)

    az group create --name QuickDemo --location eastasia --tags "Type=Testing" "Owner=Will" "Important"
    
  • 鎖定資源群組 (避免被意外刪除)

    az group lock create -g QuickDemo -n "DontDeleteMe" --lock-type CanNotDelete --notes "這個 RG 很重要,請不要刪除"
    
  • 解鎖資源群組並刪除資源群組

    az group lock delete -g QuickDemo -n "DontDeleteMe"
    az group delete -g QuickDemo -y
    
  • 刪除資源群組 (不等待結果)

    az group delete -g QuickDemo -y --no-wait
    

建立虛擬機器之前的參數準備

  • 列出特定 Region 的所有 VM 發行商 (Publisher)

    az vm image list-publishers --location eastasia --output table
    

    Windows 的發行商是 MicrosoftWindowsServerMicrosoftWindowsDesktop
    Ubuntu Linux 的發行商是 Canonical
    Red Hat Enterprise Linux 的發行商是 RedHat

  • 列出特定 Region 下的特定 Publisher 有多少 Offers (選擇? 規格? 型號?)

    這裡的 Offers 很難翻譯,但大概的意思就是,每個 VM 的發行商可以製作許多不同規格的 VM,讓你可以很方便的快速建立一些內建特定功能的 VM 來用,不用每次都建立空的 VM 起來設定,而每個不同預設值的 VM 都是一個一個的 Offer。

    az vm image list-offers -l eastasia --publisher MicrosoftWindowsServer --output table
    az vm image list-offers -l eastasia --publisher MicrosoftWindowsDesktop --output table
    

    MicrosoftWindowsServer 比較常用的 Offer 是 WindowsServer
    MicrosoftWindowsDesktop 比較常用的 Offer 是 Windows-10

    az vm image list-offers -l eastasia --publisher Canonical --output table
    

    Ubuntu 22.04 LTS 的 Offer 是 0001-com-ubuntu-server-jammy
    Ubuntu 20.04 LTS 的 Offer 是 0001-com-ubuntu-server-focal
    Ubuntu 18.04 LTS 的 Offer 是 UbuntuServer

    az vm image list-offers -l eastasia --publisher RedHat --output table
    

    Red Hat Enterprise Linux 8.2 的 Offer 是 RHEL

  • 列出特定 Region 下的特定 Publisher 下的特定 Offers 有多少 VM Image (虛擬機器範本) 可用

    我們在透過 az vm image list 列出虛擬機器範本之後,要取得 UrnUrnAlias 欄位的資料,這是我們建立 Azure VM 時的重要參考資訊!

    列出常用的 Windows 虛擬機器範本

    az vm image list -l eastasia --offer WindowsServer --publisher MicrosoftWindowsServer --output table
    

    列出所有的 Windows 虛擬機器範本 (超級多)

    az vm image list -l eastasia --offer WindowsServer --publisher MicrosoftWindowsServer --all --output table | grep "2019-Datacenter-with-Containers"
    az vm image list -l eastasia --offer Windows-10 --publisher MicrosoftWindowsDesktop --all --output table
    

    列出所有的 Ubuntu 22.04 LTS 虛擬機器範本

    az vm image list -l eastasia --offer 0001-com-ubuntu-server-jammy --publisher Canonical --all --output table
    

    列出所有的 Ubuntu 20.04 LTS 虛擬機器範本

    az vm image list -l eastasia --offer 0001-com-ubuntu-server-focal --publisher Canonical --all --output table
    

    列出所有的 RHEL 虛擬機器範本

    az vm image list -l eastasia --offer RHEL --publisher RedHat --all --output table
    
  • 列出特定 Region 下有多少可用的 VM 規格 (Size)

    選擇 VM Size 就是選擇你要多少 CPU 核心數(NumberOfCores)、多少記憶體(MemoryInMb)、作業系統磁碟的大小(OsDiskSizeInMb)、資源磁碟的大小(ResourceDiskSizeInMb)、最大外接資料磁碟的數量(MaxDataDiskCount)。簡單來說,VM Size 才是決定你每個月花多少錢的關鍵,你要擁有最好的 C/P 值(成本效能),就要認真評估與選擇正確大小的 VM Size!

    az vm list-sizes --location eastasia -o table
    

    僅列出只有 1 核心的規格

    az vm list-sizes --location eastasia -o table --query 'sort_by(@,&name)[?numberOfCores == `1`]'
    

    僅列出最多只能擴充 4 顆資料磁碟的 VM 規格

    az vm list-sizes --location eastasia -o table --query 'sort_by(@,&name)[?maxDataDiskCount <= `4`]'
    

    僅列出記憶體容量介於 2GB 到 8GB 的所有 VM 規格

    az vm list-sizes --location eastasia -o table --query 'sort_by(@,&name)[?memoryInMb >= `2048` && memoryInMb <= `8192`]'
    

    僅列出 D2_v3 等級的 VM 規格

    az vm list-sizes --location eastasia -o table --query "sort_by(@,&name)[?contains(name, 'D2_v3')]"
    

    僅列出 B 系列的 VM 規格

    az vm list-sizes --location eastasia -o table --query "sort_by(@,&name)[?contains(name, 'Standard_B')]"
    

有了以上的 VM 參數,我們就可以來建立 VM 了!

快速建立 Windows 虛擬機器 (VM)

由於建立虛擬機器時,除了 VM 本身外,還會同時建立許多相關資源,例如 Virtual network (虛擬網路)、Regular Network Interface (網路介面)、Public IP address (公開的 IP 地址)、Network security group (NSG) (網路安全性群組)、Disk (作業系統磁碟) 等等。在透過 Azure CLI 執行建立 VM 時若沒有指定這些參數,都會有預設值。

建立 Windows 虛擬機器,最重要的就是要給一組可遠端桌面登入的帳號(--admin-username)與密碼(--admin-password)!

  1. 快速建立一台超便宜的 Windows 虛擬機器

    此範例選用 Standard_B1s 規格,每月僅 NT$225 元,有 1 Core + 1 GiB RAM

    這種 VM 非常適合用來執行低用量的排程作業,超省錢!

    az vm create -g QuickDemo -n DemoVM1 -l eastasia --size Standard_B1s --image Win2019Datacenter --admin-username willh --admin-password 'Pa$$w0rd1234' --public-ip-address-allocation 'static' --storage-sku os=Standard_LRS
    

    上述 --public-ip-address-allocation 'static' 是為了保留一個靜態的 IP 地址給這台 VM 使用。而 Standard_LRS 則是將 C:\ 系統磁碟使用較為便宜的傳統硬碟(HDD)。如果沒有使用 --storage-sku 參數,預設會選用 Premium_LRS,讀寫速度較快,但也較貴一些。

    執行完畢後會出現以下摘要資訊:

    ResourceGroup    PowerState    PublicIpAddress    Fqdns    PrivateIpAddress    MacAddress         Location    Zones
    ---------------  ------------  -----------------  -------  ------------------  -----------------  ----------  -------
    QuickDemo        VM running    104.208.112.152             10.0.0.4            00-0D-3A-81-FA-16  eastasia
    

    注意事項:上述命令會預設在 NSG (網路安全性群組) 中加入一條允許 Windows 遠端桌面連線(RDP Port 3389)的防火牆規則(rdp),這意味著「全世界所有人」都可以開始連接你的 VM 並嘗試登入,請務必小心!

    另外,由於 Standard_B1s 規格只有 1 vCore + 1 GiB 的記憶體而已,安裝了 Windows Server 2019 作業系統後,開機登入就已經先吃掉 800MB 的記憶體,所以其實你並沒有太多資源可以跑其他程式了,這點要特別注意!你可以改用 Standard_B1ms 這個 VM 規格,每月 NT$448 元,有 2 GiB 的記憶體可用。

  2. 快速建立一台超便宜的 Windows Server 2022 測試機

    此範例選用 Standard_B2s 規格,每月僅 NT$900 元,有 2 Core + 4 GiB RAM

    az vm create -g QuickDemo -n DemoVM2 -l eastasia --size Standard_B2s --image 'MicrosoftWindowsServer:WindowsServer:2022-datacenter-g2:20348.768.220609' --admin-username willh --admin-password 'Pa$$w0rd1234' --storage-sku os=StandardSSD_LRS --public-ip-address-allocation 'static' --public-ip-address-dns-name 'willh-testing-one'
    

    使用 --public-ip-address-dns-name 'willh-testing-one' 參數可以自動指派一個 *.eastasia.cloudapp.azure.com 免費域名給你!

    az vm create -g QuickDemo -n DemoVM1 -l eastasia --size Standard_B1s --image Win2019Datacenter --admin-username willh --admin-password 'Pa$$w0rd1234' --public-ip-address-allocation 'static' --public-ip-address-dns-name 'willh-number-one`
    
  3. 快速建立一台 Windows 11 來體驗一下新版作業系統的介面

    此範例選用 Standard_B2s 規格,每月僅 NT$900 元,有 2 Core + 4 GiB RAM

    az vm create -g QuickDemo -n DemoVM3 -l eastasia --size Standard_B2s --image 'MicrosoftWindowsDesktop:windows-11:win11-21h2-pro:22000.739.220608' --admin-username willh --admin-password 'Pa$$w0rd1234' --public-ip-address-allocation 'dynamic' --public-ip-address-dns-name 'willh-win11-test1'
    

    使用 --public-ip-address-allocation 'dynamic' 參數可以配置一個動態的 IP 位址,每次重開機都會變更 IP 地址。

  4. 快速建立一台可以跑 Windows Container 的 Windows 虛擬機器,並增加一個 50 GB 的資料磁碟 (Data Disk)

    此範例選用 Standard_D2s_v3 規格,每月 NT$2,077 元,有 2 Core + 8 GiB RAM

    由於 Windows Container 需要跑在有 Hyper-V 的環境下,因次 VM 必須啟動 Nested Virtualization 功能,而此功能只有在 D2 v3 以上的 VM 規格才有支援。

    az vm create -g QuickDemo -n DemoVM4 -l eastasia --size Standard_D2s_v3 --image 'MicrosoftWindowsServer:WindowsServer:2019-datacenter-with-containers-gs:17763.3132.220610' --admin-username willh --admin-password 'Pa$$w0rd1234' --public-ip-address-allocation 'static' --public-ip-address-dns-name 'willh-ws2019-container' --data-disk-sizes-gb 50
    

    額外掛載資料磁碟,可以參考 Attach a data disk to a Windows VM with PowerShell 文件。

    # 找出所有尚未格式化的磁碟清單
    $disks = Get-Disk | Where partitionstyle -eq 'raw' | sort number
    
    # 磁碟機代號從 F 開始算起,因為 D 是臨時磁碟、E 是 CD-ROM 虛擬光碟
    $letters = 70..89 | ForEach-Object { [char]$_ }
    $count = 0
    $labels = "data1","data2","data3","data4","data5","data6"
    
    foreach ($disk in $disks) {
        $driveLetter = $letters[$count].ToString()
        $disk |
        Initialize-Disk -PartitionStyle MBR -PassThru |
        New-Partition -UseMaximumSize -DriveLetter $driveLetter |
        Format-Volume -FileSystem NTFS -NewFileSystemLabel $labels[$count] -Confirm:$false -Force
        $count++
    }
    
  5. 快速建立一台可以跑 Hyper-V / Docker 的 Windows 虛擬機器,並增加一個 50 GB 的資料磁碟 (Data Disk) 並指定使用 D:\

    此範例選用 Standard_D2s_v5 規格,每月 NT$2,077 元,有 2 Core + 8 GiB RAM

    我們有些測試環境需要使用到 D:\ 作為資料磁碟,然而使用 Standard_D2s_v3 的 VM 規格,預設會建立一個臨時磁碟(D:\),只要你重開機就有可能會自動清空磁碟內容,這點要特別注意。然而,這個例子的 VM 規格我刻意採用一個不會自動產生臨時磁碟Standard_D2s_v5 規格 (Azure VM sizes with no local temporary disk),所以預設 D:\ 會是一個 CD-ROM 虛擬光碟機磁碟。

    由於要跑 Docker Desktop 需要跑在有 Hyper-V 的環境下,因次 VM 必須內含 Nested Virtualization 能力,而此能力只有在 D2 v3 以上的 VM 規格才有支援。

    az vm create -g QuickDemo -n DemoVM5 -l eastasia --size Standard_D2s_v5 --image Win2019Datacenter  --storage-sku os=Standard_LRS --admin-username willh --admin-password 'Pa$$w0rd1234' --public-ip-address-allocation 'static' --public-ip-address-dns-name 'willh-ws2019-docker' --storage-sku 0=Standard_LRS --data-disk-sizes-gb 32
    

    透過 RDP 登入 Windows 之後,開啟 PowerShell 執行以下命令,停用 CD-ROM 磁碟,然後重開機就不會再出現光碟機佔用 D: 槽了!

    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\cdrom -Name Start -Value 4 -Type DWord
    Restart-Computer
    

    注意: 附加額外的資料磁碟,至少要 32GB 以上。而 --storage-sku 0=Standard_LRS 代表我的第 1 顆 Data Disk 的虛擬硬碟規格使用傳統硬碟(Standard_LRS)。

    重開機完成後,執行以下命令,就可以自動將尚未格式化的資料磁碟格式化成 D:\ 磁碟機!

    # 找出所有尚未格式化的磁碟清單
    $disk = Get-Disk | Where partitionstyle -eq 'raw' | sort number
    # 確認只有一顆 raw 磁碟 (尚未格式化的磁碟)
    if ($disk.Count -eq 1))
    {
        $disk |
        Initialize-Disk -PartitionStyle MBR -PassThru |
        New-Partition -UseMaximumSize -DriveLetter 'D' |
        Format-Volume -FileSystem NTFS -NewFileSystemLabel 'data1' -Confirm:$false -Force
    }
    

快速建立 Linux 虛擬機器 (VM)

由於建立虛擬機器時,除了 VM 本身外,還會同時建立許多相關資源,例如 Virtual network (虛擬網路)、Regular Network Interface (網路介面)、Public IP address (公開的 IP 地址)、Network security group (NSG) (網路安全性群組)、Disk (作業系統磁碟) 等等。在透過 Azure CLI 執行建立 VM 時若沒有指定這些參數,都會有預設值。

建立 Linux 虛擬機器,最重要的就是要選擇用 password 登入,或是用 ssh 登入,不過強烈不建議用 password 的認證方法登入!

  1. 快速建立一台超便宜的 Ubuntu Linux 虛擬機器

    此範例選用 Standard_B1ls 規格,每月僅 NT$307 元,有 1 Core + 0.5 GiB RAM

    這種 VM 非常適合用來執行低用量的排程作業,超省錢! (但只有 1 Core + 512 MiB 記憶體)

    以下這個範例我直接使用 --generate-ssh-keys 自動產生 SSH 金鑰組(Key-pair),這個參數主要適用於你在本機尚未建立 SSH 金鑰組的情況下使用。但如果你在本機已經在之前就曾經建立過 SSH 金鑰組的情況,就不會再次建立,直接沿用之前建立過的 SSH 金鑰組進行指派。

    az vm create -g QuickDemo -n DemoLinuxVM1 -l eastasia --size Standard_B1ls --image UbuntuLTS --admin-username willh --generate-ssh-keys --public-ip-address-allocation 'static' --storage-sku os=Standard_LRS
    

    上述 --public-ip-address-allocation 'static' 是為了保留一個靜態的 IP 地址給這台 VM 使用。而 Standard_LRS 則是將 C:\ 系統磁碟使用較為便宜的傳統硬碟(HDD)。如果沒有使用 --storage-sku 參數,預設會選用 Premium_LRS,讀寫速度較快,但也較貴一些。

    執行完畢後會出現以下摘要資訊:

    ResourceGroup    PowerState    PublicIpAddress    Fqdns    PrivateIpAddress    MacAddress         Location    Zones
    ---------------  ------------  -----------------  -------  ------------------  -----------------  ----------  -------
    QuickDemo        VM running    20.187.79.46                10.0.0.9            00-22-48-19-29-E4  eastasia
    

    注意:上述命令會預設在 NSG (網路安全性群組) 中加入一條允許 SSH 連線(Port 22)的防火牆規則(default-allow-ssh),這意味著「全世界所有人」都可以開始嘗試用 SSH 連接你的 VM,不過沒有你的金鑰他們也是無法登入的,相對安全許多!

    建立完成 VM 之後,由於建立時已經將你的 SSH 金鑰組的「公開金鑰」部分上傳,因此你可以直接透過 ssh 工具免密碼連入 VM 虛擬機器:

    ssh -l willh 20.187.79.46
    

    注意:由於 Standard_B1ls 規格只有 1 vCore + 0.5 GiB 的記憶體而已,安裝了 Ubuntu Linux 作業系統後,開機登入就已經先吃掉 419MB 的記憶體,所以其實你並沒有太多資源可以跑其他程式了,這點要特別注意!你可以改用 Standard_B1ms 這個 VM 規格,每月 NT$643 元,有 2 GiB 的記憶體可用。

  2. 快速建立一台 Red Hat Enterprise Linux 8.2 (RHEL) 虛擬機器

    此範例選用 Standard_D2s_v3 規格,每月僅 NT$2,077 元,有 2 Core + 8 GiB RAM

    以下這個範例我直接使用 --ssh-key-values 直接指定特定一把 SSH 公鑰:

    az vm create -g QuickDemo -n DemoLinuxVM2 -l eastasia --size Standard_D2s_v3 --image RedHat:RHEL:82gen2:8.2.2022031402 --admin-username willh --ssh-key-values '@~/.ssh/id_rsa.pub' --public-ip-address-allocation 'static'
    
  3. 快速建立一台 Red Hat Enterprise Linux 8.2 (RHEL) 虛擬機器並額外建立一個 50GB 的資料磁碟 (Data Disk)

    此範例選用 Standard_D2s_v3 規格,每月僅 NT$2,077 元,有 2 Core + 8 GiB RAM

    以下這個範例我直接使用 --ssh-key-values 直接指定特定一把 SSH 公鑰:

    az vm create -g QuickDemo -n DemoLinuxVM3 -l eastasia --size Standard_D2s_v3 --image RedHat:RHEL:82gen2:8.2.2022031402 --admin-username willh --generate-ssh-keys --public-ip-address-allocation 'static' --data-disk-sizes-gb 50
    

    額外掛載資料磁碟,可以參考 Add a disk to a Linux VM 文件。

    # 預設第一顆磁碟是 /dev/sdc
    lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
    sudo parted /dev/sdc --script mklabel gpt mkpart xfspart xfs 0% 100%
    sudo mkfs.xfs /dev/sdc1
    sudo partprobe /dev/sdc1
    sudo mkdir /datadrive
    sudo mount /dev/sdc1 /datadrive
    
    # 設定重開機自動掛載資料磁碟
    
    # 先用 blkid 查出磁碟機的 UUID 與 TYPE
    sudo blkid
    # /dev/sdc1: UUID="33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e" TYPE="xfs" PARTLABEL="xfspart" PARTUUID="c1c2c3c4-1234-cdef-asdf3456ghjk"
    
    # 編輯 /etc/fstab 檔案,設定開機自動掛載的磁碟機與路徑
    sudo vi /etc/fstab
    # UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e   /datadrive   xfs   defaults,nofail   1   2
    

常用的網路安全性群組(NSG)設定

我們在架設好 VM 之後,經常需要開通 NSG 防火牆設定,例如常見的 Port 80 (HTTP) 或 Port 443 (HTTPS) 就常需要額外開啟,這部分也可以很簡易的透過 Azure CLI 來設定:

  1. 查看目前的 VM 有多少已經對外開啟的 Ports

    az network nsg rule list -g QuickDemo --nsg-name DemoLinuxVM1NSG
    

    Azure CLI 建立 VM 時會連同 NSG 一起建立,命名規則為 VM Name + 'NSG',所以 VM 名稱為 DemoLinuxVM1 的話,預設 NSG 資源名稱就是 DemoLinuxVM1NSG

  2. 額外開啟一些從外網連入(Inbound)的防火牆規則

    az vm open-port -g QuickDemo -n DemoLinuxVM1 --port 80   --priority 1001
    az vm open-port -g QuickDemo -n DemoLinuxVM1 --port 443  --priority 1002
    az vm open-port -g QuickDemo -n DemoLinuxVM1 --port 5001-5010  --priority 1003
    
  3. 替整個資源群組下所有的 VM 開啟 Port 80 與 443

    az vm open-port --ids $(az vm list -g QuickDemo --query "[].id" -o tsv) --port '80'  --priority 2001
    az vm open-port --ids $(az vm list -g QuickDemo --query "[].id" -o tsv) --port '443' --priority 2002
    

相關連結