2014-04-20 19 views
5

Ho creato una risorsa DSC per copiare una directory di moduli da una determinata origine. Lo sto testando per una distribuzione più ampia nel mio ambiente. La risorsa fa un ottimo lavoro assicurando che tutti i file ci siano e che corrispondano al contenuto sorgente, finora tutto bene ...Utilizzo del provider di file in DSC: assicurarsi che la destinazione contenga solo file dall'origine

Il problema è questo; Voglio assicurarmi che se ci sono file aggiuntivi nella destinazione o destinazione, una cartella che viene rimossa.

Ecco il mio codice:

Configuration TestRun 
{ 
    Param 
    (
     $ComputerName = 'Localhost' 
    ) 
    Node $ComputerName 
    { 
     File LoadModules 
     { 
      Ensure = 'Present' 
      Type = 'Directory' 
      Force = $true 
      Recurse = $true 
      SourcePath = "C:\git\Modules" 
      DestinationPath = 'C:\users\Jason\Documents\WindowsPowerShell\Modules' 
      Checksum = "SHA-256" 
      MatchSource = $true 
     } 
    } 
} 

ho provato con la creazione di un file nella directory di destinazione dopo aver eseguito la configurazione la prima volta chiamato Deleteme.flag. Finora non ho avuto fortuna nel vederlo effettivamente cancellato.

Ho provato ad aggiungere un requisito fornitore file aggiuntivo di rimuovere la directory prima che si:

File RemoveModules 
    { 
     Ensure = 'absent' 
     Type = 'Directory' 
     Force = $true 
     Recurse = $true 
     DestinationPath = 'C:\users\Jason\Documents\WindowsPowerShell\Modules' 
    } 

Purtroppo, questo non riesce con il seguente errore:

The key properties combination 'C:\users\Jason\Documents\WindowsPowerShell\Modules' is duplicated for keys 'DestinationPath' of resource 'File' in node 'Localhost'. Please make sure key properties are unique for each resource in a node.

In ogni caso, mi piacerebbe fallo con la risorsa file, ma ovviamente, sarebbe facile farlo con il provider di script o qualche altra risorsa personalizzata. Grazie in anticipo per tutto il tuo aiuto!

+0

Proprio come un avviso, non è necessario tutte le proprietà configurate per il provider di file. Li ho aggiunti nel tentativo di far sì che la cosa dannata cancelli il file aggiuntivo. –

+0

Ho lo stesso requisito in realtà. Avete aggiornamenti su questo? Mi piacerebbe anche configurarlo nella risorsa 'File', idealmente. – julealgon

risposta

3

Sono nuovo di DSC. Ho trascorso la parte migliore della domenica pomeriggio guardando le risorse e cercando di capire come risolvere questo problema. Quindi, ti ringrazio di cuore per questo. È stato divertente guardare DSC.

penso, questo potrebbe funzionare:

Configuration TestRun 
{ 
    Param 
    (
     $ComputerName = 'Localhost' 
    ) 
    Node $ComputerName 
    { 
     Script RemoveModules { 
      GetScript = {#needs to return hashtable.} 
      SetScript = { 
       $ump = "$HOME" + "\Documents\WindowsPowerShell\Modules\" 
       Remove-Item -Path $ump -Recurse -Force 
      } 
      TestScript = { 
       $ump = "$HOME" + "\Documents\WindowsPowerShell\Modules\" 
       $mp = "C:\git\Modules" 
       if((Compare-Object $(gci $mp) $(gci $ump))){ 
        $false #at least one difference exists, SetScript will be called. 
       }else{ 
        $true #nothing is different 
       } 

      } 
     } 
     File LoadModules 
     { 
      Ensure = 'Present' 
      Type = 'Directory' 
      Force = $true 
      Recurse = $true 
      SourcePath = "C:\git\Modules" 
      DestinationPath = 'C:\users\Jason\Documents\WindowsPowerShell\Modules' 
      DependsOn = "[Script]RemoveModules" 
      Checksum = "SHA-256" 
      MatchSource = $true 
     } 
    } 
} 

Riferimenti:

+1

questo è quello che ho pensato che avrei dovuto fare. Potrebbe valerne la pena aprire un bug di connessione per quella funzionalità. In definitiva, se sto usando DSC per configurare una directory, dovrei avere la possibilità di assicurarmi che non ci sia nulla di nuovo lì dentro. Lo darò fino alla fine di oggi prima di decidere qualcosa su di esso. –

0

È possibile copiare il file e quindi eliminare quelli inutili:

Configuration DirectoryCopy 
{ 
    param 
    (
     [Parameter(Mandatory)] 
     [ValidateNotNullOrEmpty()] 
     [String] $SourcePath, 

     [Parameter(Mandatory)] 
     [ValidateNotNullOrEmpty()] 
     [String] $DestinationPath 
    ) 

    File CopyFiles 
    { 
     SourcePath  = $SourcePath 
     DestinationPath = $DestinationPath 
     Type   = 'Directory' 
     Recurse   = $true 
     Checksum  = 'SHA-256' # Overwrite modified files 
     Force   = $true 
    } 

    Script DeleteAdditionalDestinationFiles 
    { 
     TestScript = 
     { 
      $currentFiles = Get-ChildItem $using:DestinationPath -Recurse 
      $desiredFiles = Get-ChildItem $using:SourcePath -Recurse 

      $hasAdditionalFiles = [bool](Compare-Object -ReferenceObject $currentFiles -DifferenceObject $desiredFiles) 

      return !$hasAdditionalFiles 
     } 
     SetScript = 
     { 
      $currentFiles = Get-ChildItem $using:DestinationPath -Recurse 
      $desiredFiles = Get-ChildItem $using:SourcePath -Recurse 

      $additionalFiles = Compare-Object -ReferenceObject $currentFiles -DifferenceObject $desiredFiles | Select-Object -ExpandProperty InputObject 

      # First remove the directories and all its descendants. 
      $additionalFiles | Where-Object { ($_.Attributes -band [IO.FileAttributes]::Directory) -eq [IO.FileAttributes]::Directory } | Remove-Item -Recurse -Verbose 

      # Remove the remaining files that were not in any already removed directory. 
      $additionalFiles | Where-Object { Test-Path -Path $_.FullName } | Remove-Item -Verbose 
     } 
     GetScript = { 
      $currentFiles = Get-ChildItem $using:DestinationPath -Recurse 

      return @{ 
       Result  = $currentFiles 
       TestScript = $TestScript 
       SetScript = $SetScript 
       GetScript = $GetScript 
      } 
     } 

     DependsOn = '[File]CopyFiles' 
    } 
} 

In questo modo, se ci sono eventuali cambiamenti albero di directory, non sarà necessario eliminare tutti i file prima di copiare quelli desiderati. Saranno interessati solo i file che devono essere aggiunti, modificati o rimossi.