在Azure Automation中编译含Get-NetAdapter的DSC配置相关技术问询
咱们先捋清楚核心问题:Azure Automation的DSC配置编译是在云端沙箱环境里执行的,而Get-NetAdapter是针对本地Windows系统的网络适配器cmdlet,云端沙箱里压根没有物理/虚拟网络接口,直接用你原有的配置肯定会失败——因为编译阶段跑Get-NetAdapter根本拿不到任何结果,$InterfaceAlias会是空值,最后生成的MOF文件完全没法用。
所以解决思路很明确:把获取网络接口的逻辑从云端编译阶段移到目标节点的执行阶段,下面给你两种可行的方案:
方案1:用Script资源把逻辑放到目标节点执行
这种方式最灵活,把获取接口、检查DNS配置、设置DNS的逻辑全部放到Script资源里,让这些代码在实际要配置的机器(比如你的Azure VM或者本地服务器)上运行,而不是在云端编译时执行。
调整后的配置代码如下:
configuration MyConfig { # 编译时传入DNS服务器地址,方便灵活配置 param( [Parameter(Mandatory=$true)] [string[]]$DNSServer ) Node localhost { Script SetDnsServer { GetScript = { # 在目标节点上获取匹配的网络接口 $interface = Get-NetAdapter | Where-Object Name -Like "Ethernet*" | Select-Object -First 1 $currentDns = Get-DnsClientServerAddress -InterfaceAlias $interface.Name -AddressFamily IPv4 # 返回当前DNS配置状态,供DSC检查用 return @{ Result = ($currentDns.ServerAddresses -join ',') } } TestScript = { $interface = Get-NetAdapter | Where-Object Name -Like "Ethernet*" | Select-Object -First 1 $currentDns = Get-DnsClientServerAddress -InterfaceAlias $interface.Name -AddressFamily IPv4 # 对比当前DNS和目标DNS是否一致,返回布尔值 return (@($currentDns.ServerAddresses) | Compare-Object -ReferenceObject $using:DNSServer -SyncWindow 0).Count -eq 0 } SetScript = { $interface = Get-NetAdapter | Where-Object Name -Like "Ethernet*" | Select-Object -First 1 # 在目标节点上设置DNS服务器 Set-DnsClientServerAddress -InterfaceAlias $interface.Name -ServerAddresses $using:DNSServer -AddressFamily IPv4 } } } }
方案2:保留xDnsServerAddress,把接口别名作为参数传入
如果你还是想用xDnsServerAddress这个官方资源,那可以把网络接口别名做成配置参数,编译时手动指定——毕竟Azure VM的默认网络接口别名一般都是Ethernet,很多场景下是固定的。
调整后的配置代码:
configuration MyConfig { param( [Parameter(Mandatory=$true)] [string[]]$DNSServer, [Parameter(Mandatory=$true)] [string]$InterfaceAlias ) Node localhost { xDnsServerAddress DnsServerAddress { Address = $DNSServer InterfaceAlias = $InterfaceAlias AddressFamily = 'IPv4' } } }
编译的时候,直接传入参数就行——比如针对Azure VM,就填-InterfaceAlias "Ethernet"和你的DNS服务器地址。
具体在Azure Automation中操作的步骤
- 先导入所需的DSC模块:如果你用方案2的
xDnsServerAddress,得先在Azure Automation账户里导入xNetworking模块。进入你的Automation账户,左侧菜单选「模块」,点击「浏览库」,搜索xNetworking并导入。 - 上传配置脚本:进入「DSC配置」,点击「添加」,粘贴你调整后的配置代码,保存。
- 编译配置:在配置列表里选中你的配置,点击「编译」,如果有参数(比如DNS地址、接口别名),在弹出的窗口里填好,然后启动编译。
- 分配给目标节点:编译完成后,就可以把这个配置分配给你要管理的节点了。
再啰嗦一句为啥原配置不行
原配置里的Get-NetAdapter是在编译阶段跑的,而云端编译环境是个干净的PowerShell沙箱,没有任何网络适配器,所以Get-NetAdapter返回空,$InterfaceAlias就成了空值,最后生成的MOF文件肯定有问题,没法正常配置节点。
内容的提问来源于stack exchange,提问作者Jonathan Eckman

