自从迁移到Puppet 5.3.3后,我在运行任何启动或调用进程的powershell脚本时遇到了puppet退出代码1。作为一个例子,我有一个打开记事本的powershell脚本:
Write-Host "Starting notepad ..."
[System.Diagnostics.Process] $proc = Start-Process -FilePath notepad -PassThru -Wait -ErrorAction stop
$EXIT_CODE=$proc.exitcode
Write-Host "notepad exit code is (${EXIT_CODE})"
直接在Powershell中运行此脚本即可完成,并返回预期结果。当通过以下Puppet清单运行时,我收到错误'返回1而不是[0]中的一个
Exec {
provider => powershell,
}
exec { 'test':
command => 'C:/build/test.ps1',
timeout => '0',
logoutput => true,
}
这在Puppet 4.x上没有问题。它执行第一个Write-Host和Start-Process功能,但在该过程完成后退出。完整错误如下:
[Notice: /Stage[main]/Ingres::Win_installation/Exec[test]/returns: Starting notepad ...
[Notice: Applied catalog in 23.19 seconds
[Error: 'C:/build/test.ps1 notepad' returned 1 instead of one of [0]
[Error: /Stage[main]/Ingres::Win_installation/Exec[test]/returns: change from 'notrun' to ['0'] failed: 'C:/build/test.ps1 notepad' returned 1 instead of one of [0]
任何帮助表示赞赏!
答案 0 :(得分:0)
Puppet PowerShell module in Github的指导实际上是这样说的。建议的解决方案是始终在PowerShell脚本末尾添加一个明确的Exit
语句来控制退出代码:
外部文件和退出代码
如果您正在调用外部文件,请执行此操作 作为其他PowerShell脚本或可执行文件,请注意最后一个 Puppet使用执行脚本的exitcode来确定是否 命令成功。
例如,如果文件C:\ fail.ps1包含以下PowerShell 脚本:
& cmd /c EXIT 5 & cmd /c EXIT 1
我们使用以下Puppet 清单:exec { 'test': command => '& C:\fail.ps1', provider => powershell, }
然后
exec['test']
资源将始终失败,因为 外部文件C:\ fail.ps1的最后一个退出代码是1.这个 如果你结合多个行为可能会产生意想不到的后果 外部文件。要停止此行为,请确保在中使用显式的Exit语句 您的PowerShell脚本。例如,我们更改了Puppet清单 从上面到:
exec { 'test': command => '& C:\fail.ps1; Exit 0', provider => powershell, }
这将始终成功,因为Exit 0语句 覆盖C:\ fail.ps1脚本中的退出代码。
- https://github.com/puppetlabs/puppetlabs-powershell#external-files-and-exit-codes
我建议用Try..Catch来做这件事:
Try {
.. your code ..
Exit 0
} Catch {
Write-Error $_
Exit 1
}
答案 1 :(得分:0)
我认为问题出在timeout => 0。 我看了一下PowerShell的源代码:https://github.com/puppetlabs/puppetlabs-powershell/blob/7c8f2464dff5ce8bfd806fa900c8ff8985de5c50/lib/puppet/provider/exec/powershell.rb#L91
如果你传递0,它实际上等了0秒然后使木偶失败。如果删除timeout参数,则默认值为300秒(https://github.com/puppetlabs/puppetlabs-powershell/blob/master/lib/puppet_x/puppetlabs/powershell/powershell_manager.rb#L151)。
由于他们正在使用Pipes(没有使用它们,所以我可能错了:https://msdn.microsoft.com/library/bb355337(v=vs.110).aspx)超时是必需参数,因此唯一的解决方案是增加超时。