Hướng dẫn sử dụng VMware vSphere Tags và Custom Attributes: Phân loại và quản lý hàng trăm máy ảo hiệu quả

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

Cái khổ khi quản lý hàng trăm VM mà không có hệ thống phân loại

Mình quản lý cluster VMware với 8 host ESXi tại công ty, và có một giai đoạn khá đau đầu: số lượng VM tăng từ 40 lên gần 200 cái chỉ trong vòng 6 tháng. Mỗi team tự đặt tên theo kiểu của họ — team backend thì api-prod-01, team data thì spark-node-3, team QA thì test-env-ubuntu-22. Không có quy tắc chung nào cả.

Hậu quả thực tế: khi có người hỏi “VM nào đang chạy production của team payment?”, mình phải ngồi lần từng cái tên, hoặc hỏi lại từng team trưởng. Cực kỳ mất thời gian. Tệ hơn là khi cần patch security gấp, không biết VM nào thuộc môi trường nào để ưu tiên xử lý trước.

Nghe có vẻ quen không? Đây là tình trạng phổ biến ở nhiều công ty khi hạ tầng VMware phình ra nhanh mà không có chiến lược quản lý metadata từ đầu.

Tại sao chỉ dùng tên VM là không đủ

Nhiều người nghĩ rằng đặt tên VM theo quy chuẩn là đủ. Ví dụ như {env}-{team}-{app}-{số}. Cách này có vẻ ổn, nhưng thực tế có vài vấn đề:

  • Tên không chứa được nhiều chiều thông tin: Một VM có thể vừa là production, vừa thuộc team A, vừa chạy tier 1, vừa nằm trong maintenance window thứ 6. Nhét hết vào tên thì tên sẽ thành chuỗi ký tự khó đọc.
  • Tìm kiếm theo nhiều tiêu chí cùng lúc rất khó: vSphere Client không có full-text search mạnh. Muốn lọc “tất cả VM production của team backend đang bị tắt” thì không làm được chỉ bằng tên.
  • Thông tin bổ sung không có chỗ lưu: Ticket request, tên người phụ trách, cost center, ngày hết hạn license — những thứ này để đâu? Trong comment? Trong spreadsheet riêng? Cả hai đều có nguy cơ lạc hậu và không đồng bộ với thực tế.
  • Folders trong vSphere chỉ là cây đơn chiều: VM chỉ ở được một folder tại một thời điểm. Không thể phân loại theo nhiều tiêu chí đồng thời.

Các cách người ta thường dùng để xử lý

Cách 1: Spreadsheet quản lý VM inventory

Cách này mình thấy ở nhiều công ty SME. Một file Excel với cột tên VM, IP, owner, môi trường, ghi chú… Vấn đề là nó không liên kết trực tiếp với vSphere, nên thường xuyên bị lạc hậu. VM bị xóa mà spreadsheet vẫn còn, VM mới tạo mà chưa ai cập nhật.

Cách 2: Dùng cấu trúc Folder trong vSphere

Tạo folder theo tên team hoặc môi trường rồi đặt VM vào đó. Cách này tốt hơn spreadsheet nhưng như đã nói, VM chỉ ở được một folder, nên chỉ phân loại được theo một tiêu chí duy nhất.

Cách 3: vSphere Tags + Custom Attributes — cách mình đang dùng

Đây là giải pháp native của VMware, tích hợp thẳng vào vSphere và hoạt động cực kỳ tốt với PowerCLI. Tags cho phép gán nhiều nhãn vào cùng một VM, còn Custom Attributes cho phép lưu thông tin key-value tùy ý.

Dùng vSphere Tags: Gắn nhãn nhiều chiều cho VM

Tags trong vSphere hoạt động theo mô hình Category → Tag. Mỗi Category là một chiều phân loại, và mỗi Tag là một giá trị trong chiều đó. Ví dụ: Category “Environment” có các Tag là “Production”, “Staging”, “Development”.

Điểm hay là một VM có thể nhận tag từ nhiều category khác nhau cùng lúc — khác hoàn toàn với folder.

Tạo Category và Tag bằng PowerCLI

# Kết nối vCenter
Connect-VIServer -Server vcenter.company.local -User [email protected] -Password "P@ssword"

# Tạo category Environment (mỗi VM chỉ được gán 1 tag trong category này)
New-TagCategory -Name "Environment" -Cardinality Single -EntityType VirtualMachine

# Tạo các tags trong category Environment
New-Tag -Name "Production" -Category "Environment"
New-Tag -Name "Staging"    -Category "Environment"
New-Tag -Name "Development" -Category "Environment"

# Tạo category Team (cho phép gán nhiều tag nếu VM dùng chung bởi nhiều team)
New-TagCategory -Name "Team" -Cardinality Multiple -EntityType VirtualMachine

New-Tag -Name "Backend"  -Category "Team"
New-Tag -Name "Frontend" -Category "Team"
New-Tag -Name "Data"     -Category "Team"
New-Tag -Name "DevOps"   -Category "Team"

# Tạo category Tier để phân tầng độ quan trọng
New-TagCategory -Name "Tier" -Cardinality Single -EntityType VirtualMachine

New-Tag -Name "Tier1-Critical" -Category "Tier"
New-Tag -Name "Tier2-Important" -Category "Tier"
New-Tag -Name "Tier3-Normal"   -Category "Tier"

Gán tag vào VM

