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使わない人はいないよね。そんな感じに設定できるものらしいです。 もう疲れたので今日はここまで。
東京Ruby会議10 感想
2013/1/13-14に東京Ruby会議10というRubyのカンファレンスに参加してきました。
こういう言語のカンファレンスは初めてだったのですが楽しく充実した時間をすごせました。
Rubyの話ばかりで普段Rubyを業務で使えない人間としてはたまらない感じの会ですね。
その中で雑感を幾つか。
まず、すごいと感じたのが、運営から発表者まですべて有志が行なっていたことです。(多少お金は出るんでしょうけど、会場設営から何から相当大変だったんじゃないかと思います)
カンファレンスの参加費も1000円と、大抵の人の交通費より安いのではないかという値段設定。更にトートバッグと缶バッチつきというw
発表は成功談や失敗談、ガチで行く人もいれば、ネタで行く人もいてバリエーションに富でいました。全体的には緩い感じの発表が多かったように思います。(結構有名ドコロの発表者も多かったですが。)
前日のボード疲れで、寝坊してしまって朝の幾つかは聞けなかったんですけれども、印象に残った発表を2つ。
・日本酒評価サイトとxDD
日本酒評価サイトをいろんな駆動開発で行いましたという内容です。
最初のADD(アルコール駆動開発)から始まりBDD(ビール駆動開発)、WDD(ワイン駆動開発)からいろいろ始まり、ネタ固めかとおもいきや、最後に周りのみんなに支えられてのCDD(コミュニティ駆動開発)と素晴らしい締めをしてきた発表です。
自分が聞いた中では一番笑いがとれていたと思います。
句会(俳句の会)のメンバーのためにアプリを作って1年運用しています。という発表です。(個人的に最も良かった。)
素晴らしいと思ったのが、句会のメンバーからすごく感謝されて句会では毎回おごってもらえるとか、使う人のモチベーションが高いからバグがあっても問題にされないとか、みんな大変さがわかってるから運営をサボってても良くて、精神的負荷が低かったから続けられたとか、そんな句会の暖かさみたいなのが垣間見える発表でした。
本当に必要とされているものだったらバグが有っても(?)、出来がものすごく良くなくても(ある程度の出来は必要だとおもいます)喜んで使ってもらえる良い事例に思えました。(実際は画像を見る限り、かなり完成度は高いと思われますが)
こういう素晴らしいサービス作りてぇぇぇ
本人の俳句のスキルは上がらなかったという素晴らしいオチも付いており、プレゼンとしても良かったと思います。
あと忘れてましたが、「アンチぼっちランチ」なるものがありました。
ソロの参加者がぼっち飯にならないように、参加者希望者を4人1組にして飯に送り出すというものです。Ruby会議では参加者同士の交流も重要視しているからか、時間も2時間とられており、楽しいひとときを過ごせました。
てーか、みんな面白い!いい出会いです!
他のカンファレンスでもアンチぼっちランチやればいいのに。
このカンファレンスで感じたいいとことはとにかく1つなのではないかと思いました。
・Rubyという言語はコミュニティ・有志など、自主的に動く人たちによって支えられている。
発表を聞いていると、皆さん積極的にRubyに貢献したい、という思いをひしひしと感じるのですよね。みなさんRubyが楽しいと思っていて、もっと楽しくしたい!と思っていろいろやってる感じがすごいします。
地域.rbが多いのもそれが理由なように思えます。
雪の関係で途中で中止になって残念だったのですが、最後の発表が「ブログのススメ」だったので、これからブログを始めてみようという気になりました。
あの発表で結構ブログ再開する人多いんじゃないかな?
とにかくいいカンファレンスでした。