Seriál Windows PowerShell - Hrátky s Hyper-V (část 38.)

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 'https://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 : https://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í Veselý obličej

David Moravec, MVP
Mainstream Technologies