gpt4 book ai didi

PowerShell DSC - 由于节点名称为空,因此跳过节点处理

转载 作者:行者123 更新时间:2023-12-03 12:20:27 25 4
gpt4 key购买 nike

个计算机节点符合筛选条件时,我在将筛选器应用于 DSC 配置 block 中的节点时遇到了问题。例如:

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

但这感觉有点像 hack,并且让我的配置 block 充满了很多麻烦。当有零个节点与过滤器匹配时,是否有更简洁的方法来避免此错误?

(对于上下文,我正在构建多个开发、测试和 uat 环境,我们只在每个环境中部署部分服务器角色集,所以我不想更改节点过滤器表达式的逻辑或删除来自配置 block 的节点,因为它们在生产中是必需的,我想在任何地方都使用相同的脚本)。

最佳答案

最后,我决定在具有过滤器的节点周围添加一个检查。当有很多不同的过滤器时,它有点笨拙并且非常重复,但至少它使解决方法接近问题所在,如果你眯着眼睛看,它看起来与原来的不同代码。

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

}

关于PowerShell DSC - 由于节点名称为空,因此跳过节点处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24555485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com