ื›ื™ืฆื“ ืœื‘ื ื•ืช ืžืื™ืฅ ืจืงื˜ื” ืขื‘ื•ืจ ืกืงืจื™ืคื˜ื™ื ืฉืœ PowerCLI 

ื‘ืžื•ืงื“ื ืื• ื‘ืžืื•ื—ืจ, ื›ืœ ืžื ื”ืœ ืžืขืจื›ืช ืฉืœ VMware ื‘ื ืœื‘ืฆืข ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ืžืฉื™ืžื•ืช ืฉื’ืจืชื™ื•ืช. ื”ื›ืœ ืžืชื—ื™ืœ ื‘ืฉื•ืจืช ื”ืคืงื•ื“ื”, ื•ืื– ืžื’ื™ืข PowerShell ืื• VMware PowerCLI.

ื ื ื™ื— ืฉืœื™ื˜ืช ื‘-PowerShell ืงืฆืช ื™ื•ืชืจ ืจื—ื•ืง ืžื”ืฉืงืช ISE ื•ืฉื™ืžื•ืฉ ื‘-cmdlets ืกื˜ื ื“ืจื˜ื™ื™ื ืžืžื•ื“ื•ืœื™ื ืฉืขื•ื‘ื“ื™ื ื‘ื’ืœืœ "ืกื•ื’ ืฉืœ ืงืกื". ื›ืืฉืจ ืชืชื—ื™ืœื• ืœืกืคื•ืจ ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื‘ืžืื•ืช, ืชื’ืœื• ืฉืกืงืจื™ืคื˜ื™ื ืฉืขื•ื–ืจื™ื ื‘ืงื ื” ืžื™ื“ื” ืงื˜ืŸ ืคื•ืขืœื™ื ืœืื˜ ื™ื•ืชืจ ื‘ืงื ื” ืžื™ื“ื” ื’ื“ื•ืœ. 

ื‘ืžืฆื‘ ื–ื”, 2 ื›ืœื™ื ื™ืขื–ืจื•:

  • PowerShell Runspaces - ื’ื™ืฉื” ื”ืžืืคืฉืจืช ืœื”ืงื‘ื™ืœ ืืช ื‘ื™ืฆื•ืข ืชื”ืœื™ื›ื™ื ื‘ืฉืจืฉื•ืจื™ื ื ืคืจื“ื™ื; 
  • Get-View โ€“ ืคื•ื ืงืฆื™ื™ืช PowerCLI ื‘ืกื™ืกื™ืช, ืื ืœื•ื’ื™ ืฉืœ Get-WMIObject ื‘-Windows. cmdlet ื–ื” ืื™ื ื• ืžื•ืฉืš ืื•ื‘ื™ื™ืงื˜ื™ื ื”ื ืœื•ื•ื™ื ืœื™ืฉื•ื™ื•ืช, ืืœื ืžืงื‘ืœ ืžื™ื“ืข ื‘ืฆื•ืจื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ ืคืฉื•ื˜ ืขื ืกื•ื’ื™ ื ืชื•ื ื™ื ืคืฉื•ื˜ื™ื. ื‘ืžืงืจื™ื ืจื‘ื™ื ื–ื” ื™ื•ืฆื ืžื”ืจ ื™ื•ืชืจ.

ืœืื—ืจ ืžื›ืŸ, ืื“ื‘ืจ ื‘ืงืฆืจื” ืขืœ ื›ืœ ื›ืœื™ ื•ืืจืื” ื“ื•ื’ืžืื•ืช ืœืฉื™ืžื•ืฉ. ื‘ื•ืื• ื ื ืชื— ืกืงืจื™ืคื˜ื™ื ืกืคืฆื™ืคื™ื™ื ื•ื ืจืื” ืžืชื™ ืื—ื“ ืขื•ื‘ื“ ื˜ื•ื‘ ื™ื•ืชืจ ืžื”ืฉื ื™. ืœืœื›ืช!

ื›ื™ืฆื“ ืœื‘ื ื•ืช ืžืื™ืฅ ืจืงื˜ื” ืขื‘ื•ืจ ืกืงืจื™ืคื˜ื™ื ืฉืœ PowerCLI

ืฉืœื‘ ืจืืฉื•ืŸ: Runspace

ืื–, Runspace ืžื™ื•ืขื“ ืœืขื™ื‘ื•ื“ ืžืงื‘ื™ืœ ืฉืœ ืžืฉื™ืžื•ืช ืžื—ื•ืฅ ืœืžื•ื“ื•ืœ ื”ืจืืฉื™. ื›ืžื•ื‘ืŸ, ืืชื” ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ืชื”ืœื™ืš ืื—ืจ ืฉื™ืื›ืœ ืงืฆืช ื–ื™ื›ืจื•ืŸ, ืžืขื‘ื“ ื•ื›ื•'. ืื ื”ืกืงืจื™ืคื˜ ืฉืœืš ืคื•ืขืœ ืชื•ืš ืžืกืคืจ ื“ืงื•ืช ื•ืฆื•ืจืš ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ื–ื™ื›ืจื•ืŸ, ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉืœื ืชื–ื“ืงืง ืœ-Runspace. ืื‘ืœ ืขื‘ื•ืจ ืกืงืจื™ืคื˜ื™ื ืœืขืฉืจื•ืช ืืœืคื™ ืื•ื‘ื™ื™ืงื˜ื™ื ื™ืฉ ืฆื•ืจืš ื‘ื›ืš.

