Configuración de estado deseado (DSC): es más fácil de lo que piensa

Contenidos

Logotipo de Powershell

¿Alguna vez pensó en probar DSC pero sintió que la curva de aprendizaje es demasiado empinada? ¿O tal vez nunca se vio a sí mismo usándolo en producción, por lo tanto no se molestó?

El uso de DSC no tiene por qué ser difícil o complejo, y no necesita una infraestructura gigantesca para que valga la pena. Este post hablará sobre DSC y cómo dar los primeros pasos, e incluye ejemplos de cómo puede comenzar aplicándolo en pequeña escala en producción.

¿Qué es DSC?

La configuración de estado deseado (DSC) es un sistema de administración de la configuración que está incorporado en Windows y le posibilita configurar su sistema como código. Utiliza una configuración escrita en PowerShell que después se convierte a un formato de objeto administrado (MOF).

El archivo MOF es después leído y aplicado por el Servicio de administrador de configuración local en el nodo de destino (computadora).

La configuración que se crea y se ejecuta utiliza diferentes DSC recursos de Módulos DSC. Los módulos DSC son como un módulo PowerShell normal y los recursos son sus funciones. A modo de ejemplo, puede instalarlos usando Install-Module, y se almacenan debajo en el PSModulePath.

¿Para qué puedo utilizar DSC?

La parte más difícil de DSC para muchos es hallar casos de uso. La gente tiende a hablar y escribir sobre DSC solo cuando se trata de orquestar y hacer girar entornos grandes, o probar y QA para diferentes aplicaciones, que es un tema lejano para muchos administradores.

Podemos utilizar DSC para nuestras rutinas diarias y mucho más, sin tener que reestructurar toda nuestra organización. Compilé una lista de algunas áreas que puede automatizar total o parcialmente con DSC:

Ejemplo: lectura y escritura de una configuración DSC

Unas pocas líneas de DSC pueden equivaler a cientos de líneas con PowerShell sin procesar, es por esto que puede ser tan increíblemente poderoso.

Una configuración DSC consta principalmente de 2 partes: la configuración DSC y los datos de configuración.

Los datos de configuración (que se explican más abajo) pueden incluirse externamente, de forma general desde un archivo PSD, o incluirse en el archivo de configuración. El enfoque recomendado y más fácil de mantener es incluir esto desde un archivo separado.

A continuación, se muestra un ejemplo de cómo crear un DSC MOF que descarga e instala un MSI genérico cuando se aplica:

Configuration MyDSCConfiguration {
    # Import DSC modules with resources to use in the configuration
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xPSDesiredStateConfiguration -ModuleVersion "8.10.0.0"

    ##############################################
    # Creates configuration for the server fileserver-1
    ##############################################
    Node "fileserver-1" {
       
        # Create C:ProgramDataSoftwarePackages to download files to on all nodes 
        File SoftwarePackagesDirectory { 
            # Identifier "SoftwarePackagesDirectory" using the DSC resource "File" from DSC module "PSDesiredStateConfiguration"

            DestinationPath = "C:ProgramDataSoftwarePackages"
            Type = "Directory" # Is a directory
            Ensure = "Present" # Ensure that it exists

        }

                # Download MSI
        xRemoteFile DownloadBackupAgent {
            # The xRemoteFile resource from xPSDesiredStateConfiguration DSC module used to download an MSI through HTTP
    
            DependsOn = "[File]SoftwarePackagesDirectory" # Tells DSC to not run this if the previous step hasn't completed successfully
            Uri = "http://web.contoso.com/packages/backupagent.msi" # Where to download the remote file from
            DestinationPath = "C:ProgramDataSoftwarePackagesBackupAgent.msi" # Where to save the downloaded file
    
        }
                
                # Install MSI
        xMsiPackage InstallBackupAgent {
            # The xMsiPackage resource from xPSDesiredStateConfiguration DSC module used to install the MSI we just downloaded
            
            DependsOn = "[xRemoteFile]DownloadBackupAgent" # Depends on previous step being completed before starting
            ProductId = "d29c3fa9-e03e-40e0-a6ed-556c6f05476a" # The MSI package ProductID
            Path = "C:ProgramDataSoftwarePackagesBackupAgent.msi" # Path to the MSI file we just downloaded
            Ensure = "Present" # Ensure that it's present (install the MSI), 'Ensure = "Absent"' would uninstall the MSI

        }

    }
}

Después de ejecutar este código, crea una función de configuración en la sesión actual de PowerShell que se puede utilizar. Crea una subcarpeta con el mismo nombre que la configuración donde guarda los archivos MOF generados:

PS51> MyDSCConfiguration

    Directory: C:TutorialsDSCMyDSCConfiguration


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019-10-28     16:38           3952 fileserver-1.mof

Puede aplicar todas las configuraciones de DSC en la carpeta MyDSCConfiguration a su host ejecutando:

PS51> Start-DscConfiguration -Path .MyDSCConfiguration -Wait

Usando DSC con ConfigurationData

Los datos de configuración contienen datos de configuración para la configuración de DSC. La información incluye un nombre de nodo (nombre de la computadora) y puede contener otros datos como información acerca de cómo instalar un paquete MSI o valores de clave de registro, etc. Esto nos brinda un enfoque dinámico y más versátil de DSC, de modo que pueda ser reutilizado. y fácilmente modificable.

