2016-04-11 2 views
0

こんにちは私はシェフとルビーが初めてです。 私はシェフでレシピを作成しようとしています サーバー上でcronジョブを作成するには ルビコードの中に入る変数の値に基づいて私はシェフが遅延評価変数法とルビーのコードを持っていることを知っているルビーコードからの変数値に基づいてシェフでcrontabジョブを作成するには

Gem.clear_paths 
node.default["value"] = "nil" 
require 'net/http' 
ruby_block "do-http-request-with-cutom-header" do 
    block do 
     Net::HTTP.get('example.com', '/index.html') # => String 
     uri = URI('http://example.com/index.html') 
     params = { :limit => 10, :page => 3 } 
     uri.query = URI.encode_www_form(params) 
     res = Net::HTTP.get_response(uri) 
     puts res.body if res.is_a?(Net::HTTPSuccess) 
     value= res.code 
     node["value"] = value 
    end 
end 
if node["value"] == "nil" then 
    cron "cassandra repair job" do 
    action :delete 
    end 
else 
    cron "cassandra repair job" do 
    hour "0" 
    minute "55" 
    weekday node["value"] 
    mailto "[email protected]" 
    user "root" 
    command "/opt/cassandra/bin/nodetool repair -par -inc -pr" 
    end 
end 

は収束段階で実行されているが、私は私のコードを変更する方法を把握することはできません。

コードで遅延評価を使用するにはどうすればよいですか?

+0

https://github.com/chef-cookbooks/cron –

+0

@RajarshiDas Qはcronリソースに関するものではなく、遅延評価に関するものです。投稿を編集するときは、全体を修正するようにしてください。部分:) – Tensibai

+0

[関連しない場合は重複](http://stackoverflow.com/questions/30424244/using-a-ruby-block-to-assign-variables-in-chef-recipe?rq=1)。 – Tensibai

答えて

0

node['value'] = valueは、通常のレベルで属性を作成しますが、それはノードオブジェクトに保存され、永遠にそこにとどまります。

外部ソースからの揮発性属性を使用しているため、実行中に一時的な値を保持することを目的としたnode.run_state['value']を使用する必要があります。

これまで述べたように、外部サービスの返品に応じて異なるアクションを望む場合、値とアクションについては、後でのリソースでlazy evaluationを使用する必要があります。ここrun_stateの更新使用、未テストコードと

例:

node.run_state['value'] = nil 
node.run_state['action'] = :delete 
require 'net/http' 

ruby_block "do-http-request-with-cutom-header" do 
    block do 
     Net::HTTP.get('example.com', '/index.html') # => String 
     uri = URI('http://example.com/index.html') 
     params = { :limit => 10, :page => 3 } 
     uri.query = URI.encode_www_form(params) 
     res = Net::HTTP.get_response(uri) 
     puts res.body if res.is_a?(Net::HTTPSuccess) 
     value= res.code 
     node.run_state['value'] = value 
     node.run_state['action'] = :create 
    end 
end 
cron 'cassandra repair job' do 
    hour '0' 
    minute '55' 
    weekday lazy { node.run_state['value'] } 
    mailto '[email protected]' 
    user 'root' 
    command '/opt/cassandra/bin/nodetool repair -par -inc -pr' 
    action lazy { node.run_state['action'] } 
end 

アクションパラメータにlazyを使用するには、あなたがこの下にしている場合は、リソースと実行を作る必要があるでしょう、シェフ12.4以降可能ですそれはルビーブロック内にあります。答えhere(まだテストされていない)から作られた

例:

ruby_block "do-http-request-with-cutom-header" do 
    block do 
     Net::HTTP.get('example.com', '/index.html') # => String 
     uri = URI('http://example.com/index.html') 
     params = { :limit => 10, :page => 3 } 
     uri.query = URI.encode_www_form(params) 
     res = Net::HTTP.get_response(uri) 
     puts res.body if res.is_a?(Net::HTTPSuccess) 
     if res.code.nil? 
     r = Chef::Resource::Cron.new "cassandra repair job" 
     r.run_action :delete 
     else 
     r = Chef::Resource::Cron.new "cassandra repair job" 
     r.hour "0" 
     r.minute "55" 
     r.weekday res.code 
     r.mailto "[email protected]" 
     r.user "root" 
     r.command "/opt/cassandra/bin/nodetool repair -par -inc -pr" 
     r.run_action :create 
     end 
    end 
end 

しかし、この時点で、あなたがより良いカスタムohai pluginからこの情報を取得し、怠惰せずに元のコードを使用することになりそうです。

+0

ヒントありがとうございます。 – user2784340

+0

しかし、これは私の問題の半分を解決するだけです。どのようにしてnode.run_state ['value']の条件チェックをするのですか?もし私がrubyコードの中でどのような値を割り当てていても、このコンストラクションを使うと、node.run_state ['value'] = "nil 「その後、 のcron "カサンドラの修理の仕事" アクションん: エンドを削除 他 のcron "カサンドラの修理の仕事0 " 分 "55" \t平日怠惰{node.run_state [ '値']}" 時間をやります" MAILTO 'ルート@ localhost' の ユーザー "ルート" コマンド確か エンド エンド – user2784340

+0

"は/ opt /カサンドラ/ binが/ -par -inc -pr修復nodetool" を、あなたはアクション一時属性をしなければなりませんでしたよあまりにも。設定:デフォルトで削除して何かができたらアクションを作成するlazy {node.run_state ['action']}と思う。 – Tensibai

関連する問題