【发布时间】:2018-07-25 02:18:09
【问题描述】:
所以我正在与厨师合作,如果先决条件为真,我需要将一些资源链接在一起。我需要检查一个流程的版本是否是我想要的,如果这样做的话。我看到了奇怪的行为,并注意到我的警戒声明没有按照我期望的方式进行评估。所以我做了这个测试
log 'log_version' do
message 'Peregrin Took'
level :error
guard_interpreter :powershell_script
not_if <<-EOH
(C:\\Program Files\\telegraf\\telegraf.exe --version) -Like '*1.7.2*'
EOH
end
log 'log_version' do
message 'Meriadoc Brandybuck'
level :error
guard_interpreter :powershell_script
not_if <<-EOH
(C:\\Program Files\\telegraf\\telegraf.exe --version) -NotLike '*1.7.2*'
EOH
end
当我运行它时,我得到了
Recipe: win-telegraf::telegraf
* log[log_version] action write[2018-07-24T07:31:42-07:00] INFO: Processing log[log_version] action write (win-telegraf::telegraf line 47)
[2018-07-24T07:31:42-07:00] INFO: Processing powershell_script[Guard resource] action run (dynamically defined)
[2018-07-24T07:31:43-07:00] ERROR: Peregrin Took
* log[log_version] action write[2018-07-24T07:31:43-07:00] INFO: Processing log[log_version] action write (win-telegraf::telegraf line 57)
[2018-07-24T07:31:43-07:00] INFO: Processing powershell_script[Guard resource] action run (dynamically defined)
[2018-07-24T07:31:43-07:00] ERROR: Meriadoc Brandybuck
为什么这两个语句都在记录?当我在 vm 中运行这些 powershell sn-ps 时,我得到一个返回 true,另一个返回 false。所以我希望只写一个日志行。但是当我运行它们时,它们都在写作。
在阅读了一些内容之后,Guard 语句似乎根据$LASTEXITCODE 做出了决定,就我的语句而言,两者的$LASTEXITCODE 都为0
所以我尝试更改我的保护语句以强制退出 0 以外的代码
log 'log_version' do
message 'Peregrin Took'
level :error
guard_interpreter :powershell_script
not_if <<-EOH
if((C:\\Program Files\\telegraf\\telegraf.exe --version) -Like '*1.7.2*') { exit 1 }
EOH
end
log 'log_version opposite' do
message 'Meriadoc Brandybuck'
level :error
guard_interpreter :powershell_script
not_if <<-EOH
if((C:\\Program Files\\telegraf\\telegraf.exe --version) -NotLike '*1.7.2*') { exit 1 }
EOH
end
虽然这并没有改变结果,但我仍然看到两个日志资源都执行了。
【问题讨论】:
-
如果语句是
exit 0和exit 1会发生什么?退出代码 0 通常被解释为成功,其他都是错误。即,让我们确保 PowerShell 以您认为的方式运行。
标签: powershell chef-infra chef-recipe