对 Chef 配方中的 Powershell 脚本进行故障排除

Troubleshoot Powershell script inside Chef recipe

我对 Chef 还很陌生,但我已经阅读了所有在线教程,感觉自己对基础知识有了很好的掌握。我正在尝试从食谱中 运行 一个 Powershell 脚本。脚本本身 运行 在 Powershell 中运行良好,并按预期更新 DNS IP 设置。当我 运行 配方时,它也没有错误地完成,但嵌入式脚本没有更新 DNS 设置,所以我假设它没有正确执行,我不确定在哪里寻找 errors/logs。

配方贴在下面,通过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

我 95% 确定您在尝试 运行 脚本但未正确处理时遇到了错误。我知道因为这个确切的错误刚刚发生在我身上,一个无声的失败,对我来说这是因为双引号。

两个解决方法:

  1. 删除所有双引号。逃避 MIGHT 工作,但我从来没有好运。

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. 将脚本放在脚本文件中,将文件作为资源写出,然后通知execute资源执行powershell脚本:

```

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 的脚本 files\default\

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