2016-12-01 7 views
1

Azure Automation DSCを使用してAzure VMを設定しようとしています。私が設定したいリソースの1つは、xDnsServerAddressからxNetworkingモジュールまでのクライアントワークステーション上のDNSです。DSCの変数にPowerShell式の結果を登録する方法は?

Azure VMのインターフェイスエイリアスとインターフェイスエイリアスの変更は、展開によって異なります(主にVMはEthernetまたはEthernet 2のいずれかになります)。

私はローカルで次のコマンドレット式を使用して、インターフェイス名を照会することができます

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

問題は、私はコマンドレットの表現を配置する場合のいずれかplace-1またはplace-2にコンパイルジョブがで失敗するということです

設定変数 "ErrorActionPreference"または共通パラメーターがStopに設定されているため、実行中のコマンドが停止しました。 'Get-NetAdapter'という用語は、コマンドレット、関数、スクリプトファイル、または実行可能プログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれている場合は、パスが正しいことを確認してから、もう一度やり直してください。

私はそれがプルサーバー上Get-NetAdapterを実行しようとすると仮定し、私はエラーメッセージを誤って解釈することができます。

どのようにして宛先マシンにコマンドレット式の結果を登録し、xDnsServerAddressリソースの変数$InterfaceAliasに登録できますか?

答えて

1

documented workaround/solution from xNetworkingを使用してこの制限を回避することができます。Ethernet1という名前のアクティブなイーサネットアダプタが見つからない場合は、そのイーサネットアダプタを使用してください最初のアクティブなイーサネットアダプタを見つけてmakeその名前はEthernet1であることを確認してください。次に、リソースを使用して、Ethernet1にDSCサーバーアドレスを設定します。

これは調査のため、名前とパラメータは変更される可能性があります。 DSCチームはこれを行うためのより良い方法を検討しています。

Configuration SetDns 
{ 
    param 
    (
     [string[]]$NodeName = 'localhost' 
    ) 

    Import-DSCResource -ModuleName xNetworking 

    Node $NodeName 
    { 
     script NetAdapterName 
     { 
      GetScript = { 
       Import-module xNetworking 
       $getResult = Get-xNetworkAdapterName -Name 'Ethernet1' 
       return @{ 
        result = $getResult 
       } 
      } 
      TestScript = { 
       Import-module xNetworking 
       Test-xNetworkAdapterName -Name 'Ethernet1' 
      } 
      SetScript = { 
       Import-module xNetworking 
       Set-xNetworkAdapterName -Name 'Ethernet1' -IgnoreMultipleMatchingAdapters 
      } 
     } 
     xDnsServerAddress DnsServerAddress 
     { 
      Address  = '10.0.0.4' 
      InterfaceAlias = 'Ethernet1' 
      AddressFamily = 'IPv4' 
      DependsOn = @('[Script]NetAdapterName') 
     } 
    } 
} 

注:

コメントで質問があります。質問の要約は、クエリーが宣言的パラダイムを不可欠なパラダイムに変えるかどうかです。

回答:

私は照会が不可欠なパラダイムに変換します信じていませんが、あなたは 現在のクエリは、操作の結果を保持し実行することはできませんと は、次の状態を宣言するためにそれを使用。

これは現在、私が望む問題のために宣言的に から少し離れたところに私たちに何かを強要しています。 私の個人的意見は、 は私たちが持っているもので動作し、そのリソースをクエリし、 の既知の状態を設定する必要があります。次に、既知の状態を 構成の残りの部分を使用します(ユーザーの用語ごとに宣言的な形式)。

DSCチームは、このリクエストを追跡するためにこの類似したものを持っています。UserVoice suggestion この が便利だと思うなら、それをアップしてください。

+0

うん、[私はそれを書いた](https://github.com/PowerShell/xNetworking/commit/521166bef8373f72438d2f7643ead8e31daf61ce)、私はそれを免責と呼ぶでしょう。 – TravisEz13

+1

が追加されました。これは私が現在知っている最善の方法です。このソリューションは、プル構成とプッシュ構成の両方で動作します。基本的には、(@techraf)あなたが思いついた解決策に非常に似ています。 DSCは宣言型言語であると考えられているので、NICのDNSサーバーを設定し、NICを検索するためのリソースを分けておく方が良いでしょう。この解決法は、命令的言語を宣言的言語と分離しておく。うまくいけば、長期的には、DSCチームは値を照会して設定の後半でパラメータとして使用するより良い方法を思いつくことができます。 – TravisEz13

+0

状態を照会し、その状態に基づいて宣言的な操作を実行することは、パラダイムを命令的なものに変えますか?これは修辞的な問題ではない、私は本当に興味がある。宣言的絶対に加えて宣言的相対的な可能性はないのですか? – techraf

1

DSCノード構成(MOFファイル)は、コンパイル時にすべての値を設定する必要があります。

私が代わりに xDnsServerAddressのPowerShellスクリプトのリソースを使用することにしました回避策(以下、いくつかの値は、問題の例と一致するようにハードコードされている)として

:あなたは現在のクエリが結果を保つ実行することはできません

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 
    } 
} 
+0

これは、[ここに記載溶液]に類似している(https://github.com/PowerShell/xNetworking#set-a-node-to-use-itself-as-a-dns-server) – TravisEz13

関連する問題