Chef:两个相互矛盾的 not_if powershell guard 语句评估为 true

Chef: Two contradicting not_if powershell guard statements evaluating to true

所以我正在与 chef 合作,如果前提条件为真,我需要将一些资源链接在一起。我需要检查进程的版本是否是我想要的,如果这样做的话。我看到了奇怪的行为,并注意到我的警卫声明没有按照我期望的方式进行评估。所以我做了这个测试

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

为什么这两个语句都在记录?当我 运行 虚拟机中的这些 powershell 片段时,我得到一个返回 true,另一个返回 false。所以我希望只写一个日志行。但是当我运行他们两个都在写的时候。

经过一些阅读后,似乎 guard 语句做出了 $LASTEXITCODE 的决定,并且在我的语句的情况下,两者的 $LASTEXITCODE 都是 0

所以我尝试更改我的 guard 语句以强制退出代码不是 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

虽然这没有改变结果,但我仍然看到两个日志资源都已执行。

所以我找了一个工作人员,问题是 Program Files 中的 space 和 --version 被解释为 Powershell 代码。通过像这样制作我的保护字符串

"(&'c:\Program Files\telegraf\telegraf.exe' --version) -like '*#{node['windows']['telegraf']['version']}*'"

通过单引号路径,路径被 powershell 正确解释,我需要 & 运算符,以便括号中的字符串被解释为命令行开关。