Az előző fejezetben láthattuk, hogy a konfigurációknak paramétert is adhatunk, de a paraméterek általában ad-hoc felhasználáskor jönnek jól, most ilyen értékkel szereném meghívni a „függvényt”, a következő alkalommal meg másmilyenekkel. A DSC konfigurációkhoz természetüknél fogva jobb lenne fixen tárolni valahol azt, hogy mely gépekre milyen paraméterekkel szeretnénk érvényesíteni a konfigurációnkat. Annál is inkább, mert lehet, hogy több paraméter is változik gépről gépre. Az előző példa esetében például lehet, hogy a registry kulcs (Key) minden gépnél a gép tulajdonosának nevét kellene tartalmaznia.
A paraméterek, paraméterértékek együttállását érdemes egy külön adatblokkban tárolni, és erre lehetőséget is biztosít a DSC. Nézzük hogyan:
$ConfigurationData = @{
AllNodes = @(
@{
NodeName = "STLeno"
Owner = "Soós Tibor"
},
@{
NodeName = "XYDell"
Owner = "Vegetári János"
},
@{
NodeName = "ABHP"
Owner = "Beléd Márton"
},
@{
NodeName = "QWAcer"
Owner = "Fájdalom Csilla"
}
)
}
Létrehoztam egy $ConfigurationData hashtáblát, amiben van egy AllNodes kulcs, ami egy tömböt tartalmaz, melynek elemei szintén hashtáblák. Ezeknek a belső hashtábláknak van egy NodeName kulcsuk és emellett a példám miatt egy Owner kulcsuk is.
A kötelező elnevezéseket bekeretezéssel és más színnel jelöltem, azaz AllNodes-nak és NodeName-nek közelező lenni. A egésznek a $ConfigurationData neve és az belső hashtáblák további kulcsai opcionálisak. Ahhoz, hogy a $ConfigurationData adatblokkot felhasználhassuk, a konfigurációt is erre elő kell készíteni:
configuration RegLegyenOtt {
Import-DscResource -ModuleName PSDesiredStateConfiguration
Node $AllNodes.NodeName {
Registry Reg {
Key = "HKLM:\SOFTWARE\$($Node.Owner)"
ValueName = "AzEnErtekem"
Ensure = 'Present'
ValueData = "DSC-vel létrehozva: $($Node.NodeName)"
ValueType = "String"
}
}
}
A Node kulcszónál itt már nem egy konkrét név szerepel, hanem az konfigurációs adatblokk $AllNodes tömbjének a neve és az annak elemeinek a NodeName „tulajdonsága”, jobban mondva kulcsa. Emlékeztetőül, PowerShell 3.0 vagy afelett, ha egy tömbben objektumokat tárolunk, akkor ezeknek az elemeknek a tulajdonságait a követlező tömör formában, ciklus nélkül is lekérdezhetjük:
PS C:\> $tömb = dir C:\PowerShell\dsc?.ps1
PS C:\> $tömb.lastwritetime
2015. október 31. 13:34:34
2015. október 31. 23:09:20
2015. december 5. 17:55:37
A fenti példában egy három fájlobjektumot tartalmazó tömb esetében a lastwritetime tulajdonságot lekérdezve nem magának a tömbnek a lastwritetime tulajdonságát kapjuk meg (mert annak ilyen nincs is), hanem az elemeiét.
Na, hát a konfigurációnál is ez fog történni, a Node kulcsszó mellett az $AllNodes.NodeName valójában a konfigurációs adatblokkban szereplő nevek tömbjét jelenti. A Node blokk törzsén belül képződik egy automatikus változó $Node néven, hasonlóan, ahogy például a foreach cikluson belül a $foreach változó, vagy a switch kifejezésen belül a $switch vátozó. Ez a $Node változó fogja rendre felvenni az $AllNodes egyes elemeit, és így ezen keresztül hivatkozhatunk az adatblokkban tárolt különböző értékekre, mint például $Node.Owner vagy $Node.NodeName.
Hogyan tudjuk a konfigurációs adatokat összehozni a konfigurációval? Nagyon egyszerűen, ha észrevesszük, hogy a konfigurációknak van egy -ConfigurationData paramétere is:
PS C:\> RegLegyenOtt -ConfigurationData $ConfigurationData -OutputPath C:\Power
Shell\DSC
Directory: C:\PowerShell\DSC
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2016.01.11. 22:05 2060 STLeno.mof
-a---- 2016.01.11. 22:05 2068 XYDell.mof
-a---- 2016.01.11. 22:05 2056 ABHP.mof
-a---- 2016.01.11. 22:05 2070 QWAcer.mof
A kimeneten látszik, hogy tényleg az AllNodes összes elemének megfelelő MOF fájl létrejött. Nézzünk bele az egyikbe, hogy meggyőződhessünk, hogy a tulajdonosnak megfelelő registry kulcs szerepel-e benne:
PS C:\> Get-Content C:\PowerShell\DSC\ABHP.mof | ?{$_.trim()}
/*
@TargetNode='ABHP'
@GeneratedBy=Tibi
@GenerationDate=01/11/2016 22:05:35
@GenerationHost=STLENO
*/
instance of MSFT_RegistryResource as $MSFT_RegistryResource1ref
{
ResourceID = "[Registry]Reg";
ValueName = "AzEnErtekem";
Key =
"HKLM:\\SOFTWARE\\Beléd Márton";
Ensure = "Present";
SourceInfo = "::4::9::Registry";
ValueType = "String";
ModuleName = "PSDesiredStateConfiguration";
ValueData = {
"DSC-vel létrehozva: ABHP"
};
ModuleVersion = "1.0";
ConfigurationName = "RegLegyenOtt";
};
instance of OMI_ConfigurationDocument
{
Version="2.0.0";
MinimumCompatibleVersion = "1.0.0";
CompatibleVersionAdditionalProperties= {"Omi_BaseResource:ConfigurationName"};
Author="Tibi";
GenerationDate="01/11/2016 22:05:35";
GenerationHost="STLENO";
Name="RegLegyenOtt";
};
Igen, a Key-ben Beléd Márton szerepel.
A fejezet elején azzal kezdtem, hogy jó lenne a környezetfüggő konfigurációs adatokat külön tárolni a konfigurációtól. Ezt nagyon egyszerűen megtehetjük, vegyük a $ConfigurationData változó tartalmát, ami ugye egy hashtábla, és mentsük el egy PSD1 kiterjesztésű fájlba.
Megjegyzés
PSD1 fájlokat már láttunk a modulok kapcsán. Ott is egy hashtábla volt a fájlban. Amikor tehát egy PSD1 fájlt futtatunk, akkor valójában egy olyan speciális szkriptet futtatunk, ami egy hashtáblát definiál.
Az esetünkben tehát ez lesz a fájlban, én most az egyszerűség kedvéért ConfigurationData.psd1-nek hívom:
@{
AllNodes = @(
@{
NodeName = "STLeno"
Owner = "Soós Tibor"
},
@{
NodeName = "XYDell"
Owner = "Vegetári János"
},
@{
NodeName = "ABHP"
Owner = "Beléd Márton"
},
@{
NodeName = "QWAcer"
Owner = "Fájdalom Csilla"
}
)
}
Majd egyszerűen a változó helyett a PSD1 fájl elérési útját adjuk mega -ConfigurationData paraméternek:
PS C:\> RegLegyenOtt -ConfigurationData C:\PowerShell\ConfigurationData.psd1 -O
utputPath C:\PowerShell\DSC
Directory: C:\PowerShell\DSC
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2016.01.11. 22:17 2060 STLeno.mof
-a---- 2016.01.11. 22:17 2068 XYDell.mof
-a---- 2016.01.11. 22:17 2056 ABHP.mof
-a---- 2016.01.11. 22:17 2070 QWAcer.mof
Ugyanazok a MOF fájlok most is létrejöttek.