Digamos que tiene estos tres servidores y cada uno necesita una combinación única de paquetes:

  • fileserver-1
  • base de datos-1
    • Necesidades: BackupAgent, BackupAgent-DatabaseAddon
  • servidor de aplicaciones-1
    • Necesidades: BackupAgent, MonitoringAgent

El mejor enfoque es crear un archivo con los datos de configuración que necesita, no solo especificando los nodos (servidores), sino además agregando una lista de paquetes en él:

# Save as ConfigurationData.psd1

@{
        #############################
        # Specify server nodes
    #############################
    AllNodes = @(
        @{
            NodeName = "*"
        }

        # File server node
        @{
            NodeName = "fileserver-1"
            Role = "Fileserver"

            # Selects what packages to install
            Packages = @(
                'BackupAgent'
            )
        },

        # Database server node
        @{
            NodeName = "database-1"
            Role = "Database"

            # Selects what packages to install
            Packages = @(
                'BackupAgent',
                'BackupAgent-DataBaseAddon'
            )
        },

        # Appserver node
        @{
            NodeName = "appserver-1"
            Role = "Appserver"

            # Selects what packages to install
            Packages = @(
                'BackupAgent',
                'MonitoringAgent'
            )
        }
    )

        #############################
    # Establece each package
        #############################
    Packages = @(
        @{
            Name = "BackupAgent"
            ProductId = "3c4e21b5-8de2-408e-84e0-a42b0507b8b1"
            FileName = "BackupAgent.msi"
            Ensure = "Present"    
        },
        @{
            Name = "BackupAgent-DataBaseAddon"
            ProductId = "97f860f6-0a58-4bf3-aef8-abc0f796e9df"
            FileName = "BackupAgent-DataBaseAddon.msi"
            Ensure = "Present"
        },
        @{
            Name = "MonitoringAgent"
            ProductId = "77b29b12-c222-4d85-b812-bbd4136ad0ff"
            FileName = "MonitoringAgent.msi"
            Ensure = "Present"    
        }
    )
}

Ahora puede usar este archivo de datos de configuración para generar dinámicamente configuraciones DSC para sus servidores:

Configuration MyDSCConfiguration {
    # Import DSC modules with resources to use in the configuration
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xPSDesiredStateConfiguration -ModuleVersion "8.10.0.0"

    # Get Packages from the ConfigurationData
    $Packages = $ConfigurationData.Packages

    ##############################################
    # Applies to all nodes
    ##############################################
    Node $AllNodes.NodeName {
        
        # Create C:ProgramDataSoftwarePackages to download files to on all nodes
        File SoftwarePackagesDirectory { 
            DestinationPath = "C:ProgramDataSoftwarePackages"
            Type = "Directory" # Is a directory
            Ensure = "Present" # Ensure that it exists
        }

        # Start dynamically generating DSC configuration by running through all the package names in Node.Packages
        Foreach($PackageName in $Node.Packages){

            $Package = $Packages.Where{$_.Name -eq $PackageName}

            xRemoteFile "PackageDownload-$($Package.Name)" {
                DependsOn = "[File]SoftwarePackagesDirectory"
                DestinationPath = "C:SoftwarePackages$($Package.FileName)"
                Uri = "http://web.contso.com/packages/$($Package.FileName)"
            }

            xMsiPackage "Install$($Package.Name)" {
                DependsOn = "[xRemoteFile]PackageDownload-$($Package.Name)"
                ProductId = $Package.ProductId
                Path = "C:ProgramDataSoftwarePackages$($Package.FileName)"
                Ensure = $Package.Ensure
            }
        }
    }
}

Si ejecuta esto, la función DSC genera un archivo MOF para cada uno de sus servidores que se puede utilizar para instalar los paquetes que definió en el ConfigurationData.psd1 expediente:

PS51> MyDSCConfiguration -ConfigurationData .ConfigurationData.psd1


    Directory: C:TutorialsDSCMyDSCConfiguration


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019-10-28     17:25           3962 fileserver-1.mof
-a----       2019-10-28     17:25           6012 database-1.mof
-a----       2019-10-28     17:25           5894 appserver-1.mof

# Applies the configuration to the servers
PS51> Start-DscConfiguration -Path .MyDSCConfiguration -Wait

Si desea agregar nuevos paquetes, modifique su ConfigurationData.psd1 archivo y ejecute el código anterior una vez más.

Conclusión

Comenzar con DSC puede ser una curva de aprendizaje bastante corta y empinada. Pero la parte más difícil para muchos es hallar casos de uso donde puedan usarlo.

El uso del método anterior que utiliza HTTP (o HTTPS) para buscar paquetes le brinda una forma versátil de repartir software a sus servidores. Y debido a que es HTTPS, además es más fácil de exponer y puede usarlo para administrar software en DMZ y otras redes menos confiables.

Al mismo tiempo, el uso de datos de configuración en lugar de codificar todo en sus configuraciones DSC le brinda un enfoque mucho más fácil de mantener. Inclusive puede generar estos datos de configuración a partir de fuentes externas como CSV, SQL, Sharepoint y todo lo demás que se pueda leer con PowerShell.

Espero que tenga algunas ideas para su entorno para comenzar a facilitar sus tareas diarias con DSC.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.