Использование поставщика файлов в DSC - убедитесь, что место назначения содержит только файлы из источника

Я создал ресурс DSC для копирования каталога модулей из определенного источника. Я тестирую его для более широкого развертывания в своей среде. Ресурс отлично справляется с задачей обеспечения наличия всех файлов и их соответствия исходному контенту, пока все хорошо ...

Проблема вот в чем; Я хочу убедиться, что если в целевом или целевом объекте есть какие-либо дополнительные файлы, они будут удалены из папки.

Вот мой код:

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

Я тестировал, создав файл в каталоге назначения после первого запуска конфигурации с именем Deleteme.flag. Пока мне не удалось его удалить.

Я попытался добавить дополнительное требование к поставщику файлов для удаления каталога перед его запуском:

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

К сожалению, это не удается из-за следующей ошибки:

Комбинация ключевых свойств «C: \ users \ Jason \ Documents \ WindowsPowerShell \ Modules» дублируется для ключей «DestinationPath» ресурса «File» в узле «Localhost». Убедитесь, что ключевые свойства уникальны для каждого ресурса в узле.

В любом случае, я бы хотел сделать это с файловым ресурсом, но, очевидно, это было бы легко сделать с помощью поставщика сценариев или какого-либо другого настраиваемого ресурса. Заранее спасибо за вашу помощь!


person Jason Morgan    schedule 20.04.2014    source источник
comment
Напоминаем, что вам не нужно настраивать все эти свойства для поставщика файлов. Я добавлял их, пытаясь заставить эту чертову штуку удалить лишний файл.   -  person Jason Morgan    schedule 20.04.2014
comment
У меня действительно такое же требование. У вас есть новости по этому поводу? Я также хотел бы настроить это на самом ресурсе File, в идеале.   -  person julealgon    schedule 31.10.2014


Ответы (2)


Я новичок в DSC. Большую часть воскресного дня провел, изучая ресурсы и пытаясь понять, как решить эту проблему. Итак, я искренне благодарю вас за это. Было весело смотреть на DSC.

Думаю, это могло сработать:

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

Ссылки:

person sqlchow    schedule 20.04.2014
comment
это то, что я решил, что мне нужно сделать. Возможно, стоит открыть ошибку подключения для этой функции. В конечном итоге, если я использую DSC для настройки каталога, у меня должна быть возможность убедиться, что в нем нет ничего нового. Я подам его до конца сегодняшнего дня, прежде чем что-то по нему решать. - person Jason Morgan; 21.04.2014

Вы можете сначала скопировать файлы, а затем удалить ненужные:

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

Таким образом, если произойдет какое-либо изменение дерева каталогов, не нужно будет удалять все файлы перед копированием нужных. Это затронет только файлы, которые необходимо добавить, изменить или удалить.

person Rosberg Linhares    schedule 06.08.2017