Chef Solo入門読んだメモ
Chef Solo入門を読んだ
Vagrant
- Virtual Boxをインストール/起動
OSイメージをDL(結構時間かかる)
vagrant box add *vm_template_name* *vm_template_URL*
このページにVagrantに適したOSイメージが有り。
OSの起動ファイルの作成
vagrant init
(必要があれば)仮想マシンの設定ファイルを設定
emacs Vagrantfile
仮想マシンの起動
vagrant up
仮想マシンの終了
vagrant halt
仮想マシンの削除
vagrant destroy
-
vagrant ssh [*host_name*]
-
vagrant ssh-config --host *host_name*
Vagrantfileの設定
Vagrant::Config.run do |config|
config.vm.define :*vm_name* do |cfg|
cfg.vm.box = "*vm_template_name*"
fg.vm.network :hostonly, :"192.168.100.100"
cfg.vm.host_name = "*host_name*"
end
同じように他のホストの定義を行う
end
Chef
Chef Soloのインストール
knife-soloのインストール
### ver 0.2
sudo gem install knife-solo
### ver 0.3
git clone git://github.com/matschaffer/knife-solo.git cd knife-solo rake install
ver0.3の場合下記を~/.chef/knife.rbに追加
knife[:solo_paht] = "/tmp/chef-solo"
Chef-Soloの利用準備から実行まで
新規リポジトリのひな形作成
knife solo init chef-repo cd chef-repo git init git add . git commit -m "first commit"
クックブックの作成・編集
knife cookbook create *cook_book_name* -o cookbooks emacs cookbooks/*cook_book_name*/recipes/default.rb
ホストの設定の変更
emacs nodes/*host_name*.json
環境の準備()
knife solo prepare [*user_name@*]*vm_name* git add . git commit -m "add node json file"
Chef Solo実行
knife solo cook [*user_name@*]*host_name* git add . git commit -m "Add *cook_book_name* recipe"
複数ホストへの実行
echo user@node1 user@node2 user@node3 | xargs -n 1 knife solo cook
サードパーティのChefクックブック
設定
Opscode Communityから秘密鍵のDL
サインアップ → Get a new private key → ダウンロードダウンロード先:/Users/rasenn/.chef/rasenn.pem
knifeの設定 ~/.chef/knife.rb を下記の通り編集
client_key '/Users/rasenn/.chef/rasenn.pem' cookbook_path ["./cookbooks"]
利用
gitをコミット状態にする
git init git add . git commit -m "commit"
2.yumクックブックの取得
knife cookbook site vendor yum
レシピ等の書き方
- TreasureDataのレシピが参考になる。
デフォルトでは、cookbooks/レシピ名/recipes/default.rb
に書くといいと思われます。
グループ作成
group "*group_name*" do group_name "*group_name*" gid 403 action [:create] end
aa
ユーザ作成
user "*user_name*" do uid 403 group "*group_name*" home "/var/run/" password nil supports :manage_home => true action [:create, :manage] end
passwordをnilにすることで、ログイン出来ないユーザを作成している
ohaiデータの利用 ノード毎の情報(IPアドレスやパッケージのインストール状態等)の取得には、Ohaiというライブラリを利用している。 下記コマンドにて実行できる。
ohai
テンプレートからファイル作成
テンプレートファイルはcookbooks/レシピ名/templates/
に保存しておく。下記の例だと、cookbooks/レシピ名/templates/to.conf.erb
に置くといいtemplate "/etc/path/to.conf" mode "0644" source "to.conf.erb" notifies :reload, 'service[*service_name*]' end
/etc/path/to.confは配置先のパス、to.conf.erbはrecipeにあるファイル notifiesはtemplateを実行した後に、service[service_name]をreloadする。 erbファイルなので変数が利用できる。IPアドレスの部分を変数にして、マシンごとに設定する、なんて事が可能。変数はホスト名.jsonで設定できるとのこと。 下記のようなJSONファイルがあり、
{ "nginx": { "port" : 80 }, "run_list": { } }
下記のようなテンプレートファイルがある場合、
<server><port><%= node[:nginx][:port] %></test></server>
該当のマシンでは、
<test>abc</test>
上記のように変換される。このへんはRailsの変数がJSONファイルに移動しただけ、という感じ。
サービス起動
service "*service*" do action [:enable, :start] subscribes :restart, resources(:template => "/etc/path/to.conf") supports :status => true, :restart => true, :reload => true end
:status,restart,reloadが利用可能。:restart => trueが設定されていない場合、stop+startで代用してしまう。 subcribesは、テンプレートのnotifiesの逆、templateが更新されたら、serviceをrestartする。
パッケージのインストール
package "*package_name*" do action :install source "/tmp/tar-x.y.z.rpm" provider Chef::Provider::Package::Rpm end
:installを:upgradeにすると、最新のパッケージに差し替わる。source,provideは省略可能 削除の仕方は、下記の通り。
package "*package_name*" do action :remove end
rubygemsのインストール
gem_package "rake" do action :install end
Cookbook File
ファイルをリモートマシンに転送する。"File"ってのもあるらしいけども、ファイルを1から作成する場合のものらしい。tarファイルとかrpmファイルを転送するのは、cookbook_fileらしい。cookbook_file "/tmp/supervisor.rpm" do source "abc" mode 0644 end
ディレクトリ作成
directory "/test/directory" do owner "rasenn" group rasenn mode 0755 action :create end
任意のシェルスクリプトを実行する。
bash "install xyz" do user "rasenn" group "rasenn" cwd "/home/rasenn" environment "HOME" => '/home/rasenn' code <<-EOC curl -kL http://----- | bash EOC creates "/home/rasenn/----" end
cwdはカレントディレクトリ、environmentは環境変数を設定するオプション。
creates
はそのファイルがあったら実行しないオプション。このコードが作るであろうファイルを指定する。not_if
やonly_if
もあるらしい。not_if
は偽なら実行。only_if
は真なら実行。not_ifはunless,only_ifはifって感じですね。 サンプルで、下記が書いてありましたが、これはかなり使えるんじゃないでしょうか?パスがどうなってるか分かりませんが。note_if 'which ruby-build'
Cron
cron "test" do hour 1 weekday 6 mailto admin@master.com action :create end
Deploy
なんかあるらしい。githubとか利用できるって。http_request
こんな感じで使うのかな? http_resuest "google access" do url "http://test/regist/ip/adress" action :get endIfconfig IPアドレス設定時に利用できるとのこと
ifconfig "192.168.1.100" do device "eth0" end
Link
Mount
Route
ruby_block
RunListの書き方
{
"run_list" : [
"recipe[name::subname]",
"recipe[apache2]",
"recipe[apache2::mod_ssl]",
"role[webserver]"
]
}
上記の場合、下記の構成にすると、apaches::mod_sslが読み込まれる apache2/ recipes/ default.rb mode_ssl.rb
他のレシピの読み込み方
include_recipe "build-essential::default"
Resourceの自分での定義の仕方
変数の設定の仕方
AttributeとData Bagの2つがあるらしい。
Attributeは前に書いたとおり、JSONファイルに記述する。各ノードごとに利用。
Data Bagは複数のユーザーを全ノードで作る等、各ノードで複数の条件でレシピを実行したい場合に作成する。
デフォルト変数ファイルの作成の仕方
cookbook/レシピ名/attributes/default.rb
に記述する。記述方法はrubyのハッシュの書き方。
Role
かなり重要。いろいろレシピ作っておいて、webserver,databaseserverとか種類によってインストールするパッケージとかを変更できる。
Hadoopとかに適用しようとしたら、namenode,datanodeとかそういう設定にすれば、とかかなり使えるんじゃないかと。
サンプルで書いてあったのは、下記。ファイルパスはroles/webserver.json
{
"name" : "webserver",
"default_attributes" : {},
"override_attributes" : {},
"json_class": "Chef::Role",
"description": "",
"chef_type": "role",
"run_list": [
"recipe[yum::epel]",
"recipe[nginx]",
"recipe[ruby]"
]
}
run_listで設定してあるレシピを実行できるので、サーバーによってインストールする機材を変更できる。
Berkshelf
Bundler風に管理するライブラリ(?)。Rails使ってる人なら、bundler使わない人はいないよね。そんな感じに設定できるものらしいです。 もう疲れたので今日はここまで。