ืืชื” ื™ื›ื•ืœ ืœื”ืชื—ื™ืœ ืœืœืžื•ื“ ื›ืืŸ: 
ืชื—ื™ืœืช ื”ืฉื™ืžื•ืฉ ื‘-PowerShell Runspaces: ื—ืœืง 1

ืžื” ื”ืฉื™ืžื•ืฉ ื‘-Runspace ื ื•ืชืŸ:

  • ืžื”ื™ืจื•ืช ืขืœ ื™ื“ื™ ื”ื’ื‘ืœืช ืจืฉื™ืžืช ื”ืคืงื•ื“ื•ืช ื”ืžื‘ื•ืฆืขื•ืช,
  • ื‘ื™ืฆื•ืข ืžืงื‘ื™ืœ ืฉืœ ืžืฉื™ืžื•ืช,
  • ื‘ึผึฐื˜ึดื™ื—ื•ึผืช.

ื”ื ื” ื“ื•ื’ืžื” ืžื”ืื™ื ื˜ืจื ื˜ ื›ืืฉืจ Runspace ืขื•ื–ืจ:

"ืžื—ืœื•ืงืช ืื—ืกื•ืŸ ื”ื™ื ืื—ื“ ื”ืžื“ื“ื™ื ื”ืงืฉื™ื ื‘ื™ื•ืชืจ ืœืžืขืงื‘ ื‘-vSphere. ื‘ืชื•ืš vCenter, ืืชื” ืœื ื™ื›ื•ืœ ืคืฉื•ื˜ ืœืœื›ืช ื•ืœืจืื•ืช ืื™ื–ื” VM ืฆื•ืจืš ื™ื•ืชืจ ืžืฉืื‘ื™ ืื—ืกื•ืŸ. ืœืžืจื‘ื” ื”ืžื–ืœ, ืืชื” ื™ื›ื•ืœ ืœืืกื•ืฃ ืืช ื”ื ืชื•ื ื™ื ื”ืืœื” ืชื•ืš ื“ืงื•ืช ื”ื•ื“ื•ืช ืœ- PowerShell.
ืื ื™ ืื—ืœื•ืง ืกืงืจื™ืคื˜ ืฉื™ืืคืฉืจ ืœืžื ื”ืœื™ ืžืขืจื›ืช VMware ืœื—ืคืฉ ื‘ืžื”ื™ืจื•ืช ื‘ืจื—ื‘ื™ vCenter ื•ืœืงื‘ืœ ืจืฉื™ืžื” ืฉืœ VMs ืขื ื ืชื•ื ื™ื ืขืœ ื”ืฆืจื™ื›ื” ื”ืžืžื•ืฆืขืช ืฉืœื”ื.  
ื”ืกืงืจื™ืคื˜ ืžืฉืชืžืฉ ื‘ืžืจื—ื‘ื™ ืจื™ืฆื” ืฉืœ PowerShell ื›ื“ื™ ืœืืคืฉืจ ืœื›ืœ ืžืืจื— ESXi ืœืืกื•ืฃ ืžื™ื“ืข ืฆืจื™ื›ื” ืžืžื›ืฉื™ืจื™ ื”-VM ืฉืœื• ื‘-Runspace ื ืคืจื“ ื•ืœื“ื•ื•ื— ื‘ืื•ืคืŸ ืžื™ื™ื“ื™ ืขืœ ืกื™ื•ื. ื–ื” ืžืืคืฉืจ ืœ-PowerShell ืœืกื’ื•ืจ ืขื‘ื•ื“ื•ืช ื‘ืื•ืคืŸ ืžื™ื™ื“ื™, ื‘ืžืงื•ื ืœืขื‘ื•ืจ ื“ืจืš ืžืืจื—ื™ื ื•ืœื—ื›ื•ืช ืฉื›ืœ ืื—ื“ ื™ืฉืœื™ื ืืช ื‘ืงืฉืชื•."

ืžืงื•ืจ: ื›ื™ืฆื“ ืœื”ืฆื™ื’ I/O ืฉืœ ืžื—ืฉื‘ ื•ื™ืจื˜ื•ืืœื™ ื‘ืœื•ื— ืžื—ื•ื•ื ื™ื ืฉืœ ESXi

ื‘ืžืงืจื” ืฉืœื”ืœืŸ, Runspace ื›ื‘ืจ ืœื ืฉื™ืžื•ืฉื™:

"ืื ื™ ืžื ืกื” ืœื›ืชื•ื‘ ืกืงืจื™ืคื˜ ืฉืื•ืกืฃ ื”ืจื‘ื” ื ืชื•ื ื™ื ืž-VM ื•ื›ื•ืชื‘ ื ืชื•ื ื™ื ื—ื“ืฉื™ื ื›ืฉืฆืจื™ืš. ื”ื‘ืขื™ื” ื”ื™ื ืฉื™ืฉ ื“ื™ ื”ืจื‘ื” ืžื›ืฉื™ืจื™ VM ื•-5-8 ืฉื ื™ื•ืช ืžื•ืฉืงืขื•ืช ื‘ืžื›ื•ื ื” ืื—ืช". 

ืžืงื•ืจ: Multithreading PowerCLI ืขื RunspacePool

