如何在DSC的变量中注册PowerShell表达式的结果?

时间:2016-12-01 07:22:00

标签: powershell azure dsc

我正在尝试使用Azure自动化DSC配置Azure VM。我要设置的资源之一是客户端工作站上的DNS,xNetworking模块中的xDnsServerAddress

问题是它需要一个接口别名,并且Azure VM上的接口别名更改因部署而异(主要是VM似乎得到EthernetEthernet 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-1place-2中,编译作业将失败并显示:

  

运行命令已停止,因为首选项变量“ErrorActionPreference”或common参数设置为Stop:术语“Get-NetAdapter”未被识别为cmdlet,函数,脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。

我认为它试图在拉取服务器上执行Get-NetAdapter,但我可能会错误解释错误消息。

如何在目标计算机上注册cmdlet表达式的结果,并将其注册到$InterfaceAlias资源的xDnsServerAddress变量中?

2 个答案:

答案 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

注意:

评论中有一个问题。问题的摘要是查询是否将声明性范式转变为命令式范式。

答案:

  

我不相信查询会把它变成一种命令式的范例,但是你   目前无法执行查询保持操作的结果和   用它来宣告下一个州。

     

目前这迫使我们进一步远离   声明我想要的问题。 我的个人观点就是我们   应该使用我们拥有的东西并编写查询和设置的资源   已知国家。然后,通过其余部分使用已知状态   配置(根据您的术语形成声明性相对的形式)。

     

DSC团队有类似的enter image description here   我们用来跟踪这个请求。如果你这么想,请投票   是一个有用的功能。