Skip to Content

IT nieuczesane.
category

Category: DevOps/Scripting

skrypty, programy, command line i inne

zarządzanie VM z hosta Hv

środowiskiem zarządza się z jakichś narzędzi infrastrukturalnych typu System Center – to oczywiście najlepszy sposób ale w pewnych warunkach mało przydatny lub niemożliwy. zarządzanie w tej warstwie jest niemal niemożliwe/totalnie skomplikowane w środowisq hostowanym – wiele domen nie powiązanych ze sobą, maszyny w podsieciach porozdzielanych VLANami, inne przestrzenie nazewnicze i tak dalej… efekt jest taki, że nawet jeśli dla narzędzi uwierzytelnienie w wielu domenach nie jest problemem, pozostaje bardzo skomplikowany schemat sieci i bezpieczeństwa – często niezależny od administratora i zarządzany przez klienta.

fajnie byłoby móc to wszystko ogarnąć z jednego, centralnego punktu – klastra Hyper-V, gdzie te wszystkie hosty sobie działają. skoro mam je w jednym miejscu logicznym się wydaje, aby z niego wykonywać pewne operacje maintenancowe czy administracyjne [oczywiście jeśli taka jest umowa z klientem]. na każdym guescie powinny być Integration Services, Hv komuniqje się z IS i … co możemy dzięki temu zrobić?

nic. w każdym razie bardzo niewiele. powód jest prosty – z założenia całość musi być bezpieczna a Hv ma być warstwą izolującą. nie bez powodu w Hv w konsoli zdalnej nie ma możliwości mountowania dysków czy nawet schowka. Hv ma pozostać możliwie najcieńszą i najbezpieczniejszą warstwą.

co zatem jednak można oraz jak sobie z takim środowiskiem poradzić?

root\virtualization

popatrzmy co nam daje WMI z poziomu hosta. skoro można coś zrobić z poziomu SCVMM to znaczy, że da się z konsoli w postaci skryptu. obszerna lista klas pozwala na pełną konfigurację i odpytanie maszyny – oczywiście od strony ‚wirtualnego hardwareu’ – czyli nadal nie to, co mnie w tej chwili interesuje, ponieważ chciałbym dostać się do OSa. i tutaj z ciekawszych klas można znaleźć:

  • MSVM_ComputerSystem – podstawowa klasa, pozwalająca dowiedzieć się czegoś o samym OS. informacje nie są jednak dostępne bezpośrednio z tego obiektu – trzeba informacje ‚wymienić’ między hostem a guestem, a robi się przy pomocy klasy…
  • Msvm_KvpExchangeComponent – to podstawowy komponent służący do wymiany informacji między hostem i guestem. dzięki kombinacji tych dwóch klas można m.in. sprawdzić: FQDN systemu, skonfigurowane adresy IP, wersję systemu i SP itp. to podstawowa klasa pozwalająca na dalszą automatyzację – nazwa maszyny wirtualnej jest zupełnie nie przydatna poza kontextem samego SCVMM/HvM. aby połączyć się czymś do VM trzeba będzie to zrobić ‚oficjalnie’ czyli via sieć. a do tego potrzebny jest IP, który można uzyskać właśnie z tej klasy.
  • kilka innych klas ‚Integration Services’ pozwalających na interakcję z wewnętrznym OSem – shutdown, timesync i VSS. szczególną uwagę zwraca – Msvm_GuestFileService i Msvm_CopyFileToGuestJob – dostępne od wersji Windows 8.1. zdaje się, że wraz z R2 będzie można w końcu normalnie kopiować pliki q: pojawia się też inne klasy sugerujące, iż ilość operacji jakie będzie można wykonać z hosta będzie się rozszerzać.

praktyka

jednym z przydatniejszych skryptów jaki często wykorzystuje jest Get-VMDetails wykorzystujący powyżej opisane klasy. importuję go jako funkcję dzięki temu na stacji zarządzającej jest zawsze dostępny:

funkcja wypluwa obiekt dzięki czemu łatwo jest potem dalej odpytywać o poszczególne atrybuty. przykładowe użycie:

środowisko

ostatecznie daje to tylko podstawowe informacje pozwalające na dalsze podłączanie się do maszyn. z samym system z tego poziomu nie zrobi się wiele więcej. nic zatem nie zastąpi odpowiednio przygotowanego środowiska tak, aby z centralnego punktu można było do maszyn się podłączyć.

można by poudostępniać sieci guest-VLAN dla hosta aby z jego poziomu dostawać się VMek. ale uważam, że to nie jest najlepszy sposób… izolację lepiej pozostawić. zależnie od polityki być może da się utworzyć stację, która będzie miała dostęp do wszystkich VLANów będące punktem styq. takim punktem mogą być  np.:

  • stacje monitorujące. np. nagios, open manage czy inne wynalazki. zależnie od polityki być może da się utworzyć stację, która będzie miała dostęp do wszystkich VLANów
  • system AV
  • system backupów
  • system dystrybucji poprawek

ponieważ klienci mogą nie wyrazić takiej zgody lub środowiska muszą być odizolowane w 1oo% z jakiś względów – pozostaje utworzenie kilq stacji w różnych sieciach, nawet jeśli wszystkie VM są na pojedynczym klastrze. fajnie byłoby mieć możliwość instalacji ‚superagenta’ – który pozwoliłby na pełny dostęp do VM z hosta po uwierzytelnieniu – IMHO jeśli ktoś ma uprawnienia/zalecenia do maintenancu maszyny, security nie powinno cierpieć szczególnie pozwalając na dodatkową metodę dostępu…

refs

suma wszystkich pestek

odwieczny problem – archiva maili. nieużywane, ale nie wolno tknąć, broń Cię Panie Wielki Kalqlatorze! bo może ktoś-kiedyś-coś-jakoś i co wtedy??

no więc serwery są zawalone pestkami. oczywiście nikt nie kontroluje co gdzie jest zbackupowane – leży więc po kilka kopii w różnych miejscach. ogrom. jak policzyć ile to zajmuje, żeby pokazać klientowi skalę problemu w cyferkach?

polecam w pierwszej kolejności sięgnąć po raporty FSRM. narzędzie jest od dawna w systemie i warto sobie o nim czasem przypomnieć. raporty/statystyki – trzeba to pamiętać – są łatwe w generowaniu, trochę trudniejsze w interpretacji.

jako przykład proponuję takie statsy:

  • „file by filegroup” i w opcjach zaawansowanych ‚Email Files’
  • oraz „least used” co by pokazać, że są to równocześnie nieużywane pliki.

nie daje to 1oo% aqracji ale na pewno są ‚na szybko’ i ‚wyglądają’ czyli dwie ważne rzeczy aby raport pokazać np. managementowi [czy adminom].

bardziej geekowe/administracyjne podejście to oczywiście powershell. najpierw łanlajner żeby zliczyć wielkość wszystkich plików typu XXX:

bardziej rozbudowane statsy pokazujące ilość plików, sumaryczną wielkość oraz ile z nich nie było używane przez ostatni rok:

Filter or Include?

i na koniec jeszcze ciekawostka. filtrować listę plików [i nie tylko] można na trzy sposoby: filter, include i late-filtering. bardziej po polsq: można zdefiniować filtr bezpośredni, można zdefiniować co ma zawierać lista [wbrew pozorom to co innego niż filtrowanie] i można zrobić listę a potem ją filtrować – której metody używać?

mi się nie chciało tego mierzyć q: ale komuś się chciało: http://tfl09.blogspot.com/2012/02/get-childitem-and-theinclude-and-filter.html . wynik: najszybszy jest filtr i to dość znacząco.

eN.

 

 

akapity w powershell i grupy uniwersalne.

zadanie: trzeba zmienić grupy globalne na uniwersalne. zadanie o tyle nietrywialne, że grupa uniwersalna, nie może być członkiem grupy globalnej. a więc nie da się po prostu zaznaczyć wielu grup [czy też przelecieć skryptem] i zmienić ich w uniwersalne, bo posypią się błędy właśnie z takim opisem. trzeba najpierw znaleźć zagnieżdżenia i zmieniać typ ‚od dołu’.[swoją drogą, to wymuszenie w Exchange 2o1o+ z grupami uniwersalnymi jest pasqdny – właśnie z powodu tego, jak trzeba się napocić z konwersją i konsekwencjami w produkcji…]

klient ma bardzo złożoną strukturę grup więc żeby sobie trochę pomóc na szybko napisałem skrypt, który rekursywnie listuje memberof… i zatrzymałem się nad głupim problemem – jak ładnie wyświetlić poziomy zagnieżdżenia? trzeba na początq wstawić jakieś spacje. szybko znalazłem funkcję ‚padleft’ tylko… że nie chciała działać. krótki test typu:

wszystko działa. tymczasem w mojej funkcji nie chce… o co c’mon? chwilę mi zajęło zanim zwróciłem uwagę na drobny szczegół – liczba, jaką się podaje, to nie długość akapitu a długość finalnego ciągu, który chcemy uzyskać. w sumie to faktycznie – tak właśnie ma działać funkcja ‚pad’! nie ‚przesuwać o’ a ‚przesuwać do‚.

finalnie skrypt wygląda tak:

i jak zwykle najwięcej czasu poszło na pierdoły q:
eN.

Hyper-v integration services

do tej pory nie miałem problemow z ‘enlightments’ – czyli Integration Services dla systemu operacyjnego do współpracy z Hyper-v. po pierwsze dla w2k3 trzeba było instalować zawsze, po drugie w2k8 i w2k8R2 mają je wbudowane.

jeśli jednak zostawi się standardowe wersje na w2k8 R2 na Hv v3 [czyli na w12] to zaczynają się dziać różne dziwne rzeczy. np. potrafi się wywyalić CSV [w eventlogu wpisy o błędach ze sterownikiem dla vhd], czasem nie działa prawidłowo sieć – mieliśmy teraz guesta, który gubił 4o% pakietów, i inne drobniejsze wypadki. a więc – jest to ważne, aby je zupdateować. a ponieważ od w2k8 są one od razu w systemie, nie zawsze się o tym pamięta. jak hurtem sprawdzić wersje IS na guestach?

dla pojedynczego hosta jest to trywialne:

get-vm |%{ echo "$($_.name) -> $($_.IntegrationServicesVersion)"}

trochę bardziej [ale nie tak znowu bardzo] kompliqje się to na clustrze. można oczywiście ręcznie wykonywać host-by-host ale bardziej pro jest zrobić to jednolinijkowcem (:

wykonanie ‘get-vm –computername <clustername>’ zwróci wyniki wyłącznie z jednego węzła. trzeba więc wylistować węzły i przekazać listę do kolejnego wykonania przytoczonego polecenia:

Get-ClusterNode -cluster <NAME>|%{get-vm -ComputerName $_ |%{echo "$($_.name) -> $($_.IntegrationServicesVersion)" } }

więcej poleceń dla klastrów:

Get-Command -Module failoverclusters

P.S. wychodzi na tym przykaładzie problem, z jakim boryka się cała idea PowerShell – podany przykład działa tylko dla w12. na w2k8 nie ma modułu dla Hv. co prawda jak cluster jest na w2k8 to i nie ma problemu z IS niemniej globalnie, jeśli chce się coś zrobić na Hv na w2k8 to trzeba sobie radzić inaczej – albo via WMI albo instalować moduły z sieci. a jeśli środowisko jest mieszane… zaczyna się robić nieprzyjemnie /:

eN.

Konfiguracja środowiska PowerShell – cz. I. Inicjalizacja.

bez marudzenia więc zamieszczony na blogu technet (; tutaj tylko część nieoficjalna –

Post Scriptum 2.

zabawne… od kilq lat coraz mniej pracowałem z Linuxami i okazało się, że to Linuxy znalazły mnie – po skonfigurowaniu wszystkich opcji, otrzymujemy shell gotowy do pracy zdalnej tak, jak bash+ssh. czuję się trochę jakbym odbył podróż w przeszłość. biorąc pod uwagę masakrę, którą eMeS dokonał z interfejsem, oraz postęp, jaki nastąpił w linii poleceń – można mówić o tym systemie “Winux” (; oczywiście – PS jest dużo bardziej rozbudowany niż bash, obiektowy, zintegrowany via .NET framework z całym systemem i aplikacjami itd… niemniej to swoiste qui pro quo – Linux jest rozpizgany na 4 wiatry, nikt nie ogarnia ilości standardów, dystrybucji, window managerów, standardów pakietowania… i tak dalej. jak teraz rozmawiam z n00bami Linuxowymi to często nawet nie widzą, co to bash.. tylko KDE, gnom albo coś. a okienka eMeSowe nie dość, że przestają istnieć – bo jak tu mówić o ‘okienkach’ skoro na ekranie jest wyłącznie tryb pojedynczego kafelka w full screen – to jeszcze zarządzanie przenosi się do linii poleceń… się porobiło…

następna wersja systemu eMeSa będzie się nazywać nie “Windows 9” a raczej “Tiles One” q:

eN.

życie w skorupce mocy

chodzi mi od dłuższego czasu po głowie art dot. powershell, opisujący jak dobrze żyć z tym wynalazkiem. ponieważ pomysły roją się w głowie do absurdalnych wielkości małej książki czy kompendium, na razie drobny wpis tego, co mi zalega na płacie czołowym. będę wdzięczny za komentarze i linki (:

podstawowy pomysł to konfiguracja środowiska. kiedy pracowałem z Linuxami, spędziłem kiedyś dwa dni na tym, żeby prompt wyświetlał się w odpowiednich kolorach na odpowiednich serwerach. głupota? nie zupełnie. kiedy zaczyna się pracować na zdalnych hostach szybko można zgubic rachubę na którym się jest aktualnie. wtedy takie niuanse grają rolę – bo zrestartować nie-ten-serwer może mieć bardzo niemiłe konsekwencje. ponieważ PS daje możliwości pracy zbliżone do tych z Linuxa [lepsze? gorsze? hmm… inne], pozostaje podstawowe pytanie – jak sobie to wszystko poukładać, żeby pracowało się miło i wydajnie. najważniejsze aspekty:

  • włączenie usługi i credSSP – jedną z najfajniejszych opcji jest remoting, który po odpowiednim skonfigurowaniu jest tak wygodny, jak ssh na Linuxach. żeby jednak to się stało, trzeba go włączyć oraz pozwolić na uwierzytelnienie credSSP, które jest standardowo wyłączone. bez włączenia przekazania credntiali po zalogowaniu zdalnym jest się zsandboxowanym do lokalnego serwera, czyli odpają jakiekolwiek operacje sieciowe. dodatkowo warto na firewallu zrobić wyjątek dla winRM.
  • historia – kolejny ficzer, który radykalnie zmienia komfort pracy z linią poleceń jest historia. genialny wynalazek z basha – ‘!’ – oraz .bash_history to potęga nie do przecenienia. wielokrotnie ratował mi tyłek [samo-dokumentacja], pomagał w śledztwach [po domniemanych włamaniach, czy ‘kto co robił’] i oczywiście przyspieszał normalną pracę. o ile historia w PS jest całkiem fajna, to jest ograniczona do jednej sesji. aby była permanentna – trzeba sobie dokonfigurować.
  • script signing – standardowo nie da się korzytać ze skryptów. trzeba zmienić politykę uruchomienia … albo podpisywać każdy skrypt certem.

te rzeczy mam już zebrane i opisane. te, nad którymi pracuję jeszcze [i liczę na pomoc] to:

  • zbiór dodatkowych aliasów – na razie poza standardowymi, których jest na prawdę wiele, bardzo mi się podoba pomysł ‘ssh –> enter-pssession’… wydaje mi się jednak, że takich dodatków jest więcej
  • własne funkcje – PS bardzo mocno czerpie z pomysłów basha i tak samo można ‘wczytać plik’ za pomocą kropki ‘.’. to otwiera drogę do utworzenia czegoś bardziej zaawansowanego niż aliasy – całe funkcje, które są wczytywane podczas logowania. na razie nie mam pomysłu co z tą wiedzą można zrobić ciekawego.
  • centralne repozytorium skryptów – na to póki co nie mam konkretnych pomysłów. kombinowałem z przekierowaniem katalagoów [folder redirection] ale to rozwiązanie trochę zbyt ‘globalne’. a warto mieć pod ręką zbiór swoich własnych skryptów.
  • w efekcie – dokładny opis co się dzieje podczas uruchomienia PS. zrozumienie tego procesu pozwoli na realizację wszelkich pomysłów:
  • co jest ładowane w jakiej kolejności
  • jak załadować własne fukcje, aliasy i inne
  • automatyczna modyfikacja zmiennych środowiskowych [np. path dla skryptów]
  • globalna historia
  • … i cała reszta.
  • zmiana promptu i kolorów. jedną z najbardziej vq*wiających błędów są te dziwne opcje ze zmieniającymi się wilkościami fontów. raz małe, raz jakieś wielkie… trzeba w końcu ogarnąć skrypt, który będzie to konfigurował i załadować go podczas startu. wraz z kolorami samego okna [ten navy-blue powoduje u mnie problemy ze zdrowiem]
  • pierwsze [włączenie,signing,historia] postaram się wkrótce opisać… jeśli macie inne ciekawe pomysły to zapraszam do współpracy.

    eN.

    powershell – kiedy będzie standardem?

    globalnie – nie prędko. z jednej strony możliwości PS się zwiększają z każdą wersją systemu, z drugiej strony – pozostają bez zmian dla wersji starych. potworny dualizm – jest wiele zapowiedzi, że będzie wycofane wsparcie konfiguracji TCP/IP z netsh, wmic – z drugiej strony po uruchomieniu w12 w wersji core nadal jesteśmy witani CMD – co jest zresztą dla mnie zupełnie niezrozumiałe /: . taki oto scenariusz, na który często trafiam:

    trzeba coś zautomatyzować/zmienić u klienta. wersje serwerów – od W2k3R2 po w12. jakie mamy środowisko do tego?:

    • na w2k3R2 powershella nie ma w ogóle
    • na w2k8 jest, ale dla tej wersji była bardzo ograniczona liczna cmdletów
    • na w2k8R2 cmdletów jest więcej ale nadal są ograczniczone
    • na w12 jest ich na prawdę dużo, ale część operacji i tak trzeba wykonywać via stare commandlineowe toole.

    i tak wybór jest pomiędzy:

    • zainstalować na wszystkich maszynach powershell. zadanie nietrywialne bo nie wszędzie jest v3, trzeba spełnic szereg wymagań, być może dograć jakieś moduły. sporo zachodu ale jeśli jest się adminem sieci to można się pobawić. jednak dla konsultanta – osoby z zewnątrz – jest to nieopłacalne.
    • być uniwersalnym – korzystać z VBS + CMD

    finalnie – jeśli ma być uniwersalnie to trzeba sięgnąć do VBSa, co jest bolesne. po wygodzie i mozliwościach, jakie daje PS, grzebanie się w basicu jest ciężkim doznaniem.

    niezrozumiałe dla mnie pozostaje:

    • czemu default shell w core to cmd
    • czemu PS nie jest poprawką obligatoryjną/sugerowaną dodatkową – w końcu to podstawowe środowisko zarządzania! na stronie opisującej WMF 3.o jest informacja iż nie jest kompatybilny z <tu całkiem spora lista>. niewątpliwie odpowiada to bezpośrednio na pytanie ‘czemu nie jest poprawką obligatoryjną’ ale rodzi pytanie – skąd te niekompatybilności?
    • czemu nie ma oficjalnych update’ów modułów do PS?

    w efekcie, pomimo ostrego parcia w kierunq PS nie można mu zaufać – skrypty napisane na jeden system mogą nie działać na innym. brak jest spójności i jednego, porządnego środowiska.

    Powershell basics mini-FAQ

    • jak sprawdzić wersję powershell:

    $host.version

    • czy da się zupgradeować powershell do wersji 3 na wszystkich systemach?

    po pierwsze to nie tylko PowerShell ale ‘Windows Management Framework’. na cały framework składa się kilka komponentów, wykorzystywanych na końcu łańcucha przez PS: BITS, WinRM i kilka innych komponentów, +oczywiście .NET framework. na staszych systemach trzeba więc zupdateować i pozostałe komponenty.

    dla w2k8, w2k8R2 i w7 da się – można zaciągnąć z download center
    dla wersji 2k3/XP SP3 jest tylko v2 i nowszej nie będzie

    • jak sprawdzić dostępne moduły

    get-module –listAvailable

    użytkownika: userdocumentswindowspowershellmodulesmymodule
    systemowe: windowssystem32windowspowershellV1.0modulesmymodule

    • skąd wziąć moduły?

    sporo jest na codeplexie. jedno z fajniejszych repozytoriów jest na technetowym wiki.

    eN.

    maintenance kont AD

    skrypty PS w dawno nie odświeżanym dziale skryptów..

    do prawidłowego działania nie potrzeba modułu AD – kiedy je pisałem jeszcze go nie było q: poza tym czasem lepiej mieć pełną kontrolę.
    skrypt bloqjący jest już zrobiony ‚na łatwiznę’ – korzysta dsmove.

    eN.

    wyszukiwanie kont, które się nie logują

    przez kilka lat używałem skryptu do wyszukiwania kont, które nie są już używane. jest w nim taki fragment:
    # Get the current date
    $currentDate = [System.DateTime]::Now
    # Convert the local time to UTC format because all dates are expressed in UTC (GMT) format in Active Directory
    $currentDateUtc = $currentDate.ToUniversalTime()
    $lastLogonTimeStampLimit = $currentDateUtc.AddDays(-$MAXUSERIDLE)
    $lastLogonIntervalLimit = $lastLogonTimeStampLimit.ToFileTime()

    $searcher.Filter = "( &(objectCategory=person)(objectClass=user)(lastLogonTimeStamp< =$lastLogonIntervalLimit) )" $results=$searcher.findall()
    i nagle, po tych kilq latach ktoś mi mówi - "ty, ale tu nie ma kont, które się w ogóle nie logowały"
    UPS! /:
    faktycznie - w takim wypadku lastLogonTimeStamp jest nullem a więc porównanie nie udaje się... poprawny filtr:
    $searcher.Filter = "(&(objectCategory=person)(objectClass=user)(|(lastLogonTimeStamp< =$lastLogonIntervalLimit)(!lastLogonTimeStamp=*)))"

    huh. jak ktoś chce cały skrypt - pisać.

    eN.

    powershell–uruchomienie exe z parametrem

    w całej ‘genialności’ projektanci PS zapomnieli o totalnie najprostszych rzeczach, które co-i-rusz wychodzą. bardzo chciałbym się pozbyć nawyq uruchamiania konsolki cmd ale do cholery… uruchomienie najprostszej instalki z parametrem bywa co najmniej uciążliwe.

    w przeciwieństwie do starego ‘okienka DOS’ konsola PS próbuje interpretować cały ciąg jako instrukcję PS. i tak wpisanie:

    costam param=1 –option 2 {otherParam:3}

    w DOS spowoduje:

    • próbę odnalezienia polecenia ‘costam’
    • jeśli znaleziony – przekazanie całej reszty ciągu do obsłużenia przez ‘costam’

    w PS natomiast sprawdzana jest składania całego polecenia. w win 8 jest powershell v3 gdzie pojawiło się specjalne oznaczenie:

    --%

    które mówi PS aby nie interpretować dalszej części linii. w starszych PS można albo łapać się prawą ręką za lewe ucho przekładając ją pod tyłkiem, albo po prostu odpalić cmd – np. ‘cmd /c polecenie’. dla chętnych do zabawy proszę najlepszy link jaki znalazłem: http://edgylogic.com/blog/powershell-and-external-commands-done-right/

    a dodawanie wynalazków typu – – % może i działa i jest wyjściem, niemniej zaczyna przypominać wynalazki z cmd – gdzie zależnie od wykonania używało się coraz dziwaczniejszcyh figur i sztuczek. mam nadzieję, że nie doprowadzą do podobnego bałaganu…

    eN.

    %d bloggers like this: