Környezeti konfigurációs adatok tárolása különálló fájlban

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.



Word To HTML Converter