ื›ืืŸ ืชืฆื˜ืจืš Get-View, ื‘ื•ืื• ื ืขื‘ื•ืจ ืœื–ื”. 

ืฉืœื‘ ืฉื ื™: Get-View

ื›ื“ื™ ืœื”ื‘ื™ืŸ ืžื“ื•ืข Get-View ืฉื™ืžื•ืฉื™, ื›ื“ืื™ ืœื–ื›ื•ืจ ื›ื™ืฆื“ ืขื•ื‘ื“ื•ืช cmdlets ื‘ืื•ืคืŸ ื›ืœืœื™. 

ื™ืฉ ืฆื•ืจืš ื‘-Cmdlets ื›ื“ื™ ืœื”ืฉื™ื’ ืžื™ื“ืข ื‘ืฆื•ืจื” ื ื•ื—ื” ืœืœื ืฆื•ืจืš ื‘ืœื™ืžื•ื“ ืกืคืจื™ ืขื–ืจ ืฉืœ API ื•ืœื”ืžืฆื™ื ืžื—ื“ืฉ ืืช ื”ื’ืœื’ืœ ื”ื‘ื. ืžื” ืฉื‘ื™ืžื™ื ืขื‘ืจื• ืœืงื— ืžืื” ืื• ืฉืชื™ื™ื ืฉื•ืจื•ืช ืงื•ื“, PowerShell ืžืืคืฉืจ ืœืš ืœืขืฉื•ืช ื‘ืคืงื•ื“ื” ืื—ืช. ืื ื—ื ื• ืžืฉืœืžื™ื ืขืœ ื”ื ื•ื—ื•ืช ื”ื–ื• ื‘ืžื”ื™ืจื•ืช. ืื™ืŸ ืงืกื ื‘ืชื•ืš ื”-cmdlets ืขืฆืžื: ืื•ืชื• ืชืกืจื™ื˜, ืื‘ืœ ื‘ืจืžื” ื ืžื•ื›ื” ื™ื•ืชืจ, ืฉื ื›ืชื‘ ื‘ื™ื“ื™ื• ื”ืžื™ื•ืžื ื•ืช ืฉืœ ืžืืกื˜ืจ ืžื”ื•ื“ื• ืฉื˜ื•ืคืช ื”ืฉืžืฉ.

ื›ืขืช, ืœืฉื ื”ืฉื•ื•ืื” ืœ-Get-View, ื ื™ืงื— ืืช ื”-cmdlet Get-VM: ื”ื•ื ื ื™ื’ืฉ ืœืžื›ื•ื ื” ื”ื•ื•ื™ืจื˜ื•ืืœื™ืช ื•ืžื—ื–ื™ืจ ืื•ื‘ื™ื™ืงื˜ ืžื•ืจื›ื‘, ื›ืœื•ืžืจ, ื”ื•ื ืžืฆืจืฃ ืืœื™ื• ืื•ื‘ื™ื™ืงื˜ื™ื ืงืฉื•ืจื™ื ืื—ืจื™ื: VMHost, Datastore ื•ื›ื•'.  

Get-View ื‘ืžืงื•ืžื• ืื™ื ื• ืžื•ืกื™ืฃ ืฉื•ื ื“ื‘ืจ ืžื™ื•ืชืจ ืœืื•ื‘ื™ื™ืงื˜ ื”ืžื•ื—ื–ืจ. ื™ืชืจ ืขืœ ื›ืŸ, ื–ื” ืžืืคืฉืจ ืœื ื• ืœืฆื™ื™ืŸ ื‘ืงืคื“ื ื•ืช ืื™ื–ื” ืžื™ื“ืข ืื ื—ื ื• ืฆืจื™ื›ื™ื, ืžื” ืฉื™ืงืœ ืขืœ ืื•ื‘ื™ื™ืงื˜ ื”ืคืœื˜. ื‘-Windows Server ื‘ื›ืœืœ ื•ื‘-Hyper-V ื‘ืคืจื˜, ื”-cmdlet Get-WMIObject ื”ื•ื ืื ืœื•ื’ื™ ื™ืฉื™ืจ - ื”ืจืขื™ื•ืŸ ื–ื”ื” ืœื—ืœื•ื˜ื™ืŸ.

Get-View ืื™ื ื• ื ื•ื— ืขื‘ื•ืจ ืคืขื•ืœื•ืช ืฉื’ืจืชื™ื•ืช ืขืœ ืื•ื‘ื™ื™ืงื˜ื™ื ื ืงื•ื“ืชื™ื™ื. ืื‘ืœ ื›ืฉืžื“ื•ื‘ืจ ื‘ืืœืคื™ ื•ืขืฉืจื•ืช ืืœืคื™ ื—ืคืฆื™ื, ืื™ืŸ ืœื–ื” ืžื—ื™ืจ.

ืืชื” ื™ื›ื•ืœ ืœืงืจื•ื ืขื•ื“ ื‘ื‘ืœื•ื’ VMware: ืžื‘ื•ื ืœ-Get-View

ืขื›ืฉื™ื• ืื ื™ ืืจืื” ืœืš ื”ื›ืœ ื‘ืืžืฆืขื•ืช ืžืงืจื” ืืžื™ืชื™. 

ื›ืชื™ื‘ืช ืกืงืจื™ืคื˜ ืœืคืจื™ืงืช VM

