PowerShell 3: Ulepszony remoting (1).
PowerShell remoting to funkcja, która pojawiła się wraz z premierą PowerShella w wersji 2. Wersja 3 przynosi znaczne zmiany w jej działaniu, dzięki którym z całą pewnością łatwiej będzie z niej korzystać: zarówno na poziomie konfiguracji, jak i późniejszego użytkowania. W tym poście skupię się na zmianach funkcjonalnych: jak zmieniły się możliwości remotingu w PowerShellu.
A kto umarł…
Remoting w poprzedniej wersji był mało odporny na przerwy w działaniu sieci: przerwa taka mogła skutkować tym, że traciliśmy połączenie ze zdalnym serwerem lub wyniki wykonywanego ostatnio polecenia. W nowej wersji sytuacja zmieniła się: PowerShell będzie z jednej strony podtrzymywał sesję, z drugiej zaś – próbować będzie na nowo się połączyć. Czasu mamy i dużo, i mało. 3-4 minuty miną, zanim nasza sesja “umrze” śmiercią naturalną. Oczywiście, nie musimy domyślać się, że coś niedobrego się dzieje: prezentacja zależeć będzie od wykorzystywanego przez nas hosta, np. ISE o problemie informuje wyłącznie przy pomocy komunikatów “WARNING”:
Widać tu wyraźnie, że operacja w trakcie braku sieci nadal była wykonywana, tylko jej wynik zwrócony został dopiero po odzyskaniu połączenia. A co jeśli połączenie chcemy zerwać świadomie, na nieco dłużej nić kilka minut? Również to jest możliwe.
PowerShell screen
Gdy łączę się zdalnie przy pomocy SSH z dowolnym hostem opartym o *nixy, to jeśli tylko mam taką możliwość – od razu startuję screen. Dzięki temu nie muszę się w ogóle martwić tym, czy sieć mi padnie, albo przypadkiem zamknę okno z klientem SSH. Tego poziomu wygody w PowerShellu 3 jeszcze nie uzyskamy (nadal zamknięcie okna może być ryzykowne) ale przynajmniej są pewne zwiastuny zmian w dobrym kierunku. Sesje bowiem są od tej wersji zapisywane po stronie maszyny, z którą się łączymy. Daje nam to dużą elastyczność: istniejącą sesję możemy rozłączyć, a następnie połączyć się z nią ponownie. Sesję “uruchamiającą” możemy spokojnie zamknąć, komputer wyłączyć a połączenie odtworzyć na zupełnie innym urządzeniu. Ważne jest, że działa to tylko z sesjami utworzonymi przez New-PSSession. Nie da się tego zrobić z tymczasową sesją stworzoną przy pomocy Enter-PSSession –ComputerName MojSerwer.
Spójrzmy jak to działa. Najpierw tworzymy “imienną” sesję i łączymy się z nią:
New-PSSession -ComputerName 192.168.100.202 -Name Test Enter-PSSession -Name Test
Gdy z jakiegoś powodu zechcemy się z sesją rozłączyć, wychodzimy z niej i rozłączamy:
Disconnect-PSSession -Name Test
Później z dowolnego komputera (oczywiście, z zainstalowanym PowerShellem 3) możemy się z taką końcówką połączyć i kontynuować pracę:
Get-PSSession -ComputerName 192.168.100.202 Connect-PSSession -ComputerName 192.168.100.202 -Name Test Enter-PSSession -Name Test
Ważne jest, by prawidłowo intepretować stan oraz dostępność sesji i wiedzieć, gdzie jej szukać. Get-PSSession zwróci bowiem “lokalne” sesje tylko wtedy, gdy nie podamy nic w parametrze ComputerName. Jeśli podamy nazwę komputera – wyświetlone zostaną tylko sesje, które są z tym komputerem połączone. Get-PSSession –ComputerName . wyświetli więc tylko sesje (utworzone przy pomocy naszych poświadczeń) na naszym komputerze. Stan pozwala ustalić czy dana sesja jest otwarta, rozłączona czy też uszkodzona. Dostępność pozwala ustalić czy wybrana sesja nie jest przypadkiem “podpięta” do innej sesji. Dobrze więc dla nas gdy jest ‘Available’ bądź ‘None’, gorzej gdy jest ‘Busy’.
Warto też wspomnieć, że taka sesja domyślnie czekać na nas będzie 2 godziny. Co jeśli chcemy czas ten wydłużyć? Sposobów zmiany domyślnych ustawień jest kilka, ale chyba najprostszy to podanie odpowiedniej wartości podczas rozłączania sesji:
Disconnect-PSSession -Name Test -IdleTimeoutSec (3600 * 24) | Format-Table -AutoSize Name, State, IdleTimeout
I tym optymistycznym akcentem kończę tego posta. Choć przyznać trzeba, że jeszcze sporo informacji przed nami, nawet tematu korzystania z remotingu nie udało mi się dziś wyczerpać…