Chef recipe内的Powershell脚本故障排除

问题描述:

我对厨师相当陌生,但我已经浏览了所有在线教程,觉得自己对基础知识有一个体面的把握。我试图从配方中运行Powershell脚本。脚本本身从Powershell运行良好,并按预期更新DNS IP设置。当我运行配方时,它也完成了,没有错误,但嵌入的脚本没有更新DNS设置,所以我假设它没有正确执行,我不知道在哪里查找错误/日志。Chef recipe内的Powershell脚本故障排除

的配方下面贴,并通过chef-client.bat --local-mode --runlist 'recipe[prod_server::dns_settings]'

powershell_script 'Set DNS Servers' do 
    code = <<-EOH 
    $primary = "10.1.10.2" 
    $secondary = "10.1.10.225" 
    $DNSServers = "$primary","$secondary" 
    $message="" 
    function setDNS($DNSServers) 
    { 
     try 
     { 
      $NICs = Get-WMIObject Win32_NetworkAdapterConfiguration |where{$_.IPEnabled -eq "TRUE"} 
      Foreach($NIC in $NICs) 
     { 
     $message += $NIC.SetDNSServerSearchOrder(@($DNSServers)) | Out-String # set the DNS IPs and capture output to string 
     } 
      } 
     catch 
      { 
     $message += "An error occcured while setting NIC object." + "`n`rError: $_"; 
      } 
     #write-host $message #if necessary, display result messages 
    } 
    setDNS($DNSServers) 
    EOH 
    end 
+1

熟悉Chef和PowerShell的人都有点儿小生意。我强烈建议在厨师邮寄名单上询问,而不是在这里,因为我知道他们中的一些人在看清单。 – coderanger

+0

我将取消注释写入主机并运行带-l调试的主厨,IIRC powershell_script资源应在调试模式下打印stdout和stderr。 (但这可能取决于你的厨师版本...) – Tensibai

我95%肯定你实际上打一个错误,而试图运行脚本并不能正确处理它被执行。我知道,因为这个确切的错误发生在我身上,一个沉默的失败,对我来说,这是因为双引号。

两种解决方法:

  1. 删除所有双引号。逃离可能的工作,但我从来没有得到好运。

powershell_script 'Set DNS Servers' do code = <<-EOH $primary = '10.1.10.2' $secondary = '10.1.10.225' $DNSServers = $primary,$secondary $message='' function setDNS($DNSServers) { try { $NICs = Get-WMIObject Win32_NetworkAdapterConfiguration |where{$_.IPEnabled -eq 'TRUE'} Foreach($NIC in $NICs) { $message += $NIC.SetDNSServerSearchOrder(@($DNSServers)) | Out-String # set the DNS IPs and capture output to string } } catch { $message += 'An error occcured while setting NIC object.' + '`n`rError: $_'; } #write-host $message #if necessary, display result messages } setDNS($DNSServers) EOH end

  1. 放在一个脚本文件中的脚本,写入文件作为一个资源,然后通知执行资源来执行的powershell脚本:
  2. ```

    script_path = 
        win_friendly_path(File.join(Chef::Config[:file_cache_path],"os-permissions.ps1")) 
        script_name = "os-permissions.ps1" 
    
        execute script_name do 
        command "powershell \"#{script_path}\"" 
        action :nothing 
        end 
    
        cookbook_file script_path do 
        source "os-permissions.ps1" 
        action :create 
        notifies :run, "execute[#{script_name}]", :immediately 
        end 
    

    有了#2,我在我的食谱称为脚本文件中OS-permissions.ps1 \ DEFAULT \

    我无法从脚本中删除所有双引号时使用#2。我有时也直接从食谱直接执行脚本,但这并不简单,可能也不是最佳做法(只是我懒惰)。

开始=“2”>
+1

谢谢尼克。删除双引号不起作用,但在添加“windows”和“chef_handler”食谱后,我可以使用第二种方法使其工作。 – MrShushhh

+0

不错!我认为你需要windows cookbook,因为win_friendly_path()助手。我不知道你为什么需要chef_handler食谱,也许是因为通知/订阅系统。 –