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 GetScript
SetScript
y 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
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.