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.
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'
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 :-)
Interested in Cloud or Chef Trainings? Have a look at our Commandemy Trainings page. Need help migrating to the cloud? Check out Infralovers.
comments powered by Disqus