Según los valores que se especifican para las propiedades del recurso en el script de configuración, Set-TargetResource debe realizar una de las siguientes acciones:
- Crear un nuevo sitio web
- Actualizar un sitio web existente
- Eliminar un sitio web existente
El siguiente ejemplo lo ilustra.
The Set-TargetResource function is used to create, delete or configure a website on the target machine.
function Set-TargetResource
{
[CmdletBinding(SupportsShouldProcess=$true)]
param
(
[ValidateSet(«Present», «Absent»)]
[string]$Ensure = «Present»,
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$Name,
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$PhysicalPath,
[ValidateSet("Started", "Stopped")]
[string]$State = "Started",
[string]$ApplicationPool,
[string[]]$BindingInfo,
[string[]]$Protocol
)
<#
If Ensure is set to "Present" and the website specified in the mandatory input parameters
does not exist, then create it using the specified parameter values
Else, if Ensure is set to "Present" and the website does exist, then update its properties
to match the values provided in the non-mandatory parameter values
Else, if Ensure is set to "Absent" and the website does not exist, then do nothing
Else, if Ensure is set to "Absent" and the website does exist, then delete the website
#>
}
Finalmente, la función Test-TargetResource debe tomar el mismo conjunto de parámetros que Get-TargetResource y Set-TargetResource. En su implementación de Test-TargetResource, verifique el estado de la instancia de recurso que se especifica en los parámetros clave. Si el estado real de la instancia del recurso no coincide con los valores especificados en el conjunto de parámetros, devuelve $false. De lo contrario, devuelve $true.
El siguiente código implementa la función Test-TargetResource.
function Test-TargetResource
{
[CmdletBinding()]
[OutputType([System.Boolean])]
param
(
[ValidateSet(«Present»,»Absent»)]
[System.String]
$Ensure,
[parameter(Mandatory = $true)]
[System.String]
$Name,
[parameter(Mandatory = $true)]
[System.String] $PhysicalPath, [ValidateSet(«Started»,»Stopped»)] [System.String] $State, [System.String[]] $Protocol, [System.String[]] $BindingData, [System.String] $ApplicationPool ) # Get the current state $currentState = Get-TargetResource -Ensure $Ensure -Name $Name -PhysicalPath $PhysicalPath -State $State -ApplicationPool $ApplicationPool -BindingInfo $BindingInfo -Protocol $Protocol # Write-Verbose «Use this cmdlet to deliver information about command processing.» # Write-Debug «Use this cmdlet to write debug information while troubleshooting.» # Include logic to $result = [System.Boolean] # Add logic to test whether the website is present and its status matches the supplied # parameter values. If it does, return true. If it does not, return false. $result
}
Para facilitar la depuración, use el cmdlet Write-Verbose en su implementación de las tres funciones anteriores. Este cmdlet escribe texto en el flujo de mensajes detallados. De forma predeterminada, el flujo de mensajes detallados no se muestra, pero puede mostrarlo cambiando el valor de la variable $VerbosePreference o usando el parámetro Verbose en los cmdlets de DSC = new.
Creando el manifiesto del módulo:
Finalmente, use el cmdlet New-ModuleManifest para definir un archivo .psd1 para su módulo de recursos personalizado. Cuando invoque este cmdlet, haga referencia al archivo del módulo de script (.psm1) descrito en la sección anterior. Incluya Get-TargetResource, Set-TargetResource y Test-TargetResource en la lista de funciones para exportar. El siguiente es un archivo de manifiesto de ejemplo.
Module manifest for module ‘Demo.IIS.Website’
#
Generated on: 1/10/2013
#
@{
Script module or binary module file associated with this manifest.
RootModule = »
Version number of this module.
ModuleVersion = ‘1.0’
ID used to uniquely identify this module
GUID = ‘6AB5ED33-E923-41d8-A3A4-5ADDA2B301DE’
Author of this module
Author = ‘Contoso’
Company or vendor of this module
CompanyName = ‘Contoso’
Copyright statement for this module
Copyright = ‘Contoso. All rights reserved.’
Description of the functionality provided by this module
Description = ‘This Module is used to support the creation and configuration of IIS Websites through Get, Set and Test API on the DSC managed nodes.’
Minimum version of the Windows PowerShell engine required by this module
PowerShellVersion = ‘4.0’
Minimum version of the common language runtime (CLR) required by this module
CLRVersion = ‘4.0’
Modules that must be imported into the global environment prior to importing this module
RequiredModules = @(«WebAdministration»)
Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
NestedModules = @(«Demo_IISWebsite.psm1»)
Functions to export from this module
FunctionsToExport = @(«Get-TargetResource», «Set-TargetResource», «Test-TargetResource»)
Cmdlets to export from this module
CmdletsToExport = ‘*’
HelpInfo URI of this module
HelpInfoURI = »
}
Compatibilidad con PsDscRunAsCredential:
PsDscRunAsCredential es compatible con PowerShell 5.0 y versiones posteriores.
La propiedad PsDscRunAsCredential se puede usar en el bloque de recursos de configuraciones de DSC para especificar que el recurso debe ejecutarse con un conjunto específico de credenciales. Para obtener más información, consulte Ejecución de DSC con credenciales de usuario.
Para acceder al contexto del usuario desde un recurso personalizado, puede usar la variable automática $PsDscContext.
Por ejemplo, el siguiente código escribiría el contexto de usuario bajo el cual se ejecuta el recurso en el flujo de salida detallado:
if (PsDscContext.RunAsUser) {
Write-Verbose «User: $PsDscContext.RunAsUser»;
}
Reinicio del nodo:
Si las acciones realizadas en su función Set-TargetResource requieren un reinicio, puede usar un indicador global para indicarle al LCM que reinicie Node. Este reinicio ocurre directamente después de que se complete la función Set-TargetResource.
Dentro de su función Set-TargetResource, agregue la siguiente línea de código.
Include this line if the resource requires a system reboot.
$global:DSCMachineStatus = 1
Para que el LCM reinicie el nodo, el indicador RebootNodeIfNeeded debe establecerse en $true. La configuración ActionAfterReboot también debe establecerse en ContinueConfiguration, que es la predeterminada. Para obtener más información sobre la configuración del LCM, consulte Configuración del Administrador de configuración local o Configuración del Administrador de configuración local (v4).