对 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% 确定您在尝试 运行 脚本但未正确处理时遇到了错误。我知道因为这个确切的错误刚刚发生在我身上,一个无声的失败,对我来说这是因为双引号。
两个解决方法:
- 删除所有双引号。逃避 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
- 将脚本放在脚本文件中,将文件作为资源写出,然后通知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。有时我也直接从食谱中直接执行脚本,但这不是那么简单,可能不是最佳实践(只是我很懒)
我对 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% 确定您在尝试 运行 脚本但未正确处理时遇到了错误。我知道因为这个确切的错误刚刚发生在我身上,一个无声的失败,对我来说这是因为双引号。
两个解决方法:
- 删除所有双引号。逃避 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
- 将脚本放在脚本文件中,将文件作为资源写出,然后通知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。有时我也直接从食谱中直接执行脚本,但这不是那么简单,可能不是最佳实践(只是我很懒)