2016-12-01 3 views
1

Я пытаюсь настроить Azure VM с Azure Automation DSC. Одним из ресурсов, которые я хочу установить, является DNS на клиентской рабочей станции с xDnsServerAddress от xNetworking.Как зарегистрировать результат выражения PowerShell в переменной для DSC?

Проблема заключается в том, что для псевдонима интерфейса и изменения псевдонимов интерфейса на виртуальных серверах Azure различаются в зависимости от развертывания (в основном виртуальные машины, похоже, получают либо 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» или общего параметра установлено значение «Стоп»: термин «Get-NetAdapter» не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если включен путь, проверьте правильность пути и повторите попытку.

Я предполагаю, что он пытается выполнить команду Get-NetAdapter на выталкивающем сервере, но я могу неправильно интерпретировать сообщение об ошибке.

Как я могу зарегистрировать результат выражения cmdlet на конечном компьютере и зарегистрировать его в переменной $InterfaceAlias для ресурса xDnsServerAddress?

ответ

1

Вы в данный момент не может выполнить запрос сохранить результаты (см. примечания в конце ответа).

Вы можете обойти это ограничение, используя documented workaround/solution from xNetworking, который найдет активный адаптер ethernet с именем Ethernet1, если это не так, это найдет первый активный адаптер ethernet и сделает уверен, что он называется Ethernet1. Затем используйте ресурс, чтобы установить адрес сервера DSC на Ethernet1.

Это исследование, названия и параметры могут быть изменены. Команда 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

Добавлено. Это лучший способ узнать об этом сейчас. Это решение работает с конфигурациями pull и push. По сути, это очень похоже на решение, которое вы (@techraf) придумали. Поскольку DSC должен быть декларативным языком, лучше отделить ресурс настройки DNS-сервера для сетевого адаптера и поиска сетевого адаптера. Это решение удерживает императивный язык от декларативного. Надеемся, в долгосрочной перспективе команда DSC может найти лучший способ запросить значение и использовать его в качестве параметра позже в конфигурации. – TravisEz13

+0

Выполняет ли запрос состояния и выполнение декларативной операции на основе этого состояния, превращая парадигму в императивную? Это не риторический вопрос, мне действительно интересно. Не является ли декларативно-относительным возможным, помимо декларативно-абсолютного? – techraf

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

Это похоже на [документированном решение здесь] (https://github.com/PowerShell/xNetworking#set-a-node-to-use-itself-as-a-dns-server) – TravisEz13

Смежные вопросы