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


20.07.2020

Baramundi

Pomoc w czasie pandemii.
20.07.2020

Stop infekcjom

CloudGuard
17.07.2020

Analiza zagrożeń

Kaspersky Threat Attribution Engine
17.07.2020

Strażnik danych

QGD-1602P
16.07.2020

Dysk przemysłowy

Transcend MTE352T
16.07.2020

Połączenie sił

Fugaku
16.07.2020

Brama bezpieczeństwa

Check Point 1570R
23.06.2020

PLNOG Online

PLNOG Online
23.06.2020

Nowe zagrożenie

Ramsay

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”. 

Artykuł pochodzi z miesięcznika: IT Professional

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"