我正在尝试使用Puppet exec
资源直接运行Powershell命令,而不是指定Powershell脚本的路径。
exec { "Change status and start-up of Win service":
command => 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -NoLogo -NonInteractive -Command "& {set-service Spooler -Status Running -StartupType Automatic; exit (1 - [int]$?)}"',
onlyif => "if(Get-Service Spooler) { exit 0 } else { exit 1 }",
logoutput => 'on_failure',
}
当我尝试运行上面的命令时,我收到以下错误:
Error: Failed to apply catalog: Parameter onlyif failed on Exec[Change status and start-up of Win service]: 'if(Get-Service Spooler
) { exit 0 } else { exit 1 }' is not qualified and no path was specified. Please qualify the command or specify a path. at /etc/puppetlabs/code/environments/production/modules/common/manifests/svc_auto_running.pp:17
看到很少的链接和所有提到的指定二进制的完整路径,在这种情况下我认为是PS可执行文件的路径,并且已经指定。
任何帮助将不胜感激。
更新:在我尝试在powershell命令中包装onlyif
语句后,我能够使用exec直接成功运行powershell命令。但是,现在的问题是,如果我尝试在onlyif
语句中检查不存在的 Win服务,则命令仍会成功通过。
$powershell = 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NoLogo -NonInteractive'
exec { "Change status and start-up of Win service":
command => "$powershell -Command '& {set-service iDoNotExist -Status Running -StartupType Automatic; exit (1 - [int]$?)}'",
#onlyif => "$powershell -Command '& {if(Get-Service iDoNotExist); exit (1 - [int]$?)}'",
onlyif => "$powershell -Command '& {if(Get-Service iDoNotExist) { exit 0 } else { exit 1 }}'",
logoutput => 'on_failure',
}
答案 0 :(得分:1)
使用powershell privider运行这些命令可能更好。您可以安装此模块:puppetlabs/powershell。
它提供了一个可用于执行Powershell命令的powershell提供程序。在木偶运行期间执行命令时,它可能会帮助你避免许多令人讨厌的边缘情况。
答案 1 :(得分:1)
正如@ arco444所建议的那样,我尝试在powershell命令中包装onlyif
语句,它对我有用,但后来,正如我在帖子的更新部分所述,我又遇到了另一个问题。最后,以下工作:
$powershell = 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NoLogo -NonInteractive'
exec { "Change status and start-up of Win service":
command => "$powershell -Command \"& {set-service $service_name -Status Running -StartupType Automatic; exit (1 - [int]$?)}\"",
onlyif => "$powershell -Command '& {\"if(Get-Service ${service_name})\"; exit (1 - [int]$?)}'",
logoutput => 'on_failure',
}