Chef von Opscode und die Eleganz von Ruby
Veröffentlicht von Edmund Haselwanter am Mittwoch, Oktober 14, 2009
Aktuelle Versionen von Chef von Opscode haben eine neue Resource ruby_block spendiert bekommen
Das sind wirklich wunderbare Neuigkeiten, da sich damit elegant Problemstellungen lösen lassen
Wir können damit beispielsweise einen speziellen HTTP request erzeugen. Z.B. einen GET Request auf localhost mit angepasster “Host” Header Information.
Installation eines Ruby Http Client
Zuerst müssen wir einen Ruby HTTP Client installieren. In diesem Beispiel verwenden wir Curb. CurbIt baut auf libcurl auf, daher müssen wir zuerst libcurl installieren:
curl_devel = package "curl-devel" do
action :install
end
curl_devel.run_action(:install)
Mit diesem Code weissen wir Chef an, diesen Code Block sofort auszuführen. Das ist notwendig, da wir diese Bibliothek in diesem chef-run verwenden wollen. Würden wir das nicht machen, dann würde Chef zwar das Packet installieren, es wäre aber erst nach dem chef-run verfügbar. Im nächsten Schritt installieren wir das Curb Gem:
curb_gem = gem_package "curb" do
action :install
end
curb_gem.run_action(:install)
Wir machen das genau gleich wie beim libcurl Paket, damit wir dieses Gem auch sofort verwenden können. Nun müssen wir Chef noch mitteilen, dass es neue Gems gibt. Wir möchten ja Curb jetzt verwenden. Wir sagen also Chef, dass er den Gem Pfad neu laden soll und laden das gerade installierte Curb Gem:
Gem.clear_paths
require 'curb'
Ruby Code in Aktion
Jetzt können wir das eigentliche Beispiel beginnen, den ruby_block:
ruby_block "do-http-request-with-cutom-header" do
block do
timeout = 600
host = "localhost:8080"
real_host = "my.realhost.com"
Chef::Log.info "call get on #{host}, maximal request time: #{timeout} seconds"
c = Curl::Easy.new("http://#{host}/maintenance/do_something") do |curl|
curl.headers['Host'] = real_host
curl.verbose = true
curl.timeout = timeout
end
c.perform
if c.response_code == 200
Chef::Log.info "GET success! response was:#{c.body_str}"
else
Chef::Log.error "GET FAILED. request response was HTTP #{c.response_code}, body: #{c.body_str}"
end
end
action :create
end
Super, oder?. Damit kann man nun neben Shell Scripts nun auch Ruby Blöcke verwenden um Problemstellungen elegant zu implementieren :-)