ื™ื•ื ืื—ื“ ืขืžื™ืช ืฉืœื™ ื‘ื™ืงืฉ ืžืžื ื™ ืœื‘ืฆืข ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ื”ืชืกืจื™ื˜ ืฉืœื•. ื”ืžืฉื™ืžื” ื”ื™ื ืฉื’ืจื” ื ืคื•ืฆื”: ืžืฆื ืืช ื›ืœ ื”-VMs ืขื ืคืจืžื˜ืจ cloud.uuid ืžืฉื•ื›ืคืœ (ื›ืŸ, ื–ื” ืืคืฉืจื™ ื‘ืขืช ืฉื™ื‘ื•ื˜ VM ื‘-vCloud Director). 

ื”ืคืชืจื•ืŸ ื”ื‘ืจื•ืจ ืฉืขื•ืœื” ื‘ืจืืฉ ื”ื•ื:

  1. ืงื‘ืœ ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”-VMs.
  2. ืชื ืชื— ืืช ื”ืจืฉื™ืžื” ืื™ื›ืฉื”ื•.

ื”ื’ืจืกื” ื”ืžืงื•ืจื™ืช ื”ื™ื™ืชื” ื”ืชืกืจื™ื˜ ื”ืคืฉื•ื˜ ื”ื–ื”:

function Get-CloudUUID1 {
   # ะŸะพะปัƒั‡ะฐะตะผ ัะฟะธัะพะบ ะฒัะตั… ะ’ะœ
   $vms = Get-VM
   $report = @()

   # ะžะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตะผ ะบะฐะถะดั‹ะน ะพะฑัŠะตะบั‚, ะฟะพะปัƒั‡ะฐั ะธะท ะฝะตะณะพ ั‚ะพะปัŒะบะพ 2 ัะฒะพะนัั‚ะฒะฐ: ะ˜ะผั ะ’ะœ ะธ Cloud UUID.
   # ะ—ะฐะฝะพัะธะผ ะดะฐะฝะฝั‹ะต ะฒ ะฝะพะฒั‹ะน PS-ะพะฑัŠะตะบั‚ ั ะฟะพะปัะผะธ VM ะธ UUID
   foreach ($vm in $vms)
   {
       $table = "" | select VM,UUID

       $table.VM = $vm.name
       $table.UUID = ($vm | Get-AdvancedSetting -Name cloud.uuid).Value
          
       $report += $table
   }
# ะ’ะพะทะฒั€ะฐั‰ะฐะตะผ ะฒัะต ะพะฑัŠะตะบั‚ั‹
   $report
}
# ะ”ะฐะปะตะต ะ ะฃะšะะœะ˜ ะฟะฐั€ัะธะผ ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ั€ะตะทัƒะปัŒั‚ะฐั‚

ื”ื›ืœ ืคืฉื•ื˜ ื•ื‘ืจื•ืจ ื‘ืžื™ื•ื—ื“. ืืคืฉืจ ืœื›ืชื•ื‘ ืืช ื–ื” ืชื•ืš ื›ืžื” ื“ืงื•ืช ืขื ื”ืคืกืงืช ืงืคื”. ื”ื‘ืจื’ ืืช ื”ืกื™ื ื•ืŸ ื•ื–ื” ื ื’ืžืจ.

ืื‘ืœ ื‘ื•ืื• ื ืžื“ื•ื“ ืืช ื”ื–ืžืŸ:

ื›ื™ืฆื“ ืœื‘ื ื•ืช ืžืื™ืฅ ืจืงื˜ื” ืขื‘ื•ืจ ืกืงืจื™ืคื˜ื™ื ืฉืœ PowerCLI

ื›ื™ืฆื“ ืœื‘ื ื•ืช ืžืื™ืฅ ืจืงื˜ื” ืขื‘ื•ืจ ืกืงืจื™ืคื˜ื™ื ืฉืœ PowerCLI

2 ื“ืงื•ืช 47 ืฉื ื™ื•ืช ื›ืืฉืจ ืžืขื‘ื“ื™ื ื›ืžืขื˜ 10 VMs. ื‘ื•ื ื•ืก ื”ื•ื ื”ื™ืขื“ืจ ืžืกื ื ื™ื ื•ื”ืฆื•ืจืš ื‘ืžื™ื•ืŸ ื™ื“ื ื™ ืฉืœ ื”ืชื•ืฆืื•ืช. ื‘ืจื•ืจ ืฉื”ืชืกืจื™ื˜ ื“ื•ืจืฉ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”.

ืžืจื—ื‘ื™ ืจื™ืฆื” ื”ื ื”ืจืืฉื•ื ื™ื ืœืขื–ืจื” ื›ืืฉืจ ืืชื” ืฆืจื™ืš ืœื”ืฉื™ื’ ื‘ื• ื–ืžื ื™ืช ืžื“ื“ื™ ืžืืจื— ืž-vCenter ืื• ืฆืจื™ืš ืœืขื‘ื“ ืขืฉืจื•ืช ืืœืคื™ ืื•ื‘ื™ื™ืงื˜ื™ื. ื‘ื•ืื• ื ืจืื” ืžื” ื”ื’ื™ืฉื” ื”ื–ื• ืžื‘ื™ืื”.

ื”ืคืขืœ ืืช ื”ืžื”ื™ืจื•ืช ื”ืจืืฉื•ื ื”: PowerShell Runspaces

ื”ื“ื‘ืจ ื”ืจืืฉื•ืŸ ืฉืขื•ืœื” ืขืœ ื”ื“ืขืช ืขื‘ื•ืจ ืกืงืจื™ืคื˜ ื–ื” ื”ื•ื ืœื‘ืฆืข ืืช ื”ืœื•ืœืื” ืœื ื‘ืจืฆืฃ, ืืœื ื‘ืฉืจืฉื•ืจื™ื ืžืงื‘ื™ืœื™ื, ืœืืกื•ืฃ ืืช ื›ืœ ื”ื ืชื•ื ื™ื ืœืื•ื‘ื™ื™ืงื˜ ืื—ื“ ื•ืœืกื ืŸ ืื•ืชื. 

ืื‘ืœ ื™ืฉ ื‘ืขื™ื”: PowerCLI ืœื ื™ืืคืฉืจ ืœื ื• ืœืคืชื•ื— ื”ืจื‘ื” ื”ืคืขืœื•ืช ืขืฆืžืื™ื•ืช ืœ-vCenter ื•ืชื–ืจื•ืง ืฉื’ื™ืื” ืžืฆื—ื™ืงื”:

You have modified the global:DefaultVIServer and global:DefaultVIServers system variables. This is not allowed. Please reset them to $null and reconnect to the vSphere server.

ื›ื“ื™ ืœืคืชื•ืจ ื–ืืช, ืชื—ื™ืœื” ืขืœื™ืš ืœื”ืขื‘ื™ืจ ืžื™ื“ืข ืขืœ ื”ืคืขืœื” ื‘ืชื•ืš ื”ื–ืจื. ื”ื‘ื” ื ื–ื›ื•ืจ ืฉ-PowerShell ืขื•ื‘ื“ ืขื ืื•ื‘ื™ื™ืงื˜ื™ื ืฉื ื™ืชืŸ ืœื”ืขื‘ื™ืจ ื›ืคืจืžื˜ืจ ืœืคื•ื ืงืฆื™ื” ืื• ืœ-ScriptBlock. ื‘ื•ืื• ื ืขื‘ื™ืจ ืืช ื”ื”ืคืขืœื” ื‘ืฆื•ืจื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ ื›ื–ื”, ืชื•ืš ืขืงื™ืคืช $global:DefaultVIServers (ื”ืชื—ื‘ืจ-VIServer ืขื ืžืคืชื— -NotDefault):

$ConnectionString = @()
foreach ($vCenter in $vCenters)
   {
       try {
           $ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -AllLinked -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
       }
       catch {
           if ($er.Message -like "*not part of a linked mode*")
           {
               try {
                   $ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
               }
               catch {
                   throw $_
               }
              
           }
           else {
               throw $_
           }
       }
   }

ืขื›ืฉื™ื• ื‘ื•ืื• ืœื™ื™ืฉื ืจื™ื‘ื•ื™ ืฉืจืฉื•ืจื™ื ื“ืจืš Runspace Pools.  

ื”ืืœื’ื•ืจื™ืชื ื”ื•ื ื›ื“ืœืงืžืŸ:

  1. ืื ื• ืžืงื‘ืœื™ื ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”-VMs.
  2. ื‘ื–ืจืžื™ื ืžืงื‘ื™ืœื™ื ืื ื—ื ื• ืžืงื‘ืœื™ื cloud.uuid.
  3. ืื ื• ืื•ืกืคื™ื ื ืชื•ื ื™ื ืžื–ืจืžื™ื ืœืื•ื‘ื™ื™ืงื˜ ืื—ื“.
  4. ืื ื• ืžืกื ื ื™ื ืืช ื”ืื•ื‘ื™ื™ืงื˜ ืขืœ ื™ื“ื™ ืงื™ื‘ื•ืฅ ืื•ืชื• ืœืคื™ ื”ืขืจืš ืฉืœ ืฉื“ื” CloudUUID: ืืœื” ืฉื‘ื”ื ืžืกืคืจ ื”ืขืจื›ื™ื ื”ื™ื™ื—ื•ื“ื™ื™ื ื’ื“ื•ืœ ืž-1 ื”ื ื”-VMs ืฉืื ื• ืžื—ืคืฉื™ื.

ื›ืชื•ืฆืื” ืžื›ืš, ืื ื• ืžืงื‘ืœื™ื ืืช ื”ืชืกืจื™ื˜:


