Я столкнулся с проблемой применения фильтров к узлам в блоке конфигурации DSC, когда нулевые компьютерные узлы соответствуют критериям фильтра. Например:
configuration MyApp {
node $AllNodes.Where{ $_.Role -Match "role1|role2" }.NodeName {
File ApplicationFolder {
Type = "Directory"
DestinationPath = $Node.ApplicationFolder
Ensure = "Present"
}
}
}
$configData = @{
AllNodes = @(
@{
NodeName = "*"
}
@{
NodeName = $env:COMPUTERNAME
Role = "role3"
ApplicationFolder = "E:\MyApp"
}
)
}
$mof = MyApp -ConfigurationData $configData;
Start-DscConfiguration MyApp -ComputerName $env:COMPUTERNAME -Wait -Verbose;
Запуск этого скрипта дает следующую ошибку:
PSDesiredStateConfiguration\node : Node processing is skipped since the node name is empty.
At E:\test\test.ps1:3 char:5
+ node $AllNodes.Where{ $_.Role -Match "role1|role2" }.NodeName {
+ ~~~~
+ CategoryInfo : InvalidOperation: (:) [Write-Error], InvalidOperationException
+ FullyQualifiedErrorId : NodeNameIsRequired,PSDesiredStateConfiguration\node
Errors occurred while processing configuration 'MyApp'.
At
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PSDesiredStateConfiguration.psm1:2088 char:5
+ throw $errorRecord
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (MyApp:String) [], InvalidOperationException
+ FullyQualifiedErrorId : FailToProcessConfiguration
Лучшее решение, которое я придумал до сих пор, - это обернуть каждый узел в "if {}", который проверяет нулевые значения - например.
configuration MyApp {
$nodeNames = $AllNodes.Where{ $_.Role -Match "role1|role2" }.NodeName;
if( $nodeNames -ne $null )
{
node $nodeNames {
File ApplicationFolder {
Type = "Directory"
DestinationPath = $Node.ApplicationFolder
Ensure = "Present"
}
}
}
}
но это похоже на взлом и заполняет мои блоки конфигурации большим количеством хлама. Есть ли более чистый способ избежать этой ошибки, когда нет узлов, соответствующих фильтру?
(Для контекста я создаю несколько сред разработки, тестирования и uat, где мы только развертываем частичные наборы ролей сервера в каждой среде, поэтому я не хочу менять логику выражения фильтра Node или удалять узлы из Блок конфигурации, потому что они необходимы в производстве, и я хочу использовать одни и те же сценарии везде).