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
我95%肯定你实际上打一个错误,而试图运行脚本并不能正确处理它被执行。我知道,因为这个确切的错误发生在我身上,一个沉默的失败,对我来说,这是因为双引号。
两种解决方法:
- 删除所有双引号。逃离可能的工作,但我从来没有得到好运。
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
- 放在一个脚本文件中的脚本,写入文件作为一个资源,然后通知执行资源来执行的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 \ DEFAULT \
我无法从脚本中删除所有双引号时使用#2。我有时也直接从食谱直接执行脚本,但这并不简单,可能也不是最佳做法(只是我懒惰)。
谢谢尼克。删除双引号不起作用,但在添加“windows”和“chef_handler”食谱后,我可以使用第二种方法使其工作。 – MrShushhh
不错!我认为你需要windows cookbook,因为win_friendly_path()助手。我不知道你为什么需要chef_handler食谱,也许是因为通知/订阅系统。 –
熟悉Chef和PowerShell的人都有点儿小生意。我强烈建议在厨师邮寄名单上询问,而不是在这里,因为我知道他们中的一些人在看清单。 – coderanger
我将取消注释写入主机并运行带-l调试的主厨,IIRC powershell_script资源应在调试模式下打印stdout和stderr。 (但这可能取决于你的厨师版本...) – Tensibai