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


01.12.2022

Wyższy poziom programowania

Progress oferuje nowe narzędzia programistyczne: Progress Telerik, Progress Kendo UI i...
01.12.2022

Łączność w podróży

VMware SD-WAN VMware zaprezentował rozwiązanie SD-WAN nowej generacji, w tym nowego...
01.12.2022

Bezpieczne e-maile

Nowa aplikacja firmy Cypherdog Security Inc. umożliwia bezpieczną wymianę maili i...
01.12.2022

Pierwszy w branży

Schneider Electric wprowadza na rynek APC Smart-UPS Ultra. To pierwszy w branży...
01.12.2022

Przełączniki 10G dla MŚP

Nowe urządzenia to przełączniki 10G kompatybilne z systemem Omada SDN.
01.12.2022

Zarządzanie danymi

Firma Synology wprowadziła na rynek czterokieszeniowy DiskStation DS923+.
01.12.2022

Nowatorski system chłodzenia

OVHcloud zaprezentował nową, autorską technologię hybrydowego zanurzeniowego chłodzenia...
01.12.2022

Linia smart routerów

D-Link zaprezentował najnowszą rodzinę routerów Smart Wi-Fi z algorytmami sztucznej...
04.11.2022

Nowa platforma Red Hat

Nowa platforma Red Hat Enterprise Linux (RHEL) w wersjach 8.7 i 9.1 Beta obsługuje...

Zarządzanie grupami na serwerze WSUS

Data publikacji: 01-09-2022 Autor: Bartosz Bielawski

W poprzednim artykule skupiliśmy się na konfigurowaniu serwera WSUS za pomocą Windows PowerShell Desired State Configuration. Aby w pełni skonfigurować nasz serwer, brakowało nam środków do zarządzania grupami – ich strukturą oraz członkostwem w grupach. W tej części postaramy się przygotować odpowiednie narzędzie przeznaczone do tego celu oraz konfigurację, która to narzędzie wykorzysta.

 

Tworząc zasoby DSC, mamy dwie możliwości: tradycyjne zasoby skryptowe oraz zasoby definiowane za pomocą klas PowerShella. Na potrzeby tego artykułu stworzymy ten drugi rodzaj. Tworzenie zasobów tego typu jest prostsze, a dodatkowo Microsoft w przyszłości zamierza skupić się na rozwiązaniach, które wspierać będą jedynie zasoby zbudowane z wykorzystaniem klas.


Klasy w PowerShellu


Klasy w PowerShellu mają dość ograniczone zastosowanie, a ich pojawienie się jest ściśle związane z DSC właśnie. Wyróżniamy dwa podstawowe typy klas: typy obliczeniowe (definiowane za pomocą słowa kluczowego enum) oraz klasy regularne (słowo kluczowe class). Po słowie kluczowym i nazwie klasy umieścimy blok skryptu definiujący dany typ. Dla typu obliczeniowego będzie to lista właściwości:

 

enum kolor {
czerwony
żółty
zielony
}


Dla klasy definiować będziemy trzy rodzaje elementów: właściwości, metody oraz konstruktory (stanowiące specjalny typ metody, której produktem jest instancja naszej klasy). Właściwości to po prostu zmienne, dla których możemy określić zarówno typ, jak i wartość domyślną. Metody definiujemy przez podanie zwracanego typu, nazwy oraz listy parametrów. W przeciwieństwie do innych konstrukcji w PowerShellu nasza metoda dla każdej ścieżki musi zwrócić albo wyjątek, albo obiekt wybranego typu za pomocą słowa kluczowego return. Konstruktory tworzymy, podając nazwę naszej klasy, listę parametrów i blok skryptu, który przeprowadzać będzie na tworzonej instancji (dostęp za pomocą wbudowanej zmiennej $this, która dostępna jest też w innych metodach). Zasoby to klasy PowerShella ze specjalnym atrybutem [DscResource].

 

Właściwości struktury zasobów DSC


