Compartir a través de


Recurso de DSC Script

Se aplica a: Windows PowerShell 4.0, Windows PowerShell 5.x

El recurso Script de la configuración de estado deseado (DSC) de Windows PowerShell ofrece un mecanismo para ejecutar bloques de script de Windows PowerShell en nodos de destino. El recurso Script usa las propiedades GetScriptSetScript y TestScript que contienen bloques de scripts que se definen para realizar las operaciones de estado DSC correspondientes.

Sugerencia

Siempre que sea posible, se recomienda usar un recurso de DSC definido en lugar de este. El Script recurso tiene inconvenientes que dificultan la prueba, el mantenimiento y la predicción.

A diferencia de otros recursos de DSC, cada propiedad de un Script recurso es una propiedad clave y el método Get de este recurso solo puede devolver una sola cadena para el estado actual. No hay garantías de que este recurso se implemente de forma idempotente o que funcionará según lo previsto en cualquier sistema porque usa código personalizado. No se puede probar sin invocarse en un sistema de destino.

Antes de usar el Script recurso, considere si puede crear un recurso en su lugar. El uso de recursos de DSC bien definidos hace que las configuraciones se puedan leer y mantener.

Nota

Esta documentación de este recurso de DSC cubre la versión que se incluye con PowerShell antes de la versión 7.2. El módulo PSDscResources contiene recursos de DSC nuevos y actualizados compatibles oficialmente con Microsoft. El módulo PSDscResources está disponible en la Galería de PowerShell.

Para obtener más información y documentación actualizada, consulte la documentación de referencia de PSDscResources.

Sintaxis

Script [string] #ResourceName
{
    GetScript = [string]
    SetScript = [string]
    TestScript = [string]
    [ Credential = [PSCredential] ]
    [ DependsOn = [string[]] ]
    [ PsDscRunAsCredential = [PSCredential] ]
}

Nota:

GetScriptTestScriptLos bloques , y SetScript se almacenan como cadenas.

Propiedades

Propiedad Descripción
GetScript Un bloque de scripts que devuelve el estado actual del nodo.
SetScript Bloque de script que DSC usa para aplicar el cumplimiento cuando el nodo no está en el estado deseado.
TestScript Un bloque de scripts que determina si el nodo está en el estado deseado.
Credential: Indica las credenciales que se usan para ejecutar este script, si se necesitan credenciales.

Propiedades comunes

Propiedad Descripción
DependsOn Indica que la configuración de otro recurso debe ejecutarse antes de que se configure este recurso.
PsDscRunAsCredential Establece la credencial con la que se ejecutará todo el recurso.

Nota

Se ha agregado la propiedad común PsDscRunAsCredential en WMF 5.0 para permitir la ejecución de cualquier recurso de DSC en el contexto de otras credenciales. Para obtener más información, vea Uso de las credenciales con recursos de DSC.

Información adicional

GetScript

DSC no usa la salida del GetScript cmdlet Get-DscConfiguration que se ejecuta GetScript para recuperar el estado actual de un nodo. No se requiere un valor devuelto de GetScript Si especifica un valor devuelto, debe ser una tabla hash que contenga una clave result cuyo valor sea String.

TestScript

DSC se ejecuta TestScript para determinar si SetScript se debe ejecutar. Si TestScript devuelve $false, DSC ejecuta SetScript para devolver al nodo al estado deseado. Debe devolver un valor booleano. Un resultado de $true indica que el nodo es compatible y SetScript no debe ejecutarse.

El cmdlet Test-DscConfiguration se ejecuta TestScript para recuperar el cumplimiento de los nodos con los Script recursos. Sin embargo, en este caso, SetScript no se ejecuta, independientemente de lo que TestScript devuelva el bloque.

Nota

Toda la salida de su TestScript es parte de su valor devuelto. PowerShell interpreta la salida sin comprimir como distinto de cero, lo que significa que TestScript devuelve $true independientemente del estado del nodo. Esto da como resultado resultados impredecibles, falsos positivos y dificulta la resolución de problemas.

SetScript

SetScript modifica el nodo para aplicar el estado deseado. DSC llama a SetScript si el bloque de TestScript script devuelve $false. El SetScript no debe tener ningún valor devuelto.

Ejemplos

