Compartir a través de


Recurso de script de DSC

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

El recurso Script de Windows PowerShell Desired State Configuration (DSC) proporciona un mecanismo para ejecutar bloques de script de Windows PowerShell en nodos de destino. El recurso Script usa GetScriptSetScripty TestScript propiedades que contienen bloques de script que define para realizar las operaciones de estado de DSC correspondientes.

Propina

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

A diferencia de otros recursos de DSC, cada propiedad de un recurso de Script es una propiedad clave y el método Get para este recurso solo puede devolver una sola cadena para el estado actual. No hay ninguna garantía de que este recurso se implemente de forma idempotente o que funcione 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 recurso de Script, 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 trata la versión que se incluye con PowerShell antes de la versión 7.2. El módulo psDscResources de contiene recursos de DSC nuevos y actualizados que microsoft admite oficialmente. El módulo de 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

GetScript TestScript, y los bloques de SetScript se almacenan como cadenas.

Propiedades

Propiedad Descripción
GetScript Bloque de script 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 Bloque de script que determina si el nodo está en estado deseado.
Credencial Indica las credenciales que se van a usar para ejecutar este script, si se requieren credenciales.

Propiedades comunes

Propiedad Descripción
DependsOn Indica que la configuración de otro recurso debe ejecutarse antes de configurar este recurso.
PsDscRunAsCredential Establece la credencial para ejecutar todo el recurso como.

Nota

El psDscRunAsCredential propiedad común se agregó 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, consulte Usar credenciales con recursos de DSC.

Información adicional

GetScript

DSC no usa la salida de GetScript El cmdlet Get-DscConfiguration 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 de Result cuyo valor sea String.

TestScript

DSC ejecuta TestScript para determinar si se debe ejecutar SetScript. Si TestScript devuelve $false, DSC ejecuta SetScript para devolver el 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 ejecuta TestScript para recuperar el cumplimiento de los nodos con los recursos de Script. Sin embargo, en este caso, SetScript no se ejecuta, independientemente de lo que TestScript bloque devuelva.

Nota

Toda la salida de la TestScript forma parte de su valor devuelto. PowerShell interpreta la salida sin comprimir como distinto de cero, lo que significa que el TestScript devuelve $true independientemente del estado del nodo. Esto da como resultado resultados imprevisibles, falsos positivos y provoca dificultades durante la solución de problemas.

SetScript

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

Ejemplos

Ejemplo 1: Escritura de texto de ejemplo mediante un recurso script

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

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: Comparación de la información de versión mediante un recurso de script

En este ejemplo se recupera la información de 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 script por el valor de la variable $version. Durante la ejecución, la versión de compatible se almacena en un archivo de texto en cada nodo y se compara y actualiza en las 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 de using. configurationData se puede acceder de forma 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 sus valores a los que se accede a través del ámbito de 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.