Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików Cookies.



17.09.2019

PLNOG23 czyli sieci 5G,...

Największa polska konferencja telekomunikacyjna powraca do Krakowa! Wśród nowości ścieżka...
05.09.2019

Cloudya – nowa usługa NFON

Po ponad dekadzie ciągłego rozwoju technologii Cloudya, swobodna i niczym nie ograniczona...
02.09.2019

Na dużą skalę

Kaspersky Hybrid Cloud Security
02.09.2019

Bezpieczny brzeg sieci

Fortinet Secure SD-Branch
02.09.2019

Nowoczesne centra danych

AMD EPYC
30.08.2019

Dostęp do AI i ML

VMware Cloud Foundation
30.08.2019

Lekkość i moc

Toshiba Portégé A30-E
30.08.2019

Bez przestojów

APC Easy UPS On-Line
29.08.2019

Duże moce

Lenovo ThinkSystem SR635 i SR655

PowerShell Desired State Configuration

Data publikacji: 23-05-2019 Autor: Bartosz Bielawski
Tworzenie zasobu DSC za...

Przy tworzeniu zasobów w ramach PowerShell Desired State Configuration (DSC) konieczny jest pewien poziom ustrukturyzowania – bez niego trudno o budowanie konfiguracji, które te zasoby będą wykorzystywać. W trzeciej części cyklu opisującego możliwości DSC przyjrzymy się, jak tego typu zasoby tworzyć, zmieniać oraz testować.

 

W pierwszej odsłonie DSC, która pojawiła się wraz z premierą PowerShella 4.0, struktura nadawana była za pomocą plików schematu tworzonych w języku Management Object Format (MOF). Od wersji piątej PowerShella do dyspozycji mamy klasy, które oferują podobny poziom usztywnienia struktury w ramach samego interpretera poleceń Microsoft.

Głównym celem dodania klas było ułatwienie tworzenia zasobów DSC. Przyjrzymy się więc, jak tego typu zasoby tworzyć, zmieniać oraz testować. Wszystko omówimy na praktycznym przykładzie – stworzymy zasób, który wybraną ścieżkę dopisze do zmiennej systemowej PATH w taki sposób, aby nie wprowadzić zmian we wpisach standardowych definiowanych za pomocą ścieżek zawierających wartość innych zmiennych systemowych.

> TWORZENIE KLAS W POWERSHELLU

Zanim przystąpimy do tworzenia zasobu wykorzystującego klasy, warto najpierw przyjrzeć się samym klasom. O ile bowiem zasoby skryptowe wykorzystują w dużej mierze możliwości oferowane od drugiej wersji PowerShella (moduły) czy dostępne od samego początku (funkcje), o tyle z klasami można zetknąć się dopiero w wersji piątej.

Klasy w PowerShellu w dużej mierze przypominają klasy w innych językach dostępnych w ramach .NET, przy czym pozbawione są bardziej zaawansowanych możliwości, oferowanych przez klasy w ramach języków kompilowanych. Nasza klasa może posiadać właściwości, metody oraz konstruktory. Może dziedziczyć po innej klasie lub być implementacją interfejsu (ale tylko jednego). Do ograniczeń w stosunku do klas kompilowanych niewątpliwie należy brak możliwości tworzenia przestrzeni nazw, implementowania wielu interfejsów oraz brak wsparcia dla zdarzeń czy wyspecjalizowanych sposobów odczytywania/ustawiania wartości właściwości.

Jak tworzyć klasy w PowerShellu? Definicja klasy zaczyna się od słowa kluczowego class, po którym podajemy nazwę klasy i jej definicję w formie bloku skryptu. Definicja może zawierać:

 

  • właściwości – definiujemy, podając typ i zmienną, której nazwa stanowić będzie nazwę właściwości,
  • metody – definiujemy, podając typ, nazwę metody, listę parametrów w nawiasie (może być pusta) oraz blok skryptu stanowiącego definicję metody,
  • konstruktory – powinny zawierać jedynie nazwę naszej klasy, listę parametrów oraz blok skryptu, który określi zachowanie konstruktora.


W przeciwieństwie do funkcji w klasach nie możemy korzystać ze zmiennych niezdefiniowanych w danym kodzie, czy to jako właściwości, czy to jako parametry metody, czy też jako zmienne lokalne. Oprócz tego, aby metoda zwróciła jakąś wartość, musimy skorzystać ze słowa kluczowego return. Metody o zdefiniowanym typie zwracanym muszą zwrócić obiekt tego typu lub zakończyć swoje działanie poprzez wyjątek. Należy więc zadbać o odpowiedni wynik we wszystkich gałęziach tworzonego kodu. Poniżej przykładowa nieprawidłowo zdefiniowana klasa z wyszczególnieniem błędów:

$zmienna = 'Tekst'
class klasaBłędna {
[String]$Nazwa
[String] PodajNazwę () {
if ([string]::IsNullOrEmpty($this.Nazwa)) {
# "Variable is not assigned in the method"
return $zmienna
} elseif ($this.Nazwa -match 'test') {
# "Not all code path returns value within method"
'test'
} else {
# Poprawne...
return $this.Nazwa
}
} }

Tworząc własne konstruktory, trzeba pamiętać, że w ten sposób wyłączymy automatycznie dodawany konstruktor bezparametrowy. Jeśli więc zależy nam na tym, aby oprócz konstruktora z parametrami działał również taki, który parametrów nie wymaga, musimy dodać oba konstruktory:

class BezKonstruktorów {
[String]$Działa
}
[BezKonstruktorów]::new()
class Parametrowy {
[String]$Wyjątek
Parametrowy ($wyjątek) {
$this.Wyjątek = $wyjątek
}
}
[Parametrowy]::new()
class Oba {
[String]$ZnówDziała
Oba () {
$this.ZnówDziała = 'Kto wie?'
}
Oba ($działa) {
$this.ZnówDziała = $działa
}
}
[Oba]::new()

Pierwsza i ostatnia klasa w przykładowym kodzie pozwoli utworzyć instancję bez podawania parametrów, w przypadku klasy Parametrowy PowerShell poinformuje nas, że nie ma konstruktora dla interesującej nas klasy, który pobierałby zero parametrów.

> KLASA SPEŁNIAJĄCA WYMOGI ZASOBU DSC

Wiemy już, jak tworzyć klasę w PowerShellu, przyjrzymy się więc, jak stworzyć klasę spełniającą wymogi zasobu DSC. Aby utworzyć tego typu klasę, w pierwszej kolejności należy oznaczyć ją atrybutem DscResource:

[DscResource()]
class Zasób {
}

Dodanie tego atrybutu sprawi, że w edytorze rozumiejącym PowerShella (np. PowerShell ISE) od razu zostaniemy poinformowani o błędnej składni (rys. 1).

Podobnie jak to miało miejsce w zasobach skryptowych, przede wszystkim musimy zadbać o odpowiednie właściwości – absolutne minimum to zdefiniowanie właściwości kluczowej, która z założenia powinna jednoznacznie identyfikować zasób, oraz zdefiniowanie trzech metod: Test, Set i Get. Metody te odpowiadać będą analogicznym funkcjom, które definiowaliśmy w zasobach skryptowych, i będą pełnić podobną funkcję. Jedyna różnica polega na tym, że mają one narzucony typ zwracanych obiektów, przez co nie ryzykujemy, że metoda zwróci obiekt o innym typie.

Tworząc właściwości klasy, musimy skorzystać z atrybutu DscProperty, przekazując do niego typ właściwości. Typy są podobne do tych znanych z zasobów skryptowych: poza właściwościami kluczowymi (Key) możemy też dodawać właściwości wymagane (Mandatory), opcjonalne (atrybut DscProperty bez żadnych parametrów) oraz tylko do odczytu (NotConfigurable).
 

[...]

 

Autor zawodowo zajmuje się informatyką. Jest Microsoft MVP w dziedzinie PowerShella, blogerem oraz jednym z moderatorów forum dotyczącego skryptów w serwisie TechNet. Autor książki „Windows PowerShell 5.1 Biblia”. 

Pełna treść artykułu jest dostępna w papierowym wydaniu pisma.

.

Transmisje online zapewnia: StreamOnline

All rights reserved © 2019 Presscom / Miesięcznik "IT Professional"