function Get-VMCloudUUID {
   param (
       [string[]]
       [ValidateNotNullOrEmpty()]
       $vCenters = @(),
       [int]$MaxThreads,
       [System.Management.Automation.PSCredential]
       [System.Management.Automation.Credential()]
       $Credential
   )

   $ConnectionString = @()

   # ะกะพะทะดะฐะตะผ ะพะฑัŠะตะบั‚ ั ัะตััะธะพะฝะฝั‹ะผ ะบะปัŽั‡ะพะผ
   foreach ($vCenter in $vCenters)
   {
       try {
           $ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -AllLinked -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
       }
       catch {
           if ($er.Message -like "*not part of a linked mode*")
           {
               try {
                   $ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
               }
               catch {
                   throw $_
               }
              
           }
           else {
               throw $_
           }
       }
   }

   # ะŸะพะปัƒั‡ะฐะตะผ ัะฟะธัะพะบ ะฒัะตั… ะ’ะœ
   $Global:AllVMs = Get-VM -Server $ConnectionString

   # ะŸะพะตั…ะฐะปะธ!
   $ISS = [system.management.automation.runspaces.initialsessionstate]::CreateDefault()
   $RunspacePool = [runspacefactory]::CreateRunspacePool(1, $MaxThreads, $ISS, $Host)
   $RunspacePool.ApartmentState = "MTA"
   $RunspacePool.Open()
   $Jobs = @()

# ScriptBlock ั ะผะฐะณะธะตะน!)))
# ะ˜ะผะตะฝะฝะพ ะพะฝ ะฑัƒะดะตั‚ ะฒั‹ะฟะพะปะฝัั‚ัŒัั ะฒ ะฟะพั‚ะพะบะต
   $scriptblock = {
       Param (
       $ConnectionString,
       $VM
       )

       $Data = $VM | Get-AdvancedSetting -Name Cloud.uuid -Server $ConnectionString | Select-Object @{N="VMName";E={$_.Entity.Name}},@{N="CloudUUID";E={$_.Value}},@{N="PowerState";E={$_.Entity.PowerState}}

       return $Data
   }
# ะ“ะตะฝะตั€ะธั€ัƒะตะผ ะฟะพั‚ะพะบะธ

   foreach($VM in $AllVMs)
   {
       $PowershellThread = [PowerShell]::Create()
# ะ”ะพะฑะฐะฒะปัะตะผ ัะบั€ะธะฟั‚
       $null = $PowershellThread.AddScript($scriptblock)
# ะ˜ ะพะฑัŠะตะบั‚ั‹, ะบะพั‚ะพั€ั‹ะต ะฟะตั€ะตะดะฐะดะธะผ ะฒ ะบะฐั‡ะตัั‚ะฒะต ะฟะฐั€ะฐะผะตั‚ั€ะพะฒ ัะบั€ะธะฟั‚ัƒ
       $null = $PowershellThread.AddArgument($ConnectionString)
       $null = $PowershellThread.AddArgument($VM)
       $PowershellThread.RunspacePool = $RunspacePool
       $Handle = $PowershellThread.BeginInvoke()
       $Job = "" | Select-Object Handle, Thread, object
       $Job.Handle = $Handle
       $Job.Thread = $PowershellThread
       $Job.Object = $VM.ToString()
       $Jobs += $Job
   }

# ะกั‚ะฐะฒะธะผ ะณั€ะฐะดัƒัะฝะธะบ, ั‡ั‚ะพะฑั‹ ะฝะฐะณะปัะดะฝะพ ะพั‚ัะปะตะถะธะฒะฐั‚ัŒ ะฒั‹ะฟะพะปะฝะตะฝะธะต ะทะฐะดะฐะฝะธะน
# ะ˜ ะทะดะตััŒ ะถะต ะฟั€ะธะฑะธะฒะฐะตะผ ะพั‚ั€ะฐะฑะพั‚ะฐะฒัˆะธะต ะทะฐะดะฐะฝะธั
   While (@($Jobs | Where-Object {$_.Handle -ne $Null}).count -gt 0)
   {
       $Remaining = "$($($Jobs | Where-Object {$_.Handle.IsCompleted -eq $False}).object)"

       If ($Remaining.Length -gt 60) {
           $Remaining = $Remaining.Substring(0,60) + "..."
       }

       Write-Progress -Activity "Waiting for Jobs - $($MaxThreads - $($RunspacePool.GetAvailableRunspaces())) of $MaxThreads threads running" -PercentComplete (($Jobs.count - $($($Jobs | Where-Object {$_.Handle.IsCompleted -eq $False}).count)) / $Jobs.Count * 100) -Status "$(@($($Jobs | Where-Object {$_.Handle.IsCompleted -eq $False})).count) remaining - $remaining"

       ForEach ($Job in $($Jobs | Where-Object {$_.Handle.IsCompleted -eq $True})){
           $Job.Thread.EndInvoke($Job.Handle)     
           $Job.Thread.Dispose()
           $Job.Thread = $Null
           $Job.Handle = $Null
       }
   }

   $RunspacePool.Close() | Out-Null
   $RunspacePool.Dispose() | Out-Null
}


function Get-CloudUUID2
{
   [CmdletBinding()]
   param(
   [string[]]
   [ValidateNotNullOrEmpty()]
   $vCenters = @(),
   [int]$MaxThreads = 50,
   [System.Management.Automation.PSCredential]
   [System.Management.Automation.Credential()]
   $Credential)

   if(!$Credential)
   {
       $Credential = Get-Credential -Message "Please enter vCenter credentials."
   }

   # ะ’ั‹ะทะพะฒ ั„ัƒะฝะบั†ะธะธ Get-VMCloudUUID, ะณะดะต ะผั‹ ั€ะฐัะฟะฐั€ะฐะปะปะตะปะธะฒะฐะตะผ ะพะฟะตั€ะฐั†ะธัŽ
   $AllCloudVMs = Get-VMCloudUUID -vCenters $vCenters -MaxThreads $MaxThreads -Credential $Credential
   $Result = $AllCloudVMs | Sort-Object Value | Group-Object -Property CloudUUID | Where-Object -FilterScript {$_.Count -gt 1} | Select-Object -ExpandProperty Group
   $Result
}

