我必须根据我必须从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: ...
答案 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
版本是否小于(-lt
)3.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 ] "