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 :-)

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
Blog Tags