ื”ื™ื•ืคื™ ื‘ืกืงืจื™ืคื˜ ื”ื–ื” ื”ื•ื ืฉื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ื‘ืžืงืจื™ื ื“ื•ืžื™ื ืื—ืจื™ื ืคืฉื•ื˜ ืขืœ ื™ื“ื™ ื”ื—ืœืคืช ื”-ScriptBlock ื•ื”ืคืจืžื˜ืจื™ื ืฉื™ื•ืขื‘ืจื• ืœื–ืจื. ื ืฆืœ ืืช ื–ื”!

ืื ื• ืžื•ื“ื“ื™ื ื–ืžืŸ:

ื›ื™ืฆื“ ืœื‘ื ื•ืช ืžืื™ืฅ ืจืงื˜ื” ืขื‘ื•ืจ ืกืงืจื™ืคื˜ื™ื ืฉืœ PowerCLI

55 ืฉื ื™ื•ืช. ื–ื” ื˜ื•ื‘ ื™ื•ืชืจ, ืื‘ืœ ื–ื” ืขื“ื™ื™ืŸ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžื”ื™ืจ ื™ื•ืชืจ. 

ื‘ื•ืื• ื ืขื‘ื•ืจ ืœืžื”ื™ืจื•ืช ื”ืฉื ื™ื™ื”: GetView

ื‘ื•ืื• ืœื’ืœื•ืช ืžื” ืœื ื‘ืกื“ืจ.
ื‘ืจืืฉ ื•ื‘ืจืืฉื•ื ื”, ื”-cmdlet Get-VM ืœื•ืงื— ื”ืจื‘ื” ื–ืžืŸ ืœื‘ื™ืฆื•ืข.
ืฉื ื™ืช, ื”-cmdlet Get-AdvancedOptions ืœื•ืงื— ืขื•ื“ ื™ื•ืชืจ ื–ืžืŸ.
ื‘ื•ื ื ืชืžื•ื“ื“ ืงื•ื“ื ื›ืœ ืขื ื”ืฉื ื™. 

Get-AdvancedOptions ื ื•ื— ืœืื•ื‘ื™ื™ืงื˜ื™ื VM ื‘ื•ื“ื“ื™ื, ืืš ืžื’ื•ืฉื ืžืื•ื“ ื›ืืฉืจ ืขื•ื‘ื“ื™ื ืขื ืื•ื‘ื™ื™ืงื˜ื™ื ืจื‘ื™ื. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืงื‘ืœ ืืช ืื•ืชื• ืžื™ื“ืข ืžืื•ื‘ื™ื™ืงื˜ ื”ืžื›ื•ื ื” ื”ื•ื•ื™ืจื˜ื•ืืœื™ืช ืขืฆืžื” (Get-VM). ื–ื” ืคืฉื•ื˜ ืงื‘ื•ืจ ื”ื™ื˜ื‘ ื‘ืื•ื‘ื™ื™ืงื˜ ExtensionData. ื—ืžื•ืฉื™ื ื‘ืกื™ื ื•ืŸ, ืื ื• ืžืื™ืฆื™ื ืืช ืชื”ืœื™ืš ื”ืฉื’ืช ื”ื ืชื•ื ื™ื ื”ื“ืจื•ืฉื™ื.

ื‘ืชื ื•ืขื” ืงืœื” ืฉืœ ื”ื™ื“ ื–ื”:


VM | Get-AdvancedSetting -Name Cloud.uuid -Server $ConnectionString | Select-Object @{N="VMName";E={$_.Entity.Name}},@{N="CloudUUID";E={$_.Value}},@{N="PowerState";E={$_.Entity.PowerState}}

ื”ื•ืคืš ืœื–ื”:


