2016-04-11 24 views
0

Merhaba Chef ve Ruby'de yeniyim. Chef 'da bir yemek tarifi yapmaya çalışıyorum Bir Ruby on (Benim) rubyum kodunun içine girdiğim bir değere bağlı olarak bir sunucuda bir cron işi oluşturmak için.Şef'te crontab işini ruby ​​kodundan değişken değerlere göre oluşturma

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 

O şef Tembel Değerlendirilmesi değişken yöntemi olduğunu biliyoruz ve yakut kodu yakınsama faz üzerinde yürütülüyor, ama benim kodunu değiştirmek yolunu olamaz.

Tembel değerlendirmeyi kodumda nasıl kullanabilirim?

+0

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

+0

@RajarshiDas Q, cron kaynağı hakkında değil, tembel değerlendirmeyle ilgili değildir ve bir gönderiyi düzenlediğinizde, bir bütün olarak düzeltmeye çalışmalısınız. bölüm :) – Tensibai

+0

[çoğaltılmamışsa ilgili] (http://stackoverflow.com/questions/30424244/using-a-ruby-block-to-assign-variables-in-chef-recipe?rq=1). – Tensibai

cevap

0

node['value'] = value normal düzeyde bir öznitelik yaratacaktır, uyarı, düğüm nesnesine kaydedilir ve sonsuza kadar orada kalır.

Dış kaynaktan gelen uçucu bir öznitelik kullanıyorsunuz, bu nedenle node.run_state['value'] kullanmanız gerekir; bu amaç, çalışma sırasında geçici değeri korumaktır.

Şimdi, dediğiniz gibi, daha sonraki kaynaklarınız için lazy evaluation değerini ve harici hizmet geri dönüşüne bağlı olarak farklı bir eylem yapmak istediğinizde eylem için kullanmanız gerekir. Burada run_state güncelleme kullanımı, denenmemiş kod ile

Örnek:

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 

eylem parametresine lazy kullanarak bu altında iseniz kaynak ve çalıştırmak zanaat gerekecek şef 12.4 beri mümkündür Ruby bloğu içinde. (Hala denenmemiş) cevap here hazırlanmış

Örnek:

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 

Ama bu noktada

, size daha iyi bir özel ohai plugin bu bilgileri almak ve tembel olmadan orijinal kodu kullanırsınız görünüyor.

+0

İpucu için teşekkürler. – user2784340

+0

Fakat bu sadece benim sorunumun yarısını çözüyor. Bir node.run_state ['value'] koşulunu nasıl kontrol edebilirim Bu constraction'ı kullanırsam, ruby ​​kodunun içinde hangi değerleri atarım ne olursa olsun node.run_state ['value'] = "nil ise neyse kalır "o zaman cron "cassandra onarım işi" eylemi yapın: ucunu başka silmek cron "cassandra onarım işi 0 " dakika "" saat do" 55" \t hafta içi tembel {node.run_state [ 'değer']} Posta 'root @ localhost' kullanıcı "kök" komut sonu Nitekim uç – user2784340

+0

"/ opt/cassandra/bin/PAr -inc pr onarmak nodetool", harekete geçici nitelik yapmak zorunda olacak de. Şununla ayarlanır: varsayılan olarak sil ve şunu yapın: bir şeyler varsa oluşturun ve sonra da eylem tembelliğini kullanın {node.run_state ['action']} Bence – Tensibai

İlgili konular