Każdy zasób w PowerShellu musi oferować trzy akcje: pobranie informacji o stanie systemu (metoda Get w ramach tworzonej przez nas klasy), sprawdzenie zgodności stanu bieżącego z wymaganym (metoda Test) oraz doprowadzenie opisywanego zasobu do wymaganego stanu (metoda Set). Oprócz metod musimy też zadbać o właściwości opisujące nasz zasób. Ważne, by dla każdego zasobu określić zestaw właściwości, które dokładnie określają nasz zasób – dzięki nim mamy pewność, że zmian dokonywać będziemy tam, gdzie zamierzaliśmy. Oprócz tego konieczne są też właściwości, które będziemy chcieli odpowiednio skonfigurować, począwszy od tego, czy obiekt ma istnieć (Ensure). W przypadku grup w ramach WSUS kluczową właściwością może być nazwa grupy. Wymagana będzie też pozycja w hierarchii (a dokładnie: nazwa grupy nadrzędnej) oraz wspomniana już właściwość pozwalająca określić, czy grupa ma istnieć.


[DscProperty(Key)]
[String]$Name
[DscProperty()]
[AllowEmptyString()]
[String]$Parent = 'Okresowe'
[DscProperty()]
[Ensure]$Ensure = [Ensure]::Present


W przypadku członkostwa w grupie podawać będziemy jedynie nazwę grupy oraz listę komputerów, które się mają w niej znaleźć:


[DscProperty(Key)]
[String]$Name
[DscProperty(Mandatory)]
[string[]]$Computers
[DscProperty()]
[Ensure]$Ensure = [Ensure]::Present


Poza właściwościami opisującymi nasz zasób przydadzą nam się też inne, które pozwolą nam przechowywać informację wspólną dla wszystkich metod. Dla przykładu możemy zechcieć dodać właściwość opisującą nasz serwer WSUS oraz metodę pomocniczą, dzięki której przypiszemy do niej ten serwer. Inna wspólna dla obu zasobów metoda pomocnicza to ta, za pomocą której importować będziemy niezbędny nam moduł UpdateServices. By uniknąć powielania kodu, skorzystamy z tego, że klasy w PowerShellu wspierają (w ograniczonym zakresie) dziedziczenie.


Klasa nadrzędna i metody standardowe


Stworzymy klasę nadrzędną zawierającą wspomnianą właściwość i metody, a oba zasoby będą po tej klasie dziedziczyć:


class Wsus {
[object]$WsusServer
[void] ImportWsusServerModule () {
Import-Module -Name UpdateServices -ErrorAction Stop -Verbose:$false
}
[object] GetWsusServer () {
if ($this.WsusServer) {
return $this.WsusServer
}
$this.WsusServer = Get-WsusServer -ErrorAction Stop
return $this.WsusServer
}
}
[DscResource()]
class WsusComputerGroup : Wsus {
}
[DscResource()]
class WsusComputerGroupMember : Wsus {
}


Mamy gotowy szkielet i właściwości – zacznijmy implementować wymagane metody.


Metoda Get musi jedynie odszukać grupę, która nas interesuje, oraz pobrać informację o grupie nadrzędnej. Jeśli grupy nie uda się znaleźć, to oczywiście metoda Get poinformuje nas o tym, ustawiając wartość właściwości Ensure na Absent:


[WsusComputerGroup] Get () {
$this.ImportWsusServerModule()
$this.GetWsusServer()
$allComputerGroups = $this.WsusServer.GetComputerTargetGroups()
$this.Group = $allComputerGroups | Where-Object {$_.Name -eq $this.Name}
if ($this.Group) {
$parentGroupObj = $this.Group.GetParentTargetGroup()
return [WsusComputerGroup]@{
Name = $this.Group.Name
Parent = $parentGroupObj.Name
Ensure = [Ensure]::Present
WsusServer = $this.WsusServer
Group = $this.Group
}
} else {
return [WsusComputerGroup]@{
Name = $this.Name
Parent = $this.Parent
Ensure = [Ensure]::Absent
WsusServer = $this.WsusServer
Group = $null
}
}
}

 

[...]

 

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\"