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 GetScript
SetScript
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:
GetScript
TestScript
Los 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.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de