有時候我們想要在 Azure 很快速的建立一台 VM (虛擬機器) 來用,除了透過 Azure Portal 之外,我想最快速的方式,不外乎是透過 Azure CLI 命令列工具了,只要把之前筆記的 CLI 命令找出來,複製貼上就馬上有一台 VM 可以用。這篇文章我打算分享幾個我之前整理的 Azure CLI 筆記,幫助我日後可以更快速的找到命令。
安裝、更新、執行 Azure CLI 登入
-
安裝 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
-
更新 Azure CLI
Windows
choco upgrade azure-cli -y
Linux / macOS
az upgrade
-
執行 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 的發行商是 MicrosoftWindowsServer
或 MicrosoftWindowsDesktop
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
列出虛擬機器範本之後,要取得 Urn
或 UrnAlias
欄位的資料,這是我們建立 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
)!
-
快速建立一台超便宜的 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 的記憶體可用。
-
快速建立一台超便宜的 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`
-
快速建立一台 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 地址。
-
快速建立一台可以跑 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++
}
-
快速建立一台可以跑 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
的認證方法登入!
-
快速建立一台超便宜的 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 的記憶體可用。
-
快速建立一台 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'
-
快速建立一台 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 來設定:
-
查看目前的 VM 有多少已經對外開啟的 Ports
az network nsg rule list -g QuickDemo --nsg-name DemoLinuxVM1NSG
Azure CLI 建立 VM 時會連同 NSG 一起建立,命名規則為 VM Name
+ 'NSG'
,所以 VM 名稱為 DemoLinuxVM1
的話,預設 NSG 資源名稱就是 DemoLinuxVM1NSG
。
-
額外開啟一些從外網連入(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
-
替整個資源群組下所有的 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
相關連結