Chef:两个矛盾的not_if powershell保护声明评估为true

时间:2018-07-24 14:45:58

标签: powershell chef chef-recipe

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

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片段时,我得到一个返回true,另一个返回false。因此,我希望只写一条日志行。但是当我运行时,他们两个都在写作。

经过阅读后,看似警卫队的决定是根据$LASTEXITCODE做出的,在我的情况下,两者的$LASTEXITCODE均为0

enter image description here

因此,我尝试更改后卫声明以强制退出代码而不是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

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

1 个答案:

答案 0 :(得分:0)

所以我有个工作后卫,问题是Program Files中的空格和--version被解释为Powershell代码。通过使我的保护绳子像这样

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

通过单引号引用路径,powershell可以正确解释该路径,我需要使用&运算符,以便括号中的字符串像小命令一样被解释。