Ejemplo 1: Escribir texto de ejemplo con un recurso de Script

En este ejemplo se comprueba la existencia de C:\TempFolder\TestFile.txt en cada nodo. Si no existe, la crea mediante SetScript. GetScript devuelve el contenido del archivo y su valor devuelto no se usa.

Configuration ScriptTest
{
    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

    Node localhost
    {
        Script ScriptExample
        {
            SetScript = {
                $sw = New-Object System.IO.StreamWriter("C:\TempFolder\TestFile.txt")
                $sw.WriteLine("Some sample string")
                $sw.Close()
            }
            TestScript = { Test-Path "C:\TempFolder\TestFile.txt" }
            GetScript = { @{ Result = (Get-Content C:\TempFolder\TestFile.txt) } }
        }
    }
}

Ejemplo 2: Comparar la información de versión con un recurso de Script

En este ejemplo se recupera la información de la versión compatible de un archivo de texto en el equipo de creación y la almacena en la variable $version. Al generar el archivo MOF del nodo, DSC reemplaza las variables de $using:version en cada bloque de scripts con el valor de la variable $version. Durante la ejecución, la versión compatible se almacena en un archivo de texto en cada nodo y se compara y actualiza en ejecuciones posteriores.

$version = Get-Content 'version.txt'

Configuration ScriptTest
{
    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

    Node localhost
    {
        Script UpdateConfigurationVersion
        {
            GetScript = {
                $currentVersion = Get-Content (Join-Path -Path $env:SYSTEMDRIVE -ChildPath 'version.txt')
                return @{ 'Result' = "$currentVersion" }
            }
            TestScript = {
                # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript.
                $state = [scriptblock]::Create($GetScript).Invoke()

                if( $state.Result -eq $using:version )
                {
                    Write-Verbose -Message ('{0} -eq {1}' -f $state.Result,$using:version)
                    return $true
                }
                Write-Verbose -Message ('Version up-to-date: {0}' -f $using:version)
                return $false
            }
            SetScript = {
                $using:version | Set-Content -Path (Join-Path -Path $env:SYSTEMDRIVE -ChildPath 'version.txt')
            }
        }
    }
}

Ejemplo 3: Uso de parámetros en un recurso Script

En este ejemplo se accede a los parámetros desde el recurso Script mediante el uso del ámbito using. Se puede acceder a ConfigurationData de una manera similar. Al igual que en el ejemplo 2, la implementación espera que una versión se almacene dentro de un archivo local en el nodo de destino. Tanto la ruta de acceso local como la versión son configurables, desacoplando código de los datos de configuración.

Configuration ScriptTest
{
    param
    (
        [Version]
        $Version,

        [string]
        $FilePath
    )

    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

    Node localhost
    {
        Script UpdateConfigurationVersion
        {
            GetScript = {
                $currentVersion = Get-Content -Path $using:FilePath
                return @{ 'Result' = "$currentVersion" }
            }
            TestScript = {
                # Create and invoke a scriptblock using the $GetScript automatic variable,
                # which contains a string representation of the GetScript.
                $state = [scriptblock]::Create($GetScript).Invoke()

                if( $state['Result'] -eq $using:Version )
                {
                    Write-Verbose -Message ('{0} -eq {1}' -f $state['Result'],$using:version)
                    return $true
                }

                Write-Verbose -Message ('Version up-to-date: {0}' -f $using:version)
                return $false
            }
            SetScript = {
                Set-Content -Path $using:FilePath -Value $using:Version
            }
        }
    }
}

El archivo MOF resultante incluye las variables y los valores de estas a los que se accede mediante el ámbito using. Se insertan en cada bloque de scripts, que usa las variables. Los scripts test y Set se quitan para mayor brevedad:

instance of MSFT_ScriptResource as $MSFT_ScriptResource1ref
{
 GetScript = "$FilePath ='C:\\Config.ini'\n\n $currentVersion = Get-Content -Path $FilePath\n return @{ 'Result' = \"$currentVersion\" }\n";
 TestScript = ...;
 SetScript = ...;
};

Limitaciones conocidas

  • Las credenciales que se pasan dentro de un recurso de script no siempre son confiables cuando se usa un modelo de servidor de extracción o inserción. Use un recurso completo en lugar de usar un recurso de script en este caso.