【问题标题】:Chef: Two contradicting not_if powershell guard statements evaluating to trueChef:两个相互矛盾的 not_if powershell 保护语句评估为 true
【发布时间】: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 0exit 1 会发生什么?退出代码 0 通常被解释为成功,其他都是错误。即,让我们确保 PowerShell 以您认为的方式运行。

标签: powershell chef-infra chef-recipe


【解决方案1】:

所以我有一个工作守卫,问题在于Program Files 中的空格和--version 被解释为Powershell 代码。通过像这样制作我的保护字符串

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2016-02-21
    • 2014-10-18
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多