簡體   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