Dnes bych se rád zaměřil trošku více na zkoumání fungování PowerShellu. Čím dál tím častěji se mi stává, že některý z klientů či kolegů potřebuje pomoci s kouskem kódu v PowerShellu. Většinou pro správu mě „neznámé“ technologie. Neznámé = není mou primární oblastí zájmu (SharePoint, Lync, Exchange, …). Pak je pro mne nutné co nejdříve proniknout do fungování produktu a zjistit, jak vlastně mohu PowerShell v určitém scénáři použít. Nedávno jsem si vzpomněl na jednu mou starou příhodu s Hyper-V. Zkusím na příkladu demonstrovat, jak jsem postupoval a budu rád, když kolem tématu vznikne diskuse.
Předesílám, že jsem si zadal, že úkol vyřeším pouze pomocí PowerShellu a nebudu otevírat prohlížeč. I když – možná jsem mohl trochu podvádět a použít:
PS> Invoke-WebRequest -Uri 'http://www.bing.com/search?q=hyper-v+snapshot' | Select -Expand links | where href -like 'http*' | Format-List innerText, href
innerText : Hyper-V Virtual Machine Snapshots: FAQ - Resources and Tools for ...
href : http://technet.microsoft.com/en-us/library/dd560637(v=WS.10).aspx
.. zkráceno
A výsledky dále zpracovat ve smyčce. Možná si to nechám jako zajímavé cvičení pro příště.
Potřeboval jsem si uložit VHD soubory pro všechny své virtuální počítače a tyto soubory pak poslat dál pro další použití. Rozhodl jsem se udělat ze všech VM snapshoty a aktuální verzi poté vyexportovat. Vezměme si tedy Hyper-V modul jako černou skříňku, o které toho moc nevíme. Úmyslně budu v následujících řádcích používat aliasy a další „zkracovadla“ tak, jak jsem je (asi – přeci jen je to již dlouho) tenkrát použil.
PS>gmo hyper-v
ModuleType Name ExportedCommands
---------- ---- ----------------
Binary Hyper-V {Add-VMDvdDrive, Add-VMFibreChannelHba, …
Aha – modul bychom měli, co s ním vlastně můžeme dělat?
PS>gcm -m hyper-v
CommandType Name ModuleName
----------- ---- ----------
Cmdlet Add-VMDvdDrive Hyper-V
Cmdlet Add-VMFibreChannelHba Hyper-V
Cmdlet Add-VMHardDiskDrive Hyper-V
… dlouhý seznam
Zajímavé, kolik tam toho je vlastně schováno?
PS>gcm -m hyper-v | measure
Count : 164
Poznámka: V následujících výpisech budu listingy hodně zkracovat a již na to nebudu dále upozorňovat. Zkuste si projít stejný postup např. pro jiný modul.
Hmm, co všechno můžu dělat, aniž bych cokoli pokazil?
PS>gcm -verb get -m hyper-v | fw -c 4
Get-VHD Get-VM Get-VMBios Get-VMComPort Get-VMConnectAccess Get-VMDvdDrive Get-VMFibreChannelHba Get-VMFloppyDiskDrive
Vypadá to na slušný seznam, který obsahuje 40 (ověřeno dalším příkazem) cmdletů. Takže jaké tu mám VM?
PS>get-vm
Name State CPUUsage(%) MemoryAssigned(M) Uptime Status
---- ----- ----------- ----------------- ------ ------
Emulator WVGA 512MB.dmoravec Off 0 0 00:00:00 Operating normally
MT-TST-Win2012 Off 0 0 00:00:00 Operating normally
Windows Server 2012 R2 Off 0 0 00:00:00 Operating normally
Jak můžu dál použít tento cmdlet (zde můžu projít tabulátorem dostupné parametry nebo spustit help).
PS>help get-vm
SYNTAX
Get-VM [[-Name] <String[]>] [-ComputerName <String[]>] [<CommonParameters>]
Get-VM [-ClusterObject] <PSObject> [<CommonParameters>]
Get-VM [[-Id] <Guid>] [-ComputerName <String[]>] [<CommonParameters>]
OK – Name vypadá jako zajímavý parametr. Jak jsem již několikrát upozorňoval – ve většině případů vám PowerShell ve standardním zobrazení nevrátí všechny vlastnosti objektu, proto je dobrou praxí používat např. u cmdletu Format-List parametr Force.
PS>get-vm -Name mt-tst-win2012 | fl *
VMName : MT-TST-Win2012
VMId : 8fe1a348-310b-4e28-b6cd-3e015809cbc0
Id : 8fe1a348-310b-4e28-b6cd-3e015809cbc0
Name : MT-TST-Win2012
State : Off
OperationalStatus : {Ok}
PrimaryOperationalStatus : Ok
SecondaryOperationalStatus :
StatusDescriptions : {Operating normally}
ParentSnapshotId :
ParentSnapshotName :
Výpis nám vrátí téměř 60 různých vlastností. Z výpisu je vidět, že tato VM nemá zatím žádný snapshot. Dobrá, můžeme tedy zkusit nějaký vytvořit.
Z předchozích výpisů víme, že existuje cmdlet Get-VMSnapshot, tak si zkusíme zobrazit všechny cmdlety pracující se snapshoty.
PS>gcm -m hyper-v -No vmsnapshot
CommandType Name ModuleName
----------- ---- ----------
Cmdlet Export-VMSnapshot Hyper-V
Cmdlet Get-VMSnapshot Hyper-V
Cmdlet Remove-VMSnapshot Hyper-V
Cmdlet Rename-VMSnapshot Hyper-V
Cmdlet Restore-VMSnapshot Hyper-V
Hmm, ve výpisu evidentně chybí očekávaný cmdlet New-VMSnapshot. Není zde ani žádný Set ani jiný podobný. Co nám říká help u Get-VMSnapshot? Ve většině nápověd obsahuje sekce RELATED LINKS cmdlety, které jsou v nějakému vztahu k zobrazovanému.
PS>help get-vm
RELATED LINKS
REMARKS
Tak zde by zasloužil Hyper-V team poprvé za uši. Pohledem do ostatních cmdletů zjistíme, že ani v nich nic není. Tak zkusíme obecnější dotaz do nápovědy:
PS>help snapshot
Name Category Module
---- -------- ------
Export-VMSnapshot Cmdlet Hyper-V
Get-VMSnapshot Cmdlet Hyper-V
Hmm, také nic. Že by to nešlo? To mi přijde divné. V tomto kroku bych v normálním procesu otevíral prohlížeč a potřebný cmdlet bych našel během pár vteřin. Ale předsevzetí je předsevzetí. V jednom z předchozích výpisů jsme našli vlastnost popisující snapshot. Co se tak podívat na cmdlety dostupné pro vlastní VM?
PS>gcm -m hyper-v -no vm
CommandType Name ModuleName
----------- ---- ----------
Cmdlet Compare-VM Hyper-V
Cmdlet Export-VM Hyper-V
Cmdlet Get-VM Hyper-V
Cmdlet Checkpoint-VM Hyper-V
Cmdlet Import-VM Hyper-V
Ah – jeden z cmdletů má trošku povědomé jméno:
PS>help checkpoint-vm
NAME
Checkpoint-VM
SYNOPSIS
Creates a snapshot of a virtual machine.
Voila a uff. Skvělé, co tedy dál:
PS>help checkpoint-vm -exa
Example 2
PS C:\>Get-VM Test -ComputerName Server1 | Checkpoint-VM
Checkpoints virtual machine Test on Hyper-V host Server1.
Toto přesně potřebujeme. Pokus číslo 1. A další několikrát zmiňovaná pravda: parametr WhaIf je náš nejlepší přítel:
PS>get-vm | Checkpoint-VM -SnapshotName ToExport -WhatIf
What if: Checkpoint-VM will create a snapshot for virtual machine "Emulator WVGA 512MB.dmoravec".
What if: Checkpoint-VM will create a snapshot for virtual machine "MT-TST-Win2012".
What if: Checkpoint-VM will create a snapshot for virtual machine "Windows Server 2012 R2".
No, je čas na trochu dobrodružství:
PS>get-vm | Checkpoint-VM -SnapshotName ToExport
PS>get-vm | get-vmsnapshot
VMName Name SnapshotType CreationTime ParentSnapshotName
------ ---- ------------ ------------ ------------------
Windows Server 2012 R2 ToExport Standard 1. 8. 2013 16:47:03
Nyní je potřeba vytvořené snapshoty exportovat. Rychlým pohledem do helpu je nalezení potřebného cmdletu hračka: Export-VMSnapshot. Poslední kontrola:
PS>get-vm | Get-VMSnapshot -Name ToExport -ea 0 | Export-VMSnapshot -Path c:\temp -WhatIf
What if: Export-VMSnapshot will export the snapshot "ToExport".
A můžeme provést finální export:
PS>get-vm | Get-VMSnapshot -Name ToExport -ea 0 | Export-VMSnapshot -Path c:\temp –Verbose
VERBOSE: Export-VMSnapshot will export the snapshot "ToExport".
Pak už jen stačí vzít finální adresář a nahrát jej na potřebné místo.
Jak jsem předesílal na začátku. Dnešním cílem nebylo vás seznámit s nějakou novinkou, ale spíše s možností, jak lze s minimem informací dokončit práci, pokud znáte základní příkazy PowerShellu. Cmdlety Get-*, help, WhatIf jsou vaši přátelé a můžete pomocí nich zvládnout správu libovolných technologií. Ale ještě jednou opakuji to, co je mottem dnešního článku: Musíte zvládnout základy! I proto je dobré občas zabrousit do starších článků a podívat se, jak například funguje systém nápovědy.
Přeji vám hezké zkoumání