Puppet 5.3.3和Powershell - 返回1而不是[0]

时间:2018-01-26 10:57:08

标签: powershell puppet

自从迁移到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]

任何帮助表示赞赏!

2 个答案:

答案 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)超时是必需参数,因此唯一的解决方案是增加超时。