因此,我正在与厨师合作,如果前提为真,则需要将一些资源链接在一起。如果需要,我需要检查进程的版本是否是我想要的版本。我看到了奇怪的行为,并注意到我的警卫声明没有得到我期望的评估。所以我做了这个测试
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
因此,我尝试更改后卫声明以强制退出代码而不是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
尽管这并没有改变结果,但我仍然看到两个日志资源都已执行。
答案 0 :(得分:0)
所以我有个工作后卫,问题是Program Files
中的空格和--version
被解释为Powershell代码。通过使我的保护绳子像这样
"(&'c:\\Program Files\\telegraf\\telegraf.exe' --version) -like '*#{node['windows']['telegraf']['version']}*'"
通过单引号引用路径,powershell可以正确解释该路径,我需要使用&
运算符,以便括号中的字符串像小命令一样被解释。