$VM | Where-Object {($_.ExtensionData.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value -ne $null} | Select-Object @{N="VMName";E={$_.Name}},@{N="CloudUUID";E={($_.ExtensionData.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value}},@{N="PowerState";E={$_.summary.runtime.powerstate}}

ื”ืคืœื˜ ื–ื”ื” ืœ-Get-AdvancedOptions, ืื‘ืœ ื”ื•ื ืขื•ื‘ื“ ื”ืจื‘ื” ืคืขืžื™ื ืžื”ืจ ื™ื•ืชืจ. 

ืขื›ืฉื™ื• ืœ-Get-VM. ื–ื” ืœื ืžื”ื™ืจ ื›ื™ ื”ื•ื ืขื•ืกืง ื‘ื—ืคืฆื™ื ืžื•ืจื›ื‘ื™ื. ืžืชืขื•ืจืจืช ืฉืืœื” ื”ื’ื™ื•ื ื™ืช: ืžื“ื•ืข ืื ื• ื–ืงื•ืงื™ื ืœืžื™ื“ืข ื ื•ืกืฃ ื•ืœ-PSObject ืžืคืœืฆืชื™ ื‘ืžืงืจื” ื–ื”, ื›ืืฉืจ ืื ื• ืจืง ืฆืจื™ื›ื™ื ืืช ื”ืฉื ืฉืœ ื”-VM, ื”ืžืฆื‘ ืฉืœื• ื•ื”ืขืจืš ืฉืœ ืชื›ื•ื ื” ืžืกื•ื‘ื›ืช?  

ื‘ื ื•ืกืฃ, ื”ืžื›ืฉื•ืœ ื‘ื“ืžื•ืช Get-AdvancedOptions ื”ื•ืกืจ ืžื”ืกืงืจื™ืคื˜. ื”ืฉื™ืžื•ืฉ ื‘-Runspace Pools ื ืจืื” ื›ืขืช ื›ืžื• ืžื•ื’ื–ื ืžื›ื™ื•ื•ืŸ ืฉืื™ืŸ ืขื•ื“ ืฆื•ืจืš ืœื”ืงื‘ื™ืœ ืžืฉื™ืžื” ืื™ื˜ื™ืช ืขืœ ืคื ื™ ื—ื•ื˜ื™ ืกืงื•ื•ืื˜ ื‘ืขืช ื”ืขื‘ืจืช ืกืฉืŸ. ื”ื›ืœื™ ื˜ื•ื‘, ืื‘ืœ ืœื ืœืžืงืจื” ื”ื–ื”. 

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื”ืคืœื˜ ืฉืœ ExtensionData: ื–ื” ืœื ื™ื•ืชืจ ืžืื•ื‘ื™ื™ืงื˜ Get-View. 

ื‘ื•ืื• ื ืชืงืฉืจ ืœื˜ื›ื ื™ืงื” ื”ืขืชื™ืงื” ืฉืœ ืžืืกื˜ืจื™ PowerShell: ืฉื•ืจื” ืื—ืช ื‘ืืžืฆืขื•ืช ืžืกื ื ื™ื, ืžื™ื•ืŸ ื•ืงื™ื‘ื•ืฅ. ื›ืœ ื”ื–ื•ื•ืขื” ื”ืงื•ื“ืžืช ืžืžื•ื˜ื˜ืช ื‘ืืœื’ื ื˜ื™ื•ืช ืœืฉื•ืจื” ืื—ืช ื•ืžื‘ื•ืฆืขืช ื‘ืกืฉืŸ ืื—ื“:


$AllVMs = Get-View -viewtype VirtualMachine -Property Name,Config.ExtraConfig,summary.runtime.powerstate | Where-Object {($_.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value -ne $null} | Select-Object @{N="VMName";E={$_.Name}},@{N="CloudUUID";E={($_.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value}},@{N="PowerState";E={$_.summary.runtime.powerstate}} | Sort-Object CloudUUID | Group-Object -Property CloudUUID | Where-Object -FilterScript {$_.Count -gt 1} | Select-Object -ExpandProperty Group

ืื ื• ืžื•ื“ื“ื™ื ื–ืžืŸ:

ื›ื™ืฆื“ ืœื‘ื ื•ืช ืžืื™ืฅ ืจืงื˜ื” ืขื‘ื•ืจ ืกืงืจื™ืคื˜ื™ื ืฉืœ PowerCLI

9 ืฉื ื™ื•ืช ืขื‘ื•ืจ ื›ืžืขื˜ 10k ืื•ื‘ื™ื™ืงื˜ื™ื ืขื ืกื™ื ื•ืŸ ืœืคื™ ื”ืžืฆื‘ ื”ืจืฆื•ื™. ื’ื“ื•ืœ!

ื‘ืžืงื•ื ืžืกืงื ื”

ืชื•ืฆืื” ืžืงื•ื‘ืœืช ืชืœื•ื™ื” ื™ืฉื™ืจื•ืช ื‘ื‘ื—ื™ืจืช ื”ื›ืœื™. ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืงืฉื” ืœื•ืžืจ ื‘ื•ื•ื“ืื•ืช ืžื” ื‘ื“ื™ื•ืง ืฆืจื™ืš ืœื‘ื—ื•ืจ ื›ื“ื™ ืœื”ืฉื™ื’ ื–ืืช. ื›ืœ ืื—ืช ืžื”ืฉื™ื˜ื•ืช ื”ืžืคื•ืจื˜ื•ืช ืœื”ืืฆืช ืกืงืจื™ืคื˜ื™ื ื˜ื•ื‘ื” ื‘ื’ื‘ื•ืœื•ืช ื”ื™ืฉื™ืžื•ืช ืฉืœื”. ืื ื™ ืžืงื•ื•ื” ืฉืžืืžืจ ื–ื” ื™ืขื–ื•ืจ ืœืš ื‘ืžืฉื™ืžื” ื”ืงืฉื” ืฉืœ ื”ื‘ื ืช ื”ื™ืกื•ื“ื•ืช ืฉืœ ืื•ื˜ื•ืžืฆื™ื” ื•ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ืชื”ืœื™ื›ื™ื ื‘ืชืฉืชื™ืช ืฉืœืš.

PS: ื”ืžื—ื‘ืจ ืžื•ื“ื” ืœื›ืœ ื—ื‘ืจื™ ื”ืงื”ื™ืœื” ืขืœ ื”ืขื–ืจื” ื•ื”ืชืžื™ื›ื” ื‘ื”ื›ื ืช ื”ืžืืžืจ. ื’ื ืืœื” ืขื ื›ืคื•ืช. ื•ืืคื™ืœื• ืžื™ ืฉืื™ืŸ ืœื• ืจื’ืœื™ื™ื, ื›ืžื• ืžื›ื•ื•ืฅ ื‘ื•ืื”.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”