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 正确解释,我需要 &
运算符,以便括号中的字符串被解释为命令行开关。
所以我正在与 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 正确解释,我需要 &
运算符,以便括号中的字符串被解释为命令行开关。