Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Rozpocznij tworzenie zasobu DSC opartego na klasie, aby zarządzać plikiem konfiguracji. Ukończenie tego samouczka zapewnia funkcjonalny zasób DSC oparty na klasie funkcjonalnej w module, którego można użyć do dalszej nauki i dostosowywania.
Ten samouczek zawiera informacje na temat wykonywania następujących czynności:
- Tworzenie szkieletu modułu zasobów DSC
- Dodawanie zasobu DSC opartego na klasie
- Definiowanie właściwości zasobu DSC
- Implementowanie metod zasobów DSC
- Eksportowanie zasobu DSC w manifeście modułu
- Ręczne testowanie zasobu DSC
Uwaga
Przykładowe dane wyjściowe w tym samouczku są zgodne z programem PowerShell 7.2 na komputerze z systemem Windows. Samouczek jest prawidłowy w przypadku Windows PowerShell i programu PowerShell na komputerze z systemem Linux lub macOS. Tylko dane wyjściowe są specyficzne dla uruchamiania poleceń w programie PowerShell na komputerze z systemem Windows.
Wymagania wstępne
- Program PowerShell lub Windows PowerShell 5.1
- Program VS Code z rozszerzeniem programu PowerShell
1 — Tworzenie szkieletu modułu zasobów DSC
Zasoby DSC muszą być zdefiniowane w module programu PowerShell.
Tworzenie folderu modułu
Utwórz nowy folder o nazwie ExampleResources. Ten folder jest używany jako folder główny modułu i cały kod w tym samouczku.
New-Item -Path './ExampleResources' -ItemType Directory
Directory: C:\code\dsc
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 9/8/2022 12:54 PM ExampleResources
Tworzenie modułu za pomocą programu VS Code
Otwórz folder w programie ExampleResources VS Code. Otwórz zintegrowany terminal w programie VS Code. Upewnij się, że terminal działa w programie PowerShell lub Windows PowerShell.
Ważne
W pozostałej części tego samouczka uruchom określone polecenia w zintegrowanym terminalu w katalogu głównym folderu modułu. Jest to domyślny katalog roboczy w programie VS Code.
Tworzenie plików modułu
Utwórz manifest modułu za pomocą New-ModuleManifest polecenia cmdlet . Użyj ./ExampleResources.psd1 jako ścieżki. Określ wartości RootModule jako ExampleResources.psm1 i DscResourcesToExport jako Tailspin.
$ModuleSettings = @{
RootModule = 'ExampleResources.psm1'
DscResourcesToExport = 'Tailspin'
}
New-ModuleManifest -Path ./ExampleResources.psd1 @ModuleSettings
Get-Module -ListAvailable -Name ./ExampleResources.psd1 | Format-List
Name : ExampleResources
Path : C:\code\dsc\ExampleResources\ExampleResources.psd1
Description :
ModuleType : Script
Version : 0.0.1
PreRelease :
NestedModules : {}
ExportedFunctions :
ExportedCmdlets :
ExportedVariables :
ExportedAliases :
Utwórz plik modułu głównego jako ExampleResources.psm1.
New-Item -Path ./ExampleResources.psm1
Directory: C:\code\dsc\ExampleResources
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 9/8/2022 1:57 PM 0 ExampleResources.psm1
Utwórz plik skryptu o nazwie Helpers.ps1.
New-Item -Path ./Helpers.ps1
Directory: C:\code\dsc\ExampleResources
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 9/8/2022 1:58 PM 0 Helpers.ps1
Otwórz Helpers.ps1 w programie VS Code. Dodaj następujący wiersz, zastępując ciąg <Separator> ciągiem ; , jeśli jesteś w systemie Windows i : jeśli korzystasz z systemu Linux lub macOS.
$env:PSModulePath += "<Separator>$pwd"
Otwórz ExampleResources.psm1 w programie VS Code. Moduł jest teraz szkieletowany i gotowy do utworzenia zasobu DSC.
2 — Dodawanie zasobu DSC opartego na klasie
Aby zdefiniować zasób DSC oparty na klasie, zapisujemy klasę programu PowerShell w pliku modułu i dodajemy do niego atrybut DscResource .
Definiowanie klasy
W pliku ExampleResources.psm1 dodaj następujący kod:
[DscResource()]
class Tailspin {
}
Ten kod dodaje Tailspin jako klasowy zasób DSC do modułu ExampleResources .
Zatrzymaj wskaźnik myszy i [DscResource()] odczytaj ostrzeżenia.
Umieszczenie wskaźnika myszy na atrybucie DSCResource powoduje wyświetlenie czterech ostrzeżeń. 1. Zasób DSC "Tailspin" nie ma metody "Set()", która zwraca wartość "[void]" i nie akceptuje żadnych parametrów. 2. W zasobie DSC "Tailspin" brakuje metody "Get()", która zwraca wartość "[Tailspin]" i akceptuje brak parametrów. 3. W zasobie DSC "Tailspin" brakuje metody "Test()", która zwraca wartość "[bool]" i nie akceptuje żadnych parametrów. 4. Zasób DSC "Tailspin" musi mieć co najmniej jedną właściwość klucza (przy użyciu składni "[DscProperty(Key)]".
Te ostrzeżenia zawierają listę wymagań dotyczących klasy jako prawidłowego zasobu DSC.
Minimalna implementacja wymaganych metod
Dodaj minimalną implementację Get()metod , Test()i Set() do klasy .
class Tailspin {
[Tailspin] Get() {
$CurrentState = [Tailspin]::new()
return $CurrentState
}
[bool] Test() {
return $true
}
[void] Set() {}
}
Po dodaniu metod atrybut DscResource ostrzega tylko o klasie, która nie ma właściwości Key .
3 — Definiowanie właściwości zasobu DSC
Przed metodami należy zdefiniować właściwości zasobu DSC. Właściwości definiują ustawienia, którymi można zarządzać dla zasobu DSC. Są one używane w metodach.
Omówienie aplikacji TSToy
Przed zdefiniowaniem właściwości zasobu DSC należy zrozumieć, jakie ustawienia chcesz zarządzać.
W tym samouczku definiujemy zasób DSC do zarządzania ustawieniami fikcyjnej aplikacji TSToy za pomocą pliku konfiguracji. TSToy to aplikacja, która ma konfigurację na poziomie użytkownika i komputera. Zasób DSC powinien mieć możliwość skonfigurowania dowolnego pliku.
Zasób DSC powinien umożliwić użytkownikom konfigurowanie:
- Zakres konfiguracji, którą zarządza,
MachinelubUser - Czy plik konfiguracji powinien istnieć
- Czy funkcja TSToy powinna zostać automatycznie zaktualizowana
- Jak często funkcja TSToy powinna sprawdzać dostępność aktualizacji z zakresu od 1 do 90 dni
Dodawanie właściwości ConfigurationScope
Aby zarządzać plikiem Machine konfiguracji lub User , należy zdefiniować właściwość zasobu DSC. Aby zdefiniować $ConfigurationScope właściwość w zasobie, dodaj następujący kod w klasie przed metodami:
[DscProperty(Key)] [TailspinScope]
$ConfigurationScope
Ten kod definiuje $ConfigurationScope jako właściwość Key zasobu DSC. Właściwość Klucz służy do unikatowego identyfikowania wystąpienia zasobu DSC. Dodanie tej właściwości spełnia jedno z wymagań, o których ostrzega atrybut DscResource podczas tworzenia szkieletu klasy.
Określa również, że $ConfigurationScopetyp to TailspinScope. Aby zdefiniować typ TailspinScope , dodaj następujące wyliczenie TailspinScope po definicji klasy w pliku ExampleResources.psm1:
enum TailspinScope {
Machine
User
}
To wyliczenie sprawia, że Machine i User jedyne prawidłowe wartości dla $ConfigurationScope właściwości zasobu DSC.
Dodawanie właściwości Ensure
Najlepszym rozwiązaniem $Ensure jest zdefiniowanie właściwości w celu kontrolowania, czy istnieje wystąpienie zasobu DSC. Właściwość $Ensure zwykle ma dwie prawidłowe wartości Absent i Present.
- Jeśli
$Ensurezostanie określony jakoPresent, zasób DSC tworzy element, jeśli nie istnieje. - Jeśli
$Ensurejest toAbsent, zasób DSC usuwa element, jeśli istnieje.
W przypadku zasobu DSC Tailspin element do utworzenia lub usunięcia jest plikiem konfiguracji dla określonego $ConfigurationScopeelementu .
Zdefiniuj element TailspinEnsure jako wyliczenie po tailspinScope. Powinna zawierać wartości Absent i Present.
enum TailspinEnsure {
Absent
Present
}
Następnie dodaj $Ensure właściwość w klasie po $ConfigurationScope właściwości . Powinien mieć pusty atrybut DscProperty , a jego typ powinien być TailspinEnsure. Wartość domyślna Presentto .
[DscProperty()] [TailspinEnsure]
$Ensure = [TailspinEnsure]::Present
Dodawanie właściwości UpdateAutomatically
Aby zarządzać aktualizacjami automatycznymi, zdefiniuj $UpdateAutomatically właściwość w klasie po $Ensure właściwości . Jego atrybut DscProperty powinien wskazywać, że jest obowiązkowy, a jego typ powinien być logiczny.
[DscProperty(Mandatory)] [bool]
$UpdateAutomatically
Dodawanie właściwości UpdateFrequency
Aby zarządzać częstotliwością sprawdzania dostępności aktualizacji przez TSToy, dodaj $UpdateFrequency właściwość w klasie po $UpdateAutomatically właściwości . Powinien mieć pusty atrybut DscProperty , a jego typ powinien być int. Użyj atrybutu ValidateRange , aby ograniczyć prawidłowe wartości do $UpdateFrequency zakresu od 1 do 90.
[DscProperty()] [int] [ValidateRange(1, 90)]
$UpdateFrequency
Dodawanie właściwości ukrytej pamięci podręcznej
Następnie dodaj dwie ukryte właściwości do buforowania bieżącego stanu zasobu: $CachedCurrentState i $CachedData. Ustaw typ $CachedCurrentState elementu na Tailspin, taki sam jak klasa i typ zwracany dla Get() metody. Ustaw typ elementu $CachedDatana WARTOŚĆ PSCustomObject. Prefiks obu właściwości z hidden słowem kluczowym. Nie należy określać atrybutu DscProperty dla obu.
hidden [Tailspin] $CachedCurrentState
hidden [PSCustomObject] $CachedData
Te ukryte właściwości będą używane w Get() metodach i Set() zdefiniowanych później.
Przejrzyj plik modułu
W tym momencie ExampleResources.psm1 należy zdefiniować następujące elementy:
- Klasa Tailspin z właściwościami
$ConfigurationScope,$Ensure,$UpdateAutomaticallyi$UpdateFrequency - Wyliczenie TailspinScope z wartościami
MachineiUser - Wyliczenie TailspinEnsure z wartościami
PresentiAbsent - Minimalne implementacje
Get()metod ,Test()iSet().
[DscResource()]
class Tailspin {
[DscProperty(Key)] [TailspinScope]
$ConfigurationScope
[DscProperty()] [TailspinEnsure]
$Ensure = [TailspinEnsure]::Present
[DscProperty(Mandatory)] [bool]
$UpdateAutomatically
[DscProperty()] [int] [ValidateRange(1,90)]
$UpdateFrequency
hidden [Tailspin] $CachedCurrentState
hidden [PSCustomObject] $CachedData
[Tailspin] Get() {
$CurrentState = [Tailspin]::new()
return $CurrentState
}
[bool] Test() {
$InDesiredState = $true
return $InDesiredState
}
[void] Set() {}
}
enum TailspinScope {
Machine
User
}
enum TailspinEnsure {
Absent
Present
}
Teraz, gdy zasób DSC spełnia wymagania, możesz go wyświetlić Get-DscResource . W programie VS Code otwórz nowy terminal programu PowerShell.
. ./Helpers.ps1
Get-DscResource -Name Tailspin -Module ExampleResources | Format-List
Get-DscResource -Name Tailspin -Module ExampleResources -Syntax
ImplementationDetail : ClassBased
ResourceType : Tailspin
Name : Tailspin
FriendlyName :
Module : ExampleResources
ModuleName : ExampleResources
Version : 0.0.1
Path : C:\code\dsc\ExampleResources\ExampleResources.psd1
ParentPath : C:\code\dsc\ExampleResources
ImplementedAs : PowerShell
CompanyName : Unknown
Properties : {ConfigurationScope, UpdateAutomatically, DependsOn, Ensure…}
Tailspin [String] #ResourceName
{
ConfigurationScope = [string]{ Machine | User }
UpdateAutomatically = [bool]
[DependsOn = [string[]]]
[Ensure = [string]{ Absent | Present }]
[PsDscRunAsCredential = [PSCredential]]
[UpdateFrequency = [Int32]]
}
4 — Implementowanie metod zasobów DSC
Metody zasobu DSC definiują sposób pobierania bieżącego stanu zasobu DSC, weryfikowania go względem żądanego stanu i wymuszania żądanego stanu.
Metoda Get
Metoda Get() pobiera bieżący stan zasobu DSC. Służy do ręcznego sprawdzania zasobu DSC i jest wywoływany przez metodę Test() .
Metoda Get() nie ma parametrów i zwraca wystąpienie klasy jako dane wyjściowe. W przypadku zasobu DSC minimalna Tailspin implementacja wygląda następująco:
[Tailspin] Get() {
$CurrentState = [Tailspin]::new()
return $CurrentState
}
Jedyną rzeczą, jaką wykonuje ta implementacja, jest utworzenie wystąpienia klasy Tailspin i zwrócenie jej. Możesz wywołać metodę za pomocą Invoke-DscResource polecenia , aby zobaczyć to zachowanie.
Invoke-DscResource -Name Tailspin -Module ExampleResources -Method Get -Property @{
ConfigurationScope = 'User'
UpdateAutomatically = $true
}
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
Machine Present False 0
Właściwości zwracanego obiektu są ustawione na wartość domyślną. Wartość powinna $ConfigurationScope zawsze być wartością dostarczoną przez użytkownika.
Get() Aby metoda była przydatna, musi zwrócić rzeczywisty stan zasobu DSC.
[Tailspin] Get() {
$CurrentState = [Tailspin]::new()
$CurrentState.ConfigurationScope = $this.ConfigurationScope
$this.CachedCurrentState = $CurrentState
return $CurrentState
}
Zmienna $this odwołuje się do działającego wystąpienia zasobu DSC. Teraz, jeśli używasz Invoke-DscResource ponownie, $ConfigurationScope ma poprawną wartość.
Invoke-DscResource -Name Tailspin -Module ExampleResources -Method Get -Property @{
ConfigurationScope = 'User'
UpdateAutomatically = $true
}
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present False 0
Następnie zasób DSC musi określić, czy plik konfiguracji istnieje. Jeśli tak się stanie, $Ensure powinien to być Present. Jeśli tak nie jest, $Ensure powinna to być Absentwartość .
Lokalizacja plików konfiguracji TSToy zależy od systemu operacyjnego i zakresu konfiguracji:
- W przypadku komputerów z systemem Windows:
- Plik
Machinekonfiguracji to%PROGRAMDATA%\TailSpinToys\tstoy\tstoy.config.json - Plik
Userkonfiguracji to%APPDATA%\TailSpinToys\tstoy\tstoy.config.json
- Plik
- W przypadku maszyn z systemem Linux:
- Plik
Machinekonfiguracji to/etc/xdg/TailSpinToys/tstoy/tstoy.config.json - Plik
Userkonfiguracji to~/.config/TailSpinToys/tstoy/tstoy.config.json
- Plik
- W przypadku maszyn z systemem macOS:
- Plik
Machinekonfiguracji to/Library/Preferences/TailSpinToys/tstoy/tstoy.config.json - Plik
Userkonfiguracji to~/Library/Preferences/TailSpinToys/tstoy/tstoy.config.json
- Plik
Aby obsłużyć te ścieżki, należy utworzyć metodę pomocnika . GetConfigurationFile()
[string] GetConfigurationFile() {
$FilePaths = @{
Linux = @{
Machine = '/etc/xdg/TailSpinToys/tstoy/tstoy.config.json'
User = '~/.config/TailSpinToys/tstoy/tstoy.config.json'
}
MacOS = @{
Machine = '/Library/Preferences/TailSpinToys/tstoy/tstoy.config.json'
User = '~/Library/Preferences/TailSpinToys/tstoy/tstoy.config.json'
}
Windows = @{
Machine = "$env:ProgramData\TailSpinToys\tstoy\tstoy.config.json"
User = "$env:APPDATA\TailSpinToys\tstoy\tstoy.config.json"
}
}
$Scope = $this.ConfigurationScope.ToString()
if ($Global:PSVersionTable.PSVersion.Major -lt 6 -or $Global:IsWindows) {
return $FilePaths.Windows.$Scope
} elseif ($Global:IsLinux) {
return $FilePaths.Linux.$Scope
} else {
return $FilePaths.MacOS.$Scope
}
}
Aby przetestować tę nową metodę, wykonaj instrukcję using , aby załadować klasy i wyliczenia modułu ExampleResources do bieżącej sesji.
using module ./ExampleResources.psd1
$Example = [Tailspin]::new()
$Example
$Example.GetConfigurationFile()
$Example.ConfigurationScope = 'User'
$Example.GetConfigurationFile()
Ensure ConfigurationScope UpdateAutomatically UpdateFrequency
------- ------------------ ------------------- ---------------
Present Machine False 0
C:\ProgramData\TailSpinToys\tstoy\tstoy.config.json
C:\Users\mikey\AppData\Roaming\TailSpinToys\tstoy\tstoy.config.json
Otwórz Helpers.ps1 w programie VS Code. Skopiuj i wklej ścieżki dla plików konfiguracji do skryptu, przypisując je do $TSToyMachinePath i $TSToyUserPath. Plik powinien wyglądać następująco:
$env:PSModulePath += "<separator>$pwd"
$TSToyMachinePath = '<machine configuration file path>'
$TSToyUserPath = '<user configuration file path>'
Zamknij terminal w programie VS Code i otwórz nowy terminal. Kropka źródłowa Helpers.ps1.
. ./Helpers.ps1
Teraz możesz napisać resztę Get() metody.
[Tailspin] Get() {
$CurrentState = [Tailspin]::new()
$CurrentState.ConfigurationScope = $this.ConfigurationScope
$FilePath = $this.GetConfigurationFile()
if (!(Test-Path -Path $FilePath)) {
$CurrentState.Ensure = [TailspinEnsure]::Absent
return $CurrentState
}
$Data = Get-Content -Raw -Path $FilePath |
ConvertFrom-Json -ErrorAction Stop
$this.CachedData = $Data
if ($null -ne $Data.Updates.Automatic) {
$CurrentState.UpdateAutomatically = $Data.Updates.Automatic
}
if ($null -ne $Data.Updates.CheckFrequency) {
$CurrentState.UpdateFrequency = $Data.Updates.CheckFrequency
}
$this.CachedCurrentState = $CurrentState
return $CurrentState
}
Po ustawieniu $ConfigurationScope i określeniu ścieżki pliku konfiguracji metoda sprawdza, czy plik istnieje. Jeśli nie istnieje, ustawienie $Ensure wartości Absent i zwrócenie wyniku jest potrzebne.
Jeśli plik istnieje, metoda musi przekonwertować zawartość z formatu JSON, aby utworzyć bieżący stan konfiguracji. Następnie metoda sprawdza, czy klucze mają jakąkolwiek wartość przed przypisaniem ich do właściwości bieżącego stanu. Jeśli nie zostaną określone, zasób DSC musi rozważyć ich usunięcie i stan domyślny.
W tym momencie zasób DSC buforuje dane. Buforowanie danych umożliwia sprawdzenie danych podczas programowania i będzie przydatne podczas implementowania Set() metody.
To zachowanie można sprawdzić lokalnie.
$GetParameters = @{
Name = 'Tailspin'
Module = 'ExampleResources'
Method = 'Get'
Property = @{
ConfigurationScope = 'User'
}
}
Invoke-DscResource @GetParameters
New-Item -Path $UserPath -Force
Invoke-DscResource @GetParameters
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Absent False 0
Directory: C:\Users\mikey\AppData\Roaming\TailSpinToys\tstoy
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 9/15/2022 3:43 PM 0 tstoy.config.json
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present False 0
User Otwórz plik konfiguracji zakresu w programie VS Code.
code $UserPath
Skopiuj tę konfigurację JSON do pliku i zapisz ją.
{
"unmanaged_key": true,
"updates": {
"automatic": true,
"checkFrequency": 30
}
}
Wywołaj Invoke-DscResource ponownie i zobacz wartości odzwierciedlone w wynikach.
Invoke-DscResource @GetParameters
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present True 30
Metoda Get() zwraca teraz dokładne informacje o bieżącym stanie zasobu DSC.
Metoda Test
Za pomocą zaimplementowanej Get() metody można sprawdzić, czy bieżący stan jest zgodny z żądanym stanem.
Metody minimalna implementacja Test() zawsze zwraca wartość $true.
[bool] Test() {
return $true
}
Możesz to sprawdzić, uruchamiając polecenie Invoke-DscResource.
$SharedParameters = @{
Name = 'Tailspin'
Module = 'ExampleResources'
Property = @{
ConfigurationScope = 'User'
UpdateAutomatically = $false
}
}
Invoke-DscResource -Method Get @SharedParameters
Invoke-DscResource -Method Test @SharedParameters
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present True 30
InDesiredState
--------------
True
Należy dokładnie odzwierciedlić metodę Test() , czy zasób DSC jest w żądanym stanie. Metoda Test() powinna zawsze wywoływać metodę, Get() aby mieć bieżący stan w celu porównania z żądanym stanem. Następnie sprawdź, czy $Ensure właściwość jest poprawna. Jeśli tak nie jest, wróć $false natychmiast. Nie są wymagane żadne dalsze kontrole, jeśli $Ensure właściwość jest poza żądanym stanem.
[bool] Test() {
$CurrentState = $this.Get()
if ($CurrentState.Ensure -ne $this.Ensure) {
return $false
}
return $true
}
Teraz możesz zweryfikować zaktualizowane zachowanie.
$TestParameters = @{
Name = 'Tailspin'
Module = 'ExampleResources'
Property = @{
ConfigurationScope = 'User'
UpdateAutomatically = $false
Ensure = 'Absent'
}
}
Invoke-DscResource -Method Test @TestParameters
$TestParameters.Property.Ensure = 'Present'
Invoke-DscResource -Method Test @TestParameters
InDesiredState
--------------
False
InDesiredState
--------------
True
Następnie sprawdź, czy wartość $Ensure to Absent. Jeśli plik konfiguracji nie istnieje i nie powinien istnieć, nie ma powodu, aby sprawdzić pozostałe właściwości.
[bool] Test() {
$CurrentState = $this.Get()
if ($CurrentState.Ensure -ne $this.Ensure) {
return $false
}
if ($CurrentState.Ensure -eq [TailspinEnsure]::Absent) {
return $true
}
return $true
}
Następnie metoda musi porównać bieżący stan właściwości, które zarządzają zachowaniem aktualizacji TSToy. Najpierw sprawdź, czy $UpdateAutomatically właściwość jest w prawidłowym stanie. Jeśli tak nie jest, zwróć polecenie $false.
[bool] Test() {
$CurrentState = $this.Get()
if ($CurrentState.Ensure -ne $this.Ensure) {
return $false
}
if ($CurrentState.Ensure -eq [TailspinEnsure]::Absent) {
return $true
}
if ($CurrentState.UpdateAutomatically -ne $this.UpdateAutomatically) {
return $false
}
return $true
}
Aby porównać $UpdateFrequencymetodę , musimy określić, czy użytkownik określił wartość. Ponieważ $UpdateFrequency atrybut ValidateRange właściwości jest inicjowany i 0 określa, że musi być między 1 i 90, wiemy, że wartość 0 wskazuje, że właściwość nie została określona.
Dzięki tym informacjom Test() metoda powinna:
- Zwracanie
$true, jeśli użytkownik nie określił$UpdateFrequency - Zwracanie
$false, jeśli użytkownik określił$UpdateFrequency, a wartość systemu nie jest równa wartości określonej przez użytkownika - Zwracanie
$true, jeśli żaden z poprzednich warunków nie został spełniony
[bool] Test() {
$CurrentState = $this.Get()
if ($CurrentState.Ensure -ne $this.Ensure) {
return $false
}
if ($CurrentState.Ensure -eq [TailspinEnsure]::Absent) {
return $true
}
if ($CurrentState.UpdateAutomatically -ne $this.UpdateAutomatically) {
return $false
}
if ($this.UpdateFrequency -eq 0) {
return $true
}
if ($CurrentState.UpdateFrequency -ne $this.UpdateFrequency) {
return $false
}
return $true
}
Test() Teraz metoda używa następującej kolejności operacji:
- Pobierz bieżący stan konfiguracji TSToy.
- Zwróć,
$falsejeśli konfiguracja istnieje, gdy nie powinna istnieć lub nie istnieje, gdy powinna. - Zwróć,
$truejeśli konfiguracja nie istnieje i nie powinna istnieć. - Zwróć,
$falsejeśli ustawienie automatycznej aktualizacji konfiguracji nie jest zgodne z żądanym ustawieniem. - Zwróć,
$truejeśli użytkownik nie określił wartości ustawienia częstotliwości aktualizacji. - Zwróć,
$falsejeśli określona wartość użytkownika dla ustawienia częstotliwości aktualizacji nie jest zgodna z ustawieniem konfiguracji. - Zwróć,
$truejeśli żaden z poprzednich warunków nie został spełniony.
Możesz sprawdzić metodę Test() lokalnie:
$SharedParameters = @{
Name = 'Tailspin'
Module = 'ExampleResources'
Property = @{
ConfigurationScope = 'User'
Ensure = 'Present'
UpdateAutomatically = $false
}
}
Invoke-DscResource -Method Get @SharedParameters
Invoke-DscResource -Method Test @SharedParameters
$SharedParameters.Property.UpdateAutomatically = $true
Invoke-DscResource -Method Test @SharedParameters
$SharedParameters.Property.UpdateFrequency = 1
Invoke-DscResource -Method Test @SharedParameters
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present True 30
InDesiredState
--------------
False
InDesiredState
--------------
True
InDesiredState
--------------
False
Dzięki temu kodowi metoda jest w stanie dokładnie określić, Test() czy plik konfiguracji jest w żądanym stanie.
Metoda Set
Teraz, gdy Get() metody i Test() działają niezawodnie, można zdefiniować metodę, aby rzeczywiście wymusić Set() żądany stan.
W minimalnej implementacji Set() metoda nic nie robi.
[void] Set() {}
Najpierw należy określić, Set() czy zasób DSC musi zostać utworzony, zaktualizowany lub usunięty.
[void] Set() {
if ($this.Test()) {
return
}
$CurrentState = $this.CachedCurrentState
$IsAbsent = $CurrentState.Ensure -eq [TailspinEnsure]::Absent
$ShouldBeAbsent = $this.Ensure -eq [TailspinEnsure]::Absent
if ($IsAbsent) {
# Create
} elseif ($ShouldBeAbsent) {
# Remove
} else {
# Update
}
}
Set() najpierw wywołuje metodę , Test() aby określić, czy coś rzeczywiście należy zrobić. Niektóre narzędzia, takie jak funkcja konfiguracji maszyny usługi Azure Automanage, zapewniają, że Set() metoda jest wywoływana tylko po metodzie Test() . Nie ma jednak takiej gwarancji, gdy używasz Invoke-DscResource polecenia cmdlet .
Test() Ponieważ metoda wywołuje Get()metodę , która buforuje bieżący stan, zasób DSC może uzyskać dostęp do buforowanego bieżącego stanu bez konieczności ponownego Get() wywoływania metody.
Następnie zasób DSC musi rozróżniać zachowania tworzenia, usuwania i aktualizacji dla pliku konfiguracji. Jeśli plik konfiguracji nie istnieje, wiemy, że powinien zostać utworzony. Jeśli plik konfiguracji istnieje i nie powinien, wiemy, że należy go usunąć. Jeśli plik konfiguracji istnieje i powinien istnieć, wiemy, że należy go zaktualizować.
Utwórz trzy nowe metody do obsługi tych operacji i wywołaj je w metodzie zgodnie z potrzebami Set() .
Zwracany typ dla wszystkich trzech powinien mieć wartość void.
[void] Set() {
if ($this.Test()) {
return
}
$CurrentState = $this.CachedCurrentState
$IsAbsent = $CurrentState.Ensure -eq [TailspinEnsure]::Absent
$ShouldBeAbsent = $this.Ensure -eq [TailspinEnsure]::Absent
if ($IsAbsent) {
$this.Create()
} elseif ($ShouldBeAbsent) {
$this.Remove()
} else {
$this.Update()
}
}
[void] Create() {}
[void] Remove() {}
[void] Update() {}
Ponadto utwórz nową metodę o nazwie ToConfigJson(). Jego zwracany typ powinien być ciągiem. Ta metoda konwertuje zasób DSC na kod JSON oczekiwany przez plik konfiguracji. Możesz rozpocząć od następującej minimalnej implementacji:
[string] ToConfigJson() {
$config = @{}
return ($config | ConvertTo-Json)
}
Metoda ToConfigJson
Minimalna implementacja zwraca pusty obiekt JSON jako ciąg. Aby było to przydatne, musi zwrócić rzeczywistą reprezentację ustawień w formacie JSON w pliku konfiguracji TSToy.
Najpierw należy wstępnie wypełniać tabelę $config skrótów przy użyciu obowiązkowego ustawienia aktualizacji automatycznych, dodając updates klucz z jego wartością jako tabelę skrótów. Tabela skrótów automatic powinna mieć klucz . Przypisz wartość właściwości klasy $UpdateAutomatically do automatic klucza.
[string] ToConfigJson() {
$config = @{
updates = @{
automatic = $this.UpdateAutomatically
}
}
return ($config | ConvertTo-Json)
}
Ten kod tłumaczy reprezentację zasobu DSC ustawień TSToy na strukturę oczekiwaną przez plik konfiguracji TSToy.
Następnie metoda musi sprawdzić, czy klasa buforowała dane z istniejącego pliku konfiguracji. Buforowane dane umożliwiają zasobowi DSC zarządzanie zdefiniowanymi ustawieniami bez zastępowania lub usuwania niezarządzanych ustawień.
[string] ToConfigJson() {
$config = @{
updates = @{
automatic = $this.UpdateAutomatically
}
}
if ($this.CachedData) {
# Copy unmanaged settings without changing the cached values
$this.CachedData |
Get-Member -MemberType NoteProperty |
Where-Object -Property Name -NE -Value 'updates' |
ForEach-Object -Process {
$setting = $_.Name
$config.$setting = $this.CachedData.$setting
}
# Add the checkFrequency to the hashtable if it is set in the cache
if ($frequency = $this.CachedData.updates.checkFrequency) {
$config.updates.checkFrequency = $frequency
}
}
# If the user specified an UpdateFrequency, use that value
if ($this.UpdateFrequency -ne 0) {
$config.updates.checkFrequency = $this.UpdateFrequency
}
return ($config | ConvertTo-Json)
}
Jeśli klasa buforowała ustawienia z istniejącej konfiguracji, to:
Sprawdza właściwości buforowanych danych, szukając żadnych właściwości, którymi nie zarządza zasób DSC. Jeśli zostanie znalezione, metoda wstawia te niezarządzane właściwości do tabeli skrótów
$config.Ponieważ zasób DSC zarządza tylko ustawieniami aktualizacji, każde ustawienie z wyjątkiem
updatesjest wstawiane.Sprawdza, czy
checkFrequencyustawienie wupdatespliku jest ustawione. Jeśli jest ustawiona, metoda wstawia tę wartość do tabeli skrótów$config.Ta operacja umożliwia zasobowi DSC zignorowanie
$UpdateFrequencywłaściwości, jeśli użytkownik go nie określi.Na koniec metoda musi sprawdzić, czy użytkownik określił
$UpdateFrequencywłaściwość i wstaw ją do tabeli skrótów$config, jeśli tak.
W tym kodzie ToConfigJson() metoda:
- Zwraca dokładną reprezentację JSON żądanego stanu oczekiwanego przez aplikację TSToy w pliku konfiguracji
- Uwzględnia ustawienia TSToy, którymi zasób DSC nie zarządza jawnie
- Uwzględnia istniejącą wartość częstotliwości aktualizacji TSToy, jeśli użytkownik go nie określił, w tym pozostawiając go niezdefiniowany w pliku konfiguracji
Aby przetestować tę nową metodę, zamknij terminal programu VS Code i otwórz nowy. Wykonaj instrukcję using , aby załadować klasy i wyliczenia modułu ExampleResources do bieżącej sesji i dot-source skryptu helpers.ps1 .
using module ./ExampleResources.psd1
. ./Helpers.ps1
$Example = [Tailspin]::new()
Get-Content -Path $UserPath
$Example.ConfigurationScope = 'User'
$Example.ToConfigJson()
Przed wywołaniem Get() metody jedyną wartością w danych wyjściowych metody ToJsonConfig jest przekonwertowana wartość właściwości $UpdateAutomatically .
{
"unmanaged_key": true,
"updates": {
"automatic": true,
"checkFrequency": 30
}
}
{
"updates": {
"automatic": false
}
}
$Example.Get()
$Example.ToConfigJson()
Po wywołaniu Get()metody dane wyjściowe zawierają niezarządzany klucz najwyższego poziomu, unmanaged_key. Zawiera również istniejące ustawienie w pliku konfiguracji, $UpdateFrequency ponieważ nie zostało jawnie ustawione w zasobie DSC.
Ensure ConfigurationScope UpdateAutomatically UpdateFrequency
------ ------------------ ------------------- ---------------
Present User True 30
{
"unmanaged_key": true,
"updates": {
"checkFrequency": 30,
"automatic": false
}
}
$Example.UpdateFrequency = 7
$Example.ToConfigJson()
Po $UpdateFrequency ustawieniu dane wyjściowe odzwierciedlają określoną wartość.
{
"unmanaged_key": true,
"updates": {
"checkFrequency": 7,
"automatic": false
}
}
Metoda Create
Aby zaimplementować metodę Create() , musimy przekonwertować właściwości określone przez użytkownika dla zasobu DSC na kod JSON, którego oczekuje TSToy w pliku konfiguracji i zapisać w tym pliku.
[void] Create() {
$ErrorActionPreference = 'Stop'
$Json = $this.ToConfigJson()
$FilePath = $this.GetConfigurationFile()
$FolderPath = Split-Path -Path $FilePath
if (!(Test-Path -Path $FolderPath)) {
New-Item -Path $FolderPath -ItemType Directory -Force
}
Set-Content -Path $FilePath -Value $Json -Encoding utf8 -Force
}
Metoda używa ToConfigJson() metody , aby pobrać kod JSON dla pliku konfiguracji. Sprawdza, czy folder pliku konfiguracji istnieje i tworzy go w razie potrzeby. Na koniec tworzy plik konfiguracji i zapisuje w nim kod JSON.
Metoda Remove
Metoda Remove() ma najprostsze zachowanie. Jeśli plik konfiguracji istnieje, usuń go.
[void] Remove() {
Remove-Item -Path $this.GetConfigurationFile() -Force -ErrorAction Stop
}
Metoda Update
Implementacja Update() metody jest podobna do metody Create . Musi przekonwertować właściwości określone przez użytkownika dla zasobu DSC na kod JSON oczekiwany przez TSToy w pliku konfiguracji i zastąpić ustawienia w tym pliku.
[void] Update() {
$ErrorActionPreference = 'Stop'
$Json = $this.ToConfigJson()
$FilePath = $this.GetConfigurationFile()
Set-Content -Path $FilePath -Value $Json -Encoding utf8 -Force
}
5 — Ręczne testowanie zasobu DSC
Za pomocą w pełni zaimplementowanego zasobu DSC można teraz przetestować jego zachowanie.
Przed rozpoczęciem testowania zamknij terminal programu VS Code i otwórz nowy. Kropka źródło skryptu Helpers.ps1 .
Dla każdego scenariusza testowego utwórz tabelę $DesiredState skrótów zawierającą parametry udostępnione i wywołaj metody w następującej kolejności:
-
Get(), aby pobrać początkowy stan zasobu DSC -
Test(), aby sprawdzić, czy zasób DSC uważa go za w żądanym stanie -
Set(), aby wymusić żądany stan -
Test(), aby sprawdzić, czy zasób DSC uważa, że został prawidłowo ustawiony -
Get(), aby potwierdzić stan końcowy zasobu DSC
Scenariusz: TSToy nie powinien być automatycznie aktualizowany w zakresie użytkownika
W tym scenariuszu istniejąca konfiguracja w zakresie użytkownika musi być skonfigurowana do automatycznego aktualizowania. Wszystkie inne ustawienia powinny pozostać niezmienione.
. ./Helpers.ps1
$DesiredState = @{
Name = 'Tailspin'
Module = 'ExampleResources'
Property = @{
ConfigurationScope = 'User'
UpdateAutomatically = $false
Ensure = 'Present'
}
}
Get-Content -Path $UserPath
Invoke-DscResource @DesiredState -Method Get
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Set
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Get
Get-Content -Path $UserPath
{
"unmanaged_key": true,
"updates": {
"automatic": true,
"checkFrequency": 30
}
}
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present True 30
InDesiredState
--------------
False
RebootRequired
--------------
False
InDesiredState
--------------
True
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present False 30
{
"unmanaged_key": true,
"updates": {
"checkFrequency": 30,
"automatic": false
}
}
Scenariusz: Tailspin powinien być automatycznie aktualizowany zgodnie z dowolnym harmonogramem w zakresie użytkownika
W tym scenariuszu istniejąca konfiguracja w zakresie użytkownika musi być skonfigurowana do automatycznego aktualizowania. Wszystkie inne ustawienia powinny pozostać niezmienione.
. ./Helpers.ps1
$DesiredState = @{
Name = 'Tailspin'
Module = 'ExampleResources'
Property = @{
ConfigurationScope = 'User'
UpdateAutomatically = $true
Ensure = 'Present'
}
}
Get-Content -Path $UserPath
Invoke-DscResource @DesiredState -Method Get
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Set
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Get
Get-Content -Path $UserPath
{
"unmanaged_key": true,
"updates": {
"checkFrequency": 30,
"automatic": false
}
}
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present False 30
InDesiredState
--------------
False
RebootRequired
--------------
False
InDesiredState
--------------
True
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present True 30
{
"unmanaged_key": true,
"updates": {
"checkFrequency": 30,
"automatic": true
}
}
Scenariusz: TSToy powinien być aktualizowany automatycznie codziennie w zakresie użytkownika
W tym scenariuszu istniejąca konfiguracja w zakresie użytkownika musi być skonfigurowana do automatycznego i codziennego aktualizowania. Wszystkie inne ustawienia powinny pozostać niezmienione.
. ./Helpers.ps1
$DesiredState = @{
Name = 'Tailspin'
Module = 'ExampleResources'
Property = @{
ConfigurationScope = 'User'
UpdateAutomatically = $true
UpdateFrequency = 1
Ensure = 'Present'
}
}
Get-Content -Path $UserPath
Invoke-DscResource @DesiredState -Method Get
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Set
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Get
Get-Content -Path $UserPath
{
"unmanaged_key": true,
"updates": {
"checkFrequency": 30,
"automatic": true
}
}
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present True 30
InDesiredState
--------------
False
RebootRequired
--------------
False
InDesiredState
--------------
True
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present True 1
{
"unmanaged_key": true,
"updates": {
"automatic": true,
"checkFrequency": 1
}
}
Scenariusz: TSToy nie powinien mieć konfiguracji zakresu użytkownika
W tym scenariuszu plik konfiguracji TSToy w zakresie użytkownika nie powinien istnieć. Jeśli tak, zasób DSC powinien usunąć plik.
. ./Helpers.ps1
$DesiredState = @{
Name = 'Tailspin'
Module = 'ExampleResources'
Property = @{
ConfigurationScope = 'User'
UpdateAutomatically = $true
Ensure = 'Absent'
}
}
Get-Content -Path $UserPath
Invoke-DscResource @DesiredState -Method Get
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Set
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Get
Test-Path -Path $UserPath
{
"unmanaged_key": true,
"updates": {
"checkFrequency": 30,
"automatic": true
}
}
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Present True 30
InDesiredState
--------------
False
RebootRequired
--------------
False
InDesiredState
--------------
True
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
User Absent False 0
False
Scenariusz: TSToy powinien być aktualizowany automatycznie co tydzień w zakresie maszyny
W tym scenariuszu nie ma zdefiniowanej konfiguracji w zakresie maszyny. Zakres maszyny musi być skonfigurowany do automatycznego i codziennego aktualizowania. Zasób DSC powinien utworzyć plik i wszystkie foldery nadrzędne zgodnie z potrzebami.
. ./Helpers.ps1
$DesiredState = @{
Name = 'Tailspin'
Module = 'ExampleResources'
Property = @{
ConfigurationScope = 'Machine'
UpdateAutomatically = $true
Ensure = 'Present'
}
}
Test-Path -Path $MachinePath, (Split-Path -Path $MachinePath)
Invoke-DscResource @DesiredState -Method Get
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Set
Invoke-DscResource @DesiredState -Method Test
Invoke-DscResource @DesiredState -Method Get
Get-Content -Path $MachinePath
False
False
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
Machine Absent False 0
InDesiredState
--------------
False
RebootRequired
--------------
False
InDesiredState
--------------
True
ConfigurationScope Ensure UpdateAutomatically UpdateFrequency
------------------ ------ ------------------- ---------------
Machine Present True 0
{
"updates": {
"automatic": true
}
}
Przegląd
W tym samouczku zostały wykonane następujące czynności:
- Tworzenie szkieletu modułu programu PowerShell i zaimplementowanie opartego
Tailspinna klasie zasobu DSC - Zdefiniowano właściwości zasobu DSC w celu zarządzania zachowaniem aktualizacji aplikacji TSToy na maszynie i w zakresach użytkownika z weryfikacją tych właściwości
- Zaimplementowane wyliczenia dla właściwości
$Ensurei$ConfigurationScope - Zaimplementowano metodę
GetConfigurationFile()pomocnika, aby niezawodnie odnaleźć lokalizację konfiguracji aplikacji TSToy w zakresie komputera i użytkownika na różnych platformach - Zaimplementowano metodę
Get()w celu pobrania bieżącego stanu zasobu DSC, buforowania go do użycia w metodachTest()iSet() - Zaimplementowano metodę
Test()w celu zweryfikowania bieżącego stanu zachowania aktualizacji TSToy w określonym zakresie względem żądanego stanu - Zaimplementowano metodę ToConfigJson w celu przekonwertowania żądanego stanu zasobu DSC na obiekt JSON, którego aplikacja TSToy wymaga dla pliku konfiguracji, uwzględniając ustawienia niezarządzane
- Zaimplementowano metodę
Set()i metody pomocnika Create, Remove i Update , aby idempotentnie wymusić żądany stan aktualizacji TSToy w określonym zakresie, zapewniając, że zasób DSC nie ma niepożądanych skutków ubocznych - Ręcznie przetestowano typowe scenariusze użycia dla zasobu DSC
Na końcu implementacji definicja modułu wygląda następująco:
[DscResource()]
class Tailspin {
[DscProperty(Key)] [TailspinScope]
$ConfigurationScope
[DscProperty()] [TailspinEnsure]
$Ensure = [TailspinEnsure]::Present
[DscProperty(Mandatory)] [bool]
$UpdateAutomatically
[DscProperty()] [int] [ValidateRange(1, 90)]
$UpdateFrequency
hidden [Tailspin] $CachedCurrentState
hidden [PSCustomObject] $CachedData
[Tailspin] Get() {
$CurrentState = [Tailspin]::new()
$CurrentState.ConfigurationScope = $this.ConfigurationScope
$FilePath = $this.GetConfigurationFile()
if (!(Test-Path -Path $FilePath)) {
$CurrentState.Ensure = [TailspinEnsure]::Absent
$this.CachedCurrentState = $CurrentState
return $CurrentState
}
$CurrentState.Ensure = [TailspinEnsure]::Present
$Data = Get-Content -Raw -Path $FilePath |
ConvertFrom-Json -ErrorAction Stop
$this.CachedData = $Data
if ($null -ne $Data.Updates.Automatic) {
$CurrentState.UpdateAutomatically = $Data.Updates.Automatic
}
if ($null -ne $Data.Updates.CheckFrequency) {
$CurrentState.UpdateFrequency = $Data.Updates.CheckFrequency
}
$this.CachedCurrentState = $CurrentState
return $CurrentState
}
[bool] Test() {
$CurrentState = $this.Get()
if ($CurrentState.Ensure -ne $this.Ensure) {
return $false
}
if ($CurrentState.UpdateAutomatically -ne $this.UpdateAutomatically) {
return $false
}
if ($this.UpdateFrequency -eq 0) {
return $true
}
if ($CurrentState.UpdateFrequency -ne $this.UpdateFrequency) {
return $false
}
return $true
}
[void] Set() {
if ($this.Test()) {
return
}
$CurrentState = $this.CachedCurrentState
$IsAbsent = $CurrentState.Ensure -eq [TailspinEnsure]::Absent
$ShouldBeAbsent = $this.Ensure -eq [TailspinEnsure]::Absent
if ($IsAbsent) {
$this.Create()
} elseif ($ShouldBeAbsent) {
$this.Remove()
} else {
$this.Update()
}
}
[string] GetConfigurationFile() {
$FilePaths = @{
Linux = @{
Machine = '/etc/xdg/TailSpinToys/tstoy/tstoy.config.json'
User = '~/.config/TailSpinToys/tstoy/tstoy.config.json'
}
MacOS = @{
Machine = '/Library/Preferences/TailSpinToys/tstoy/tstoy.config.json'
User = '~/Library/Preferences/TailSpinToys/tstoy/tstoy.config.json'
}
Windows = @{
Machine = "$env:ProgramData\TailSpinToys\tstoy\tstoy.config.json"
User = "$env:APPDATA\TailSpinToys\tstoy\tstoy.config.json"
}
}
$Scope = $this.ConfigurationScope.ToString()
if ($Global:PSVersionTable.PSVersion.Major -lt 6 -or $Global:IsWindows) {
return $FilePaths.Windows.$Scope
}
elseif ($Global:IsLinux) {
return $FilePaths.Linux.$Scope
}
else {
return $FilePaths.MacOS.$Scope
}
}
[void] Create() {
$ErrorActionPreference = 'Stop'
$Json = $this.ToConfigJson()
$FilePath = $this.GetConfigurationFile()
$FolderPath = Split-Path -Path $FilePath
if (!(Test-Path -Path $FolderPath)) {
New-Item -Path $FolderPath -ItemType Directory -Force
}
Set-Content -Path $FilePath -Value $Json -Encoding utf8 -Force
}
[void] Remove() {
Remove-Item -Path $this.GetConfigurationFile() -Force -ErrorAction Stop
}
[void] Update() {
$ErrorActionPreference = 'Stop'
$Json = $this.ToConfigJson()
$FilePath = $this.GetConfigurationFile()
Set-Content -Path $FilePath -Value $Json -Encoding utf8 -Force
}
[string] ToConfigJson() {
$config = @{
updates = @{
automatic = $this.UpdateAutomatically
}
}
if ($this.CachedData) {
$this.CachedData |
Get-Member -MemberType NoteProperty |
Where-Object -Property Name -NE -Value 'updates' |
ForEach-Object -Process {
$setting = $_.Name
$config.$setting = $this.CachedData.$setting
}
if ($frequency = $this.CachedData.updates.CheckFrequency) {
$config.updates.checkFrequency = $frequency
}
}
if ($this.UpdateFrequency -ne 0) {
$config.updates.checkFrequency = $this.UpdateFrequency
}
return ($config | ConvertTo-Json)
}
}
enum TailspinScope {
Machine
User
}
enum TailspinEnsure {
Absent
Present
}
Czyszczenie
Jeśli nie zamierzasz nadal korzystać z tego modułu ExampleResources , usuń folder i pliki w nim.
Następne kroki
- Przeczytaj o zasobach DSC opartych na klasach, dowiedz się, jak działają, i zastanów się, dlaczego zasób DSC w tym samouczku jest implementowany w ten sposób.
- Zastanów się, jak można ulepszyć ten zasób DSC. Czy istnieją przypadki brzegowe lub funkcje, których nie obsługuje? Zaktualizuj implementację, aby je obsłużyć.