# Gán tag cho một VM cụ thể
$vm = Get-VM -Name "api-payment-01"
New-TagAssignment -Entity $vm -Tag (Get-Tag -Name "Production" -Category "Environment")
New-TagAssignment -Entity $vm -Tag (Get-Tag -Name "Backend" -Category "Team")
New-TagAssignment -Entity $vm -Tag (Get-Tag -Name "Tier1-Critical" -Category "Tier")

# Gán hàng loạt: tất cả VM có tên bắt đầu bằng "api-" đều là Production
Get-VM | Where-Object { $_.Name -like "api-*" } | ForEach-Object {
    New-TagAssignment -Entity $_ -Tag (Get-Tag -Name "Production" -Category "Environment")
}

Tìm kiếm VM theo tag

Đây là chỗ tags phát huy tác dụng nhất. Thay vì scroll qua danh sách 200 VM, lọc ngay bằng lệnh:

# Lấy tất cả VM đang chạy Production
Get-VM | Where-Object {
    (Get-TagAssignment -Entity $_ | Select-Object -ExpandProperty Tag).Name -contains "Production"
}

# Cách nhanh hơn dùng Get-TagAssignment trực tiếp
$prodVMs = (Get-TagAssignment -Tag (Get-Tag -Name "Production")).Entity

# Lọc VM vừa là Production vừa thuộc team Backend
$prodVMs = (Get-TagAssignment -Tag (Get-Tag -Name "Production")).Entity
$backendVMs = (Get-TagAssignment -Tag (Get-Tag -Name "Backend")).Entity
$target = $prodVMs | Where-Object { $backendVMs -contains $_ }
$target | Select-Object Name, PowerState

Custom Attributes: Lưu thông tin bổ sung vào từng VM

Tags tốt cho việc phân loại và lọc, nhưng không phù hợp để lưu thông tin dạng text tự do. Custom Attributes mới là chỗ để lưu những thứ như: tên người phụ trách, số ticket, ngày triển khai, cost center.

Tạo Custom Attribute

# Tạo các custom attribute cho VM
New-CustomAttribute -Name "Owner"       -TargetType VirtualMachine
New-CustomAttribute -Name "Cost Center" -TargetType VirtualMachine
New-CustomAttribute -Name "Ticket"      -TargetType VirtualMachine
New-CustomAttribute -Name "Deploy Date" -TargetType VirtualMachine
New-CustomAttribute -Name "Note"        -TargetType VirtualMachine

Gán và đọc giá trị Custom Attribute

# Gán thông tin cho VM
$vm = Get-VM -Name "api-payment-01"
Set-Annotation -Entity $vm -CustomAttribute "Owner"       -Value "Nguyen Van A"
Set-Annotation -Entity $vm -CustomAttribute "Cost Center" -Value "IT-PAYMENT-001"
Set-Annotation -Entity $vm -CustomAttribute "Ticket"      -Value "JIRA-2891"
Set-Annotation -Entity $vm -CustomAttribute "Deploy Date" -Value "2025-03-15"

# Đọc thông tin
Get-Annotation -Entity (Get-VM "api-payment-01")

# Xuất báo cáo toàn bộ VM với custom attributes
Get-VM | ForEach-Object {
    $vm = $_
    $annotations = Get-Annotation -Entity $vm
    [PSCustomObject]@{
        VMName      = $vm.Name
        PowerState  = $vm.PowerState
        Owner       = ($annotations | Where-Object {$_.Name -eq "Owner"}).Value
        CostCenter  = ($annotations | Where-Object {$_.Name -eq "Cost Center"}).Value
        Ticket      = ($annotations | Where-Object {$_.Name -eq "Ticket"}).Value
    }
} | Export-Csv -Path "vm-inventory.csv" -NoTypeInformation -Encoding UTF8

Kết hợp Tags và Custom Attributes trong thực tế

Mình hiện dùng theo mô hình này cho 8 host ESXi:

  • Tags để phân loại nhanh và lọc hàng loạt: Environment, Team, Tier, OS, Maintenance Window
  • Custom Attributes để lưu thông tin định danh: Owner, Cost Center, Ticket, SLA Level

Ví dụ thực tế: khi có maintenance định kỳ thứ 6, chỉ cần chạy lệnh lọc VM có tag “Maintenance-Friday” là ra đúng danh sách cần shutdown. Không cần nhớ tên từng cái hay tra spreadsheet nào cả.

Một điểm nữa: nếu công ty đang dùng vRealize Operations hay Aria Operations, tags từ vSphere được tự động kéo vào báo cáo chi phí và capacity planning — rất tiện khi cần phân bổ chi phí theo team hoặc project.

Checklist triển khai cho team mới bắt đầu

  1. Họp team xác định các chiều phân loại cần thiết (Environment, Team, Tier là bộ tối thiểu)
  2. Tạo Tag Categories và Tags trước khi tạo VM mới
  3. Retroactively gán tag cho VM cũ bằng script PowerCLI (mất vài giờ nhưng xứng đáng)
  4. Quy định: mọi VM mới tạo bắt buộc gán đủ tag Environment + Owner attribute trước khi bàn giao
  5. Định kỳ chạy script kiểm tra VM thiếu tag để giữ inventory sạch
# Script kiểm tra VM thiếu tag Environment
Get-VM | ForEach-Object {
    $tags = Get-TagAssignment -Entity $_ | Select-Object -ExpandProperty Tag
    $hasEnv = $tags | Where-Object { $_.Category.Name -eq "Environment" }
    if (-not $hasEnv) {
        Write-Output "[MISSING TAG] $($_.Name) — chưa có Environment tag"
    }
}

Share: