2014-04-20 14 views
5

içerdiğinden emin olun Bir Modüller dizinini belirli bir kaynaktan kopyalamak için bir DSC kaynağı oluşturdum. Çevremdeki daha geniş bir dağıtım için test ediyorum. Kaynak, tüm dosyaların var olduğundan ve kaynak içeriğe uyduklarından çok iyi bir iş çıkarır, o kadar iyi ki ...DSC'deki Dosya sağlayıcıyı kullanma - Hedefin yalnızca Kaynak

Sorun şu; Hedefte veya hedefte herhangi bir ek dosya varsa, bunların kaldırılacağı bir klasör varsa emin olmak istiyorum.

İşte benim kod:

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 
     } 
    } 
} 

Ben CONFIG Deleteme.flag denilen ilk kez çalıştırdıktan sonra hedef dizinde bir dosya oluşturarak test ettik. Şimdiye kadar, aslında silinmesi için hiç şansım olmadı.

Ben dolmadan dizini kaldırmak için ek bir dosya sağlayıcı şart ilave çalıştı

:

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

Maalesef bu aşağıdaki hata nedeniyle başarısız: Neyse

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.

, İsterdim Dosya kaynağı ile yapın, ancak açıkçası, senaryo sağlayıcısı veya başka bir özel kaynak ile bunu yapmak kolay olurdu. Tüm yardımlarınız için şimdiden teşekkür ederiz!

+0

Sadece bir uyarı kadar, Dosya sağlayıcı için yapılandırılmış tüm özelliklere ihtiyacınız yoktur. Onları fazladan bir şeyi silmek için bir girişimde bulundum. –

+0

Aynı gereksinime gerçekten sahibim. Bu konuda herhangi bir güncellemeniz var mı? Bunu da 'Dosya' kaynağında, ideal olarak yapılandırmak isterim. – julealgon

cevap

3

DSC'de yeniyim. Pazar öğleden sonra en iyi kısmını kaynaklara bakarak geçirdim ve bunu nasıl çözeceğimi bulmaya çalıştım. Bu yüzden içtenlikle teşekkür ederim. DSC'ye bakmak eğlenceliydi.

Ben bu işe yarayabilir, düşünüyorum:

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 
     } 
    } 
} 

Referanslar:

+1

bunu yapmam gerektiğini düşündüğüm şeydi. Bu işlevsellik için bir bağlantı hatası açmak için buna değer olabilir. Son olarak, bir dizini yapılandırmak için DSC kullanıyorum, orada yeni bir şey olmadığından emin olma seçeneğine sahip olmalıyım. Bunun üzerine bir şey karar vermeden önce bugün sonuna kadar vereceğim. –

0

Önce dosyaları kopyalamak ve sonra gereksiz olanları silebilirsiniz:

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' 
    } 
} 

Bu şekilde, herhangi bir dizin ağacı değişiklik varsa, istenilen olanları kopyalamadan önce tüm dosyaları silmek için gerekli olmayacaktır. Yalnızca eklenmesi, değiştirilmesi veya kaldırılması gereken dosyalar etkilenecektir.

İlgili konular