从大厨食谱中超越shell脚本

时间:2017-03-21 14:33:26

标签: ruby shell chef chef-recipe

我必须根据我必须从ubuntu节点获得的结果从配方执行脚本。我必须运行代理的版本,并且基于我必须执行脚本。以下是我正在运行的配方中的条件。

notifies :run, 'bash[uninstall CloudPassage]', :immediate
only_if { Mixlib::ShellOut.new("dpkg -s cphalo | grep Version | awk '{print $2}'" -lt "3.9.5").run_command.success? }

但它提供了一种语法。任何人都可以帮助我使用语法从ubuntu节点获取版本号。

语法错误:

FATAL: Cookbook file recipes/default.rb has a ruby syntax error:
FATAL: /home/ubuntu/chef-repo/cookbooks/cloudPassage/recipes/default.rb:27:syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('
FATAL: ...rsion | awk '{print $2}'" -lt "3.9.5").run_command.success? }
FATAL: ...                               ^
FATAL: /home/ubuntu/chef-repo/cookbooks/cloudPassage/recipes/default.rb:27: syntax error, unexpected ')', expecting '}'
FATAL: ... awk '{print $2}'" -lt "3.9.5").run_command.success? }
FATAL: ...  

2 个答案:

答案 0 :(得分:1)

写这个的正确方法:

only_if { Gem::Requirement.create('< 3.9.5').satisfied_by?(Gem::Version.create(shell_out!('dpkg -s cphalo').stdout[/^Version: (.*)$/, 1])) }

或类似的东西。

答案 1 :(得分:0)

此脚本会检查cphalo版本是否小于(-lt3.9.5

  • 获取cphalo阅读Version的行:

     "dpkg -s cphalo | grep Version" 
    
  • 然后管道它到awk并打印第二个字段($2

     | awk '{print $2}'" 
    
  • 由于"3.9.5"

    ,结果与-lt进行了比较
     ">result<" -lt "3.9.5"
    

返回 true false

但是你不能像使用内部双引号一样破坏你的字符串。试试以下内容:

" $(dpkg -s cphalo | grep Version | awk '{print $2}') -lt 3.9.5 "

或者是否需要方括号:

" [ $(dpkg -s cphalo | grep Version | awk '{print $2}') -lt 3.9.5 ] "