こんにちは。@jedipunkz です。
require ‘chef’ して Ruby コードの中で chef を利用したいと思って色々調べていた のですが、そもそもリファレンスが無くサンプルコードもごくわずかしかネット上に見 つけられない状態でした。結局ソースコードを読んで理解していく世界なわけですが、 サンプルコードが幾つかあると他の人に役立つかなぁと思い、ブログに載せていこうか なぁと。
まず Chef サーバへアクセスするためには下記の情報が必要です。
- ユーザ名
- ユーザ用のクライアント鍵
- Chef サーバの URL
これらは Chef::Config で記していきます。
では早速サンプルコードです。まずは data bags 内データの一覧を取得するコードで す。data bags 内のデータを全で取得し配列で表示します。
#!/usr/bin/env ruby
require 'rubygems'
require 'chef/rest'
require 'chef/search/query'
Chef::Config[:node_name]='user01'
Chef::Config[:client_key]='/home/user01/user01.pem'
Chef::Config[:chef_server_url]="https://10.200.9.22"
Chef::DataBag::list.each do |bag_name, url|
Chef::DataBag::load(bag_name).each do |item_name, url|
item = Chef::DataBagItem.load(bag_name, item_name).to_hash
puts item
end
end
次は data bags にデータを入力するコードです。json_data という JSON 形式のデー タを test_data という data bag に放り込んでいます。
#!/usr/bin/env ruby
require 'rubygems'
require 'chef/rest'
require 'chef/search/query'
Chef::Config[:node_name]='user01'
Chef::Config[:client_key]='/home/user01/user01.pem'
Chef::Config[:chef_server_url]="https://10.0.0.10"
json_data = {
"id" => "test",
"command" => "echo test"
}
databag_item = Chef::DataBagItem.new
databag_item.data_bag('test_data')
databag_item.raw_data = proc_nginx
databag_item.save
次は nodes 一覧の取得です。
#!/usr/bin/env ruby
require 'rubygems'
require 'chef/rest'
require 'chef/search/query'
Chef::Config[:node_name]='user01'
Chef::Config[:client_key]='/home/user01/user01.pem'
Chef::Config[:chef_server_url]="https://10.0.0.10"
Chef::Node.list.each do |node|
puts node
end
次は bootstrap するコード。
#!/usr/bin/env ruby
require 'rubygems'
require "chef"
require "chef/knife/core/bootstrap_context"
require 'chef/knife'
require 'chef/knife/ssh'
require 'net/ssh'
require 'net/ssh/multi'
require 'chef/knife/bootstrap'
Chef::Config[:node_name]='user01'
Chef::Config[:client_key]='/home/user01/user01.pem'
Chef::Config[:validation_key]='/home/user01/chef-validator.pem'
Chef::Config[:chef_server_url]="https://10.0.0.10"
kb = Chef::Knife::Bootstrap.new
kb.name_args = ["sensu-client04.deathstar.jp", "10.0.0.20"]
kb.config[:ssh_user] = "root"
kb.config[:identity_file] = "~/novakey01"
kb.config[:ssh_port] = "22"
kb.config[:run_list ] = "role[sensu-client]"
kb.config[:template_file] = "/home/thirai/chef-full.erb"
kb.run
以上です。他のサンプルもこれから探していこうかと思ってます。knife のソース見る のが一番はやいかなぁと。もしくは Chef のテストコード見るか。皆さんもご存知であ れば共有してくださーい。