![](/img/trans.png)
[英]How can you use a Chef recipe to set an environment variable by reading from Shell script?
[英]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
版本是否小于( -lt
) 3.9.5
。
与cphalo
阅读Version
:
"dpkg -s cphalo | grep Version"
然后将其通过管道传输到awk
并打印第二个字段( $2
)
| awk '{print $2}'"
-lt
将结果与"3.9.5"
进行比较
">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 ] "
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.