Skip to Content

IT nieuczesane.
category

Category: DevOps/Scripting

skrypty, programy, command line i inne

jak sprawdzić przypisania wirtualnych kart sieciowych

klaster ma swoje wymagania co do sieci – potrzebuje kilku interfejsów do LM, HB, iSCSI, VLANy i tak dalej. jeśli tylu sieciówek nie ma, a zdarza się, że po prostu braqje portów na switchu (; i w kilq innych scenariuszach – czasem warto jest utworzyć wirtualne interfejsy. na stronach technetu można znaleźć ładną instrukcję więc nie będę kopiował. tutaj chciałem podać tylko mały trik. po założeniu owych wirtualnych interfejsów chciałoby się podejrzeć który jest dowiązany do którego wirtualnego switcha. trzeba przyznać, że konstrukcja wirtualnych switchy jest nieco zamota, a w połączeniu z VMM gdzie dochodzą jeszcze sieci logiczne staje się to na prawdę nieprzyjemne przy rozwiązywaniu problemów.

  • teoretycznie switche widać w hyper-v managerze… ale nie widać tak wirtualnych interfejsów.
  • interfejsy – czy to fizyczne czy wirtualne, widać w systemie – czy to z GUI ‚ncpa.cpl’ czy z powershell ‚get-netAdapter’. ale nawet wyświetlając wszystkie właściwości konkretnego interfejsu nie widać ich powiązań z VMSwitch
  • standardowo polecenie get-VMNetworkAdapter pokazuje powiązania z maszynami wirtualnymi……

..ale to już bardzo blisko rozwiązania. jest jeden magiczny przełącznik, który stanowi rozwiązanie:

po wykonaniu tej komendy pokazywane są nazwy switchy wirtualnych. teraz wystarczy sprawdzić który switch powiązany jest z która kartą fizyczną i voila:

idąc jeszcze krok dalej: nazwy kart z poziomu systemu znów są inne.. kolejna warstwa. więc jeszcze informacja jaka jest nazwa interfejsu z poziomu systemu:

eN.

Exchange online, powershell, kontakty i rezerwacja sal

to, co jest piękne w PS to fakt, że kiedy się go pozna, wszystko jedno do jakiego produktu się usiądzie – chwila moment i można szybko wyciągać statystyki, tworzyć obiekty, zestawienia i co kolwiek potrzeba. z jednego miejsca i bez różnych GUI.   <3 <3 ^^

przesiadka z Exchange onPremise na Exchange onLine jest bezbolesna – ot trochę mniej poleceń. wymagania? żadne. wystraczy po prostu zestawić sesję z serwerem i zaimportować sesję i stacja zmienia się w konsolę zarządzającą Exchange. po imporcie sesji dostępny jest moduł, którego nazwa jest generowana jakimś pseudolosowym algorytmem. dostępne polecenia można wylistować przy pomocy get-command:

do założenia kontaktu [bo przecież nie będę wyklikiwał z interfejsu, fuj] jest polecenie ‚new-mailContact’. okazuje się jednak, że ma ono bardzo ograniczoną listę parametrów, nie pozwalając ustalić takich szczegółów jak organizacja, stanowisko, telefon etc. i tu znów piękno PS – polecenie to nie tylko tworzy obiekt typu ‚mailContact’ ale również go zwraca. przypomnę, że PS zwraca obiekty przez referencję dzięki czemu wszystko można ‚pajpować’. ponieważ jest drugie polecenie – ‚set-contact’, które przyjmuje wszystkie wymagane parametry a jako wskazanie może użyć zarówno ID jak bezpośredniej referencji do obiektu ‚mailContact’, można utworzyć prostego jednolinijkowca, który zrobi co trzeba:

czyli gdyby chcieć ten prosty znaczek ‚|’ zapisać na polski byłoby to mniej-więcej – ‚a następnie przekarz go przez referencję do następnego polecenia’

i jeszcze „jedna rzecza” która się przydaje – rezerwowanie sal przez osoby z zewnątrz. standardowo takiej możliwości nie ma. w ex2k13 uzyskuje się to poprzez ‚calendar processing’:

to jeszcze nie wystarczy. jeszcze jedno wymaganie i jeden ‚trick’:

  • adres dokonujący rezerwacji musi istnieć jako kontakt na serwerze [poprzedni przykład]
  • a trick polega na tym, że nie zadziała dodanie w spotkaniu pokoju tak, jak to się zwyczajowo robi na homeserwerze. należy adres wpisać tak, jak zaprasza się zwykłą osobę.

eN.

 

 

 

 

zdalne odinstalowanie agentów VMM

automationscenariusz: upgrade VMM 2o12 -> 2o12 R2. nie ma inplace upgrade, więc stawiany obok. agentów również nie chce zainstalować z automatu na hostach bo ‚version is not supported’. trzeba więc w pierwszym kroq odinstalować wszystkie agenty na wszystkich hostach. jeśli tylko jest dobra [czyli skrypto-przyjazna] notacja nazewnicza, to można to zrobić szybko, sprawnie i bez bólu. taki przykład – dla dziewięciu hostów o nazwach hvhosto1-o9. wymaganie: skonfigurowane winRM:

eN.

statystki na Exchange 2o1o

2014-08-07 15_18_56-statistics - Szukaj w Googletrochę na temat statsów na Ex2kd. że PowerShell wymiata to już pisałem wiele razy, ale nie omieszkam jeszcze wiele napisać. „PowerShell wymiata„. wszystko co kiedyś było bardzo trudne, w porywach do niemożliwe i wymagało jakiejś tajemnej wiedzy – teraz leży okrakiem – nic tylko brać (; w przypadq Exchange trochę tajemnej wiedzy jest potrzebne żeby dobrać się do danych prawidłowo – w innym przypadq można ominąć ważne części. a w końcu w statystykach chodzi o dokładność.

najpierw kilka najprostszych poleceń do statystyk:

to jednak polecenie bardzo wredne i ma swoje humory. i to poważne. na początek fakt, że w środowisq wielodomenowym nie są przeszukiwane wszystkie domeny. wychodzą z tego niewidzialne skrzynki. sprawdzić to można:

chodzi konkretnie o parametr ‚ViewEntireForest’ który baj difolt jest ustawiony na $false. dość dziwne jest dodatkowo to, że nawet jak się go przestawi na $true, to potrafi wrócić, z niewiadomych względów, do ustawienia standardowego /: więc jeśli skrzynki znaleźć nie można, warto go sprawdzić.

set-ADServerSettings -ViewEntireForest $true

kolejną ciekawostką jest to, że to polecenie zwraca statystyki *wszystkich* skrzynek. że to przecież dobrze? no nie koniecznie – jeśli wykonuje się jakieś ruchy, przenosi się skrzynki między bazami, to taka skrzyneczka jest de facto kopiowana, a jej cień zostaje w bazie danych aż do czasu osiągnięcia czasu retencji. trzeba zatem takie skrzynki odfiltrować, a odpowiada za to parametr ‚disconnectDate’ – jeśli wartość jest $null, to znaczy, że skrzynka nie jest odłączona, to znaczy że jest dobra. wiedząc to, można sprawdzić zarówno ile zajmują skrzynki ale również ile miejsca się marnuje – odłączone mailboxy można wywalić przed czasem retencji. dodatkowo, ponieważ interesują nas wielkości, a te nie są standardowo wyświetlane, warto użyć ‚select’:

 

jeśli interesuje nas suma, to trzeba to sobie pododawać za pomocą ‚measure’ ale to za chwilę. najpierw zagadka – czemu to polecenie nie zadziała zgodnie z oczekiwaniami? otóż sortujemy po wielkości, a te zwracane są w różnych jednostkach – MB, GB, PTB [to skrzynka CEO (; ], więc 3MB będą większe od 1GB. trzeba zatem wykonać trochę matematyki:

i to niestety nie koniec. jednej rzeczy nie udało mi się odkryć. otóż po usunięciu skrzynki użytkownika i założeniu mu nowej, disconnectDate pozostaje $null /: a to oznacza, że cały czas pojawia się w statsach. za to mniej grymaśne jest polecenie get-mailbox a więc jeśli nie interesuje nas zużyte miejsce przez nieistniejące skrzynki, najlepiej korzystać od tej strony:

jeśli nie interesują nas poszczególne skrzynki a bardziej wielkości całych baz:

a co do mierzenia całej wielkości, to już odeślę do zewnętrznego wpisu, gdzie jest bardzo ładna i prosta funkcja, która to realizuje.

eN.

replikacyjna magia

są takie, jak to ktoś kiedyś pięknie przetłumaczył, dziwnostki. jak się na taką trafi to jak los w antylotto. właśnie straciłem 3h na debugowaniu takiego wynalazq z programu „niedowiary”. napisałem sobie skrypt, który sprawdza wszystkie hosty na SCVMM a potem odpytuje je o status replikacji i wysyła go mailem. działa ślicznie – jak odpala się z konsoli.

…wrzucam jako zadanie task scheduler… skrypt niby się odpala, ale wyraźnie coś nie do końca, bo output jest niepełny. zajmuje mi chwilę, żeby zawęzić niedziałanie do komendy get-vmreplication – najwyraźniej się wywala /: testowałem wszystko – sprawdzałem kontekst wywołania, poprawność skryptu, nawet szukałem pod względem tego, czy może get-vmreplication z jakiś powodu nie działa jako zadanie kalendarza. w końcu postanowiłem przejść do podstaw – wycinając cały skrypt i zostawiając tylko to jedno polecenie, w różnym kodowaniu – ANSI/UTF8. dupa. nadal zmienna jest pusta

w końcu założyłem nowy task i… działa! no więc odtwarzam pełną definicję zadania… znów nie działa @_@ o co qrva c’mon?!

teraz już szybkie testy i oto przed państwem dziwny, przedziwny, niewytłumaczalny wynik:

jeśli w trigerze taska ustawiona jest opcja „Stop task if it runs longer then” – get-vmreplication nic nie zwraca

sprawdzałem dla różnych wartości, i nie ważne, że sam task jest odpalany ręcznie /: cuda na kiju. nie testowałem na innych serverach – u mnie to jest w2k12 standard z SCVMM.

spis IP

***UPDATED

scenariusz: jest lista nazw komputerów, trzeba rozwiązać adresy IP. warunek konieczny – odpowiednie wpisy w DNS.

dla widoczności oneliner rozbity na kilka linijek:

podstawa to wyrażenie regularne. krótkie wyjaśnienie:

  • adres IPv4 to 3 cyfry, kropka … 3 cyfry. „[0-9]+” oznacza „wystąpienie dowolnej cyfry raz lub więcej”.
  • kropka jest znakiem specjalnym w wyrażeniach regularnych więc musi być wyeskejpowana – „\.”.
  • metoda Matches zwraca tablicę wyników, więc trzeba wybrać pierwszą wartość – stąd pojawia się „[0]” – jako pierwszy element tablicy.
  • no i na końcu wybranie atrybutu ‚value’, ponieważ każdy rekord tablicy Matches zawiera kilka atrybutów a tu chodzi konkretnie o wartość.

udpate:

Player uzupełnia, że prawidłowy zapis dla adresu IP powinien wyglądać „[0-9]{1,3}” a nie + bo w końcu może być tylko od jednej do trzech cyfr. w tym przykładzie nie ma to znaczenia, bo ping nie zwróci raczej nieprawidłowego adresu, ale lepiej pisać dobrze (:

Paweł pokazuje, że lepiej niż pinga użyć commandletu ‚test-connection‚ i się nie bawić w wyrażenia regularne.

eN.

PS: console … and beyond

jeśli mój pomysł z PowerPresentation wydaje się abstrakcyjny… to co powiedzieć o pisaniu gry w PS? (;

eN.

split, tablice, X400 i jeszcze więcej

scenariusz: w atrybucie proxyAddresses w AD użytkownicy mają wpisane nieużywane adresy X4oo, które trzeba było usunąć. prościzna… przynajmniej tak mi się wydawało. sporo ciekawych drobiazgów przy tym wyszło i zadanie, które oceniałem na 15-2o min zajęło mi ze 2h /:

a takież to ciekawostki powychodziły…

najpierw trzeba wyszukać wszystkie obiekty [user/contact], które mają w proxyaddresses X400. szczęśliwie filtry są na tyle sprytne, że radzą sobie z multivalue [zaraz napiszę jak to robią] i nie trzeba się męczyć z jakimiś konwersjami:

w ‚normalnym’ języq, trzeba by się pomęczyć najpierw wyszuqjąc wszystkie obiekty posiadające wartość proxyaddresses, potem konwertując tablicę do stringa, a potem sprawdzić czy w tym stringu jest wartość x400 – bo w ‚normalnym’ języq świat nie jest tak prosty (;

proxyaddresses jest tupu ‚mulivalue’ czyli jako parametr przyjmuje tablicę stringów i z tejże tablicy trzeba usunąć linijkę, która zawiera wartość ‚x4oo’. wartość można łatwo odczytać, ale jak z tej tablicy wywalić ową linijkę?i tutaj czas na wyjaśnienie, jakim cudem filtr zadziałał dla tablicy tak, jakby to był pojedynczy string. spróbuję to zobrazować na trochę prostszym przykładzie:

na powyższym przykładzie widać, że po zdefiniowaniu tablicy i sprawdzeniu jej typu przy pomocy get-member, PS traktuje ją jak zwykły string…  jeśli jednak sprawdzi się typ zmiennej….

choć nieco dziwne, to wiele ułatwia. pozostaje jednak nadal pytanie – jak łatwo usunąć element z tablicy stringów? można kombinować z metodami replace i remove, które tu zadziałają jak dla zwykłego stringa, ale dają średnie rezultaty. dużo ciekawszym sposobem jest metoda remove, dla klasy ArrayList.

na koniec jeszcze jedna ciekawostka. zanim wpadłem na konwersję do ArrayList, kombinowałem z przepisaniem zmiennej do drugiej tablicy i próbowałem wycinać z niej wartości na różne sposoby.  tak trafiłem na kolejną ‚ciekawostkę’ – w cudzysłowiu, bo de facto taki sposób działania jest normalny dla środowisk obiektowych: powiązanie zmiennej z atrybutem obiektu jest robione przez referencję a nie jest ona kopiowana. taki jakiś niedziałający kod:

podczas działania dostawałem taki błąd:

An error occurred while enumerating through a collection: Collection was modified; enumeration operation may not execute..At D:\ISCG\scriptz\cleanX400.ps1:11 char:16
     +         foreach <<<< ($p in $_.proxyaddresses) {
+ CategoryInfo          : InvalidOperation: (System.Collecti…numeratorSimple:ArrayListEnumeratorSimple) [], RuntimeException
+ FullyQualifiedErrorId : BadEnumeration

kolekcja została zmodyfikowana… i faktycznie – kiedy sprawdziłem modyfikacje na $newpa, wyświetlenie $_.proxyaddresses je odzwierciedlało. wniosek – z obiektami nie ma żartów, trzeba uważać (;

na koniec jeszcze jedna metoda usuwania konkretnej linii a tablicy stringów, która jednak mi się nie przydała, ponieważ trzeba znać index. załóżmy, że chcę usunąć 4tą wartość:

reasumując – atrybuty zostały poprawione, a te 2h nie poszły na marne – rozumiem bardziej ^^

eN.

 

przerwane dziedziczenie

***updated

migracja gównianej macierzy publikowanej via SMB. ADMT nie obsługuje dysqw sieciowych. jak sprawdzić na których katalogach zerwane jest dziedziczenie? może jakiś tool z netu? może jakiś super-skomplikowany kod? a może po prostu szybki test w PS ^^

wyszukaj wszystkie obiekty potomne, wybierz katalogi, wybierz te, które mają wyłączone dziedziczenie:

jakoś tak z przyzwyczajenia używam filtra, który pokazuje tylko katalogi „? PSIsContainer”… przewija się na wszystkich stronach i we wszystkich przykładach… a przecież get-childItem ma parametr -Directory /:

 

eN.

obsługa błędów w PS

obsługa błędów jest niezmiernie istotna – nie tylko ze względu za komunikaty na ekranie [choć i to jest często ważne] ale bardziej na zastosowanie konkretnej akcji zależnie od tego co się dzieje. najczęściej oczywiście stosuje się try/catch, z pewnymi niuansami, o których trzeba pamiętać i o czym już pisałem. są niemniej przypadki, w których obsługa błędów nie jest taka trywialna zwłaszcza, jeśli korzysta się wewnątrz skryptu z zewnętrznych narzędzi/aplikacji. dla tego też zawsze bronię się rękami i nogami przed niekoszernymi rozwiązaniami, czasem nadpisując wiele linii kodu, byle tylko nie korzystać z zewnętrznych aplikacji. bywa jednak, że nie ma wyjścia.

takim przypadkiem jest scenariusz, w którym trzeba podmapować rejestr użytkownika aby wykonać jakieś operacje. gdzieś tam udało mi się dogrzebać do artu, w którym ktoś wykonywał ciężkie akrobacje programistyczne, aby obsłużyć to ‚natywnie’ – czyli bez ‚reg.exe’, to już jednak za dużo. nie ma więc wyjścia – trzeba skorzystać z ‚reg load’. problem polega na tym, że reg load nie zwraca konkretnego błędu/informacji. próbowałem przypisywać jako zmienną, przekierowywać do pliq… pustka.

chwilkę mi zajęło, zanim przypomniałem sobie jak to się robiło za króla świeczka – i ta metoda działa tak samo obecnie. a chodzi konkretnie o to, że ‚reg’ wrzuca wszystko na standardowy strumień błędów, więc żeby go przechwycić, trzeba go przekierować na standardowy strumień wyjścia:

jak widać cała tajemnica tkwi w „2>&1”. więcej szczegółów a propos oznaczeń strumieni można przeczytać w about_redirection.

eN.

 

 

 

%d bloggers like this: