繁体   English   中英

从厨师食谱中执行shell脚本

[英]Excecuting shell script from 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: ... 

正确的写法:

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

或类似的东西。

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

  • cphalo阅读Version

      "dpkg -s cphalo | grep Version" 
  • 然后将其通过管道传输到awk并打印第二个字段( $2

      | awk '{print $2}'" 
  • -lt将结果与"3.9.5"进行比较

      ">result<" -lt "3.9.5" 

返回truefalse

但是,您不能像使用内部双引号一样破坏字符串。 请尝试以下方法:

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

或者如果需要方括号:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM