我正在尝试使用Azure自动化DSC配置Azure VM。我要设置的资源之一是客户端工作站上的DNS,xNetworking
模块中的xDnsServerAddress
。
问题是它需要一个接口别名,并且Azure VM上的接口别名更改因部署而异(主要是VM似乎得到Ethernet
或Ethernet 2
)。
我可以使用以下cmdlet表达式在本地查询接口名称:
$Interface=Get-NetAdapter|Where Name -Like "Ethernet*"|Select-Object -First 1
$InterfaceAlias=$($Interface.Name)
然而,我不知道如何在DSC中使用它。
我的DSC配置如下(仅相关部分):
Configuration MyDscConfig
{
Import-DscResource -ModuleName xNetworking
# place-1
Node $AllNodes.where{$_.Role -eq "Workstation"}.NodeName
{
# place-2
xDnsServerAddress DnsServerAddressSetToDc1
{
Address = '10.0.0.4'
InterfaceAlias = $InterfaceAlias
AddressFamily = 'IPv4'
Validate = $true
}
}
}
问题是,如果我将cmdlet表达式放在place-1
或place-2
中,编译作业将失败并显示:
运行命令已停止,因为首选项变量“ErrorActionPreference”或common参数设置为Stop:术语“Get-NetAdapter”未被识别为cmdlet,函数,脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。
我认为它试图在拉取服务器上执行Get-NetAdapter
,但我可能会错误解释错误消息。
如何在目标计算机上注册cmdlet表达式的结果,并将其注册到$InterfaceAlias
资源的xDnsServerAddress
变量中?
答案 0 :(得分:1)
似乎DSC节点配置(它是一个MOF文件)必须具有编译时设置的所有值。
作为一种解决方法,我决定使用PowerShell脚本资源而不是xDnsServerAddress
(下面的一些值是硬编码的,以匹配问题中的示例):
Script DnsServerAddressSetToDc1
{
GetScript = {
Return @{
Result = [string](get-DnsClientServerAddress -InterfaceAlias (Get-NetAdapter|Where Name -Like "Ethernet*"|Select-Object -First 1).Name -AddressFamily IPv4).ServerAddresses
}
}
TestScript = {
if (([string](get-DnsClientServerAddress -InterfaceAlias (Get-NetAdapter|Where Name -Like "Ethernet*"|Select-Object -First 1).Name -AddressFamily IPv4).ServerAddresses) -eq '10.0.0.4') {
Write-Verbose "DNS server set"
Return $true
} Else {
Write-Verbose "DNS Server not set"
Return $false
}
}
SetScript = {
Set-DnsClientServerAddress `
-InterfaceAlias (Get-NetAdapter|Where Name -Like "Ethernet*"|Select-Object -First 1).Name `
-ServerAddresses 10.0.0.4 `
-Validate `
-ErrorAction Stop
}
}
答案 1 :(得分:1)
您当前无法执行查询以保留操作结果并使用它来声明下一个状态(请参阅答案末尾的注释。)
您可以使用documented workaround/solution from xNetworking来解决此限制,UserVoice
suggestion会找到一个名为Ethernet1
的活动以太网适配器,如果没有,它将找到第一个活动的以太网适配器,并确保它名为{ {1}}。然后,使用资源在Ethernet1
上设置DSC服务器地址。
这是研究性的,名称和参数可能会有所变化。 DSC团队正在研究一种更好的方法。
Ethernet1
注意:
评论中有一个问题。问题的摘要是查询是否将声明性范式转变为命令式范式。
答案:
我不相信查询会把它变成一种命令式的范例,但是你 目前无法执行查询保持操作的结果和 用它来宣告下一个州。
目前这迫使我们进一步远离 声明我想要的问题。 我的个人观点就是我们 应该使用我们拥有的东西并编写查询和设置的资源 已知国家。然后,通过其余部分使用已知状态 配置(根据您的术语形成声明性相对的形式)。