今度、仕事でChefを使いそうで、ラクをしたい!からサードパーティのクックブックを使う為にBerkshelfというツールを使ってみたのでその時の手順メモ。
いや、Ruby力があればもっとあれば。。。
なお、vagrantプラグインのBerkshelfは使っていません。(Berkshelf version3とプラグインの相性が悪いとか聞いたので)
当方RubyやChef初心者なので使い方間違ってたらごめんなさい。。。
なお、省略。
- rbenvのインストール
- Vagrantのインストール
- CentOS6.4のBox取得
目次
- Chef、Knife-soloの準備
- Vagrantで仮想環境の設定
- Chefのリポジトリ作成
- 仮想環境にChefをインストールする
- 自分でクックブックを書いて適応してみる
- Berkshelfのインストール
- Berkshelfを使ってクックブックを取得する
- Berkshelfで取得したクックブックを実行してみる
- 感想
- 参考
動作環境
Workstation(Chefを実行するマシン)
- MacOSX 10.9.2
- ruby 2.0.0p451(rbenv利用)
- gem 2.0.14
- Vagrant 1.4.3
Node(Vagrantで動作するnginxをインストールする対象の仮想環境)
- CentOS6.4
1.Chef、Knife-soloの準備
Gemを使ってChef,Kinife-soloをインストールします。 必要であればsudoを付けてコマンドを実行。 rbenvでなければrbenv rehashは必要ありません。
$gem install chef $gem install knife-solo $rbenv rehash
確認。
$gem list --local |grep -e chef -e knife chef (11.10.4) chef-zero (1.7.3) knife-solo (0.4.1)
Knifeを使う為の設定をします。 とりあえずエンターキー連打でOK。
$knife configure
2.Vagrantで仮想環境の設定
Chefを実行する仮想環境をVagrantを利用して作成します。
適当にフォルダを作成。
$cd ~ $mkdir -p vagrant/chef $cd vagrant/chef
Boxの確認をします。 CentOSのBoxを未取得の場合、vagrant box addコマンドを利用して予めBoxを取得してください。Vagrant関連の昔の記事はこちら。
$vagrant box list centos6_4 (virtualbox) my_centos (virtualbox) precise32 (virtualbox) ubuntu13.10_x64 (virtualbox)
Boxを指定して初期ファイル作成します。指定するのは自分の環境のboxの名称に合わせてください。
$vagrant init centos6_4
カレントディレクトリにVagrantfileが出来ているのでこちらを編集して任意のプライベートIPでアクセス出来るようにします。
#変更前 #config.vm.network :private_network, ip: "192.168.33.10"; # 変更後 config.vm.network :private_network, ip: "192.168.33.10"
上記でホストのMacから192.168.33.10というプライベートIPでアクセス出来るようになります。
VMを起動します。
$vagrant up
IPアドレス指定のアクセスだと色々面倒なのでvagran ssh-configコマンドを利用してホスト指定します。以下の例ではホスト名をblueとしました。(何でも良いです)
$vagrant ssh-config --host blue >> ~/.ssh/config
設定がうまくいっているか確認。
$ssh blue
SSHログインが出来ればOKです。
3.Chefのリポジトリ作成
Chefのリポジトリを作成します。
$cd ~/vagrant/chef/ $knife solo init chef-repo
これでカレントディレクトリにchef-repoというディレクトリが作成されたかと思います。 その中はこんな感じの構成です。
$tree chef-repo chef-repo/ |-- cookbooks |-- data_bags |-- environments |-- nodes |-- roles `-- site-cookbooks
慣習としてcookbooks配下にはサードパーティのレシビを入れ、site-cookbooks配下には自分で作成したレシピを入れるようです。
4.仮想環境にChefをインストールする
VM (今回はCentOS)にChefをインストールして、後でホスト側からChefが実行できるようにしておきます。 本処理ではknife solo prepareコマンドを利用します。
$cd ~/vagrant/chef/chef-repo $knife solo prepare blue
末尾のblueはホスト名なのでssh-configで指定したそれぞれのホスト名に置き換えてください。 結構時間が掛かりますが、しばし待ちます。
私の環境では処理が終わったら
Thank you for installing Chef! Generating node config 'nodes/blue.json'...
みたいなメッセージが最後に出てうまくいっている事が確認できました。 nodes/blue.jsonはあとで編集します。
5.自分でクックブックを書いて適応してみる
Berkshelfでサードパーティのクックブックを使う前に、自分で作ったクックブックが反映できるか確認します。
本例ではiptablesを停止させるレシピを書いてみます。(本番環境でiptablesを停止させるのは危険ですが、今は仮想環境なので)
まずはクックブックのテンプレートを作成します。 クックブック名はstop-iptableとしました。
$knife cookbook create stop-iptables -o site-cookbooks/
クックブックのテンプレートが出来たので実際にiptablesを停止する記述を行います。
$vi site-cookbooks/stop-iptables/recipes/default.rb
以下のように編集します。
service "iptables" do action [ :disable, :stop ] end
詳細はChefの公式ページのServiceについて記載されているページを参照ください。
あと実際にどのクックブックを実行するかを決定する為に、VMにChefをインストールした時に生成されたnodes/blue.jsonを以下のように編集します。
{ "run_list": [ "recipe[stop-iptables]" ] }
では準備できたので実行。 の前に現状確認してみます。
$ssh blue $sudo service iptables status $exit
色々表示されて、iptablesが実行されている事が分かります。
ではChefを実行します。 以下のコマンドをMac側で実施します。
$knife solo cook blue
実行時のログを見るとptables止めたような記述が出ますが、実際に確認します。
$ssh blue $sudo service iptables status iptables: Firewall is not running. $exit
iptablesが停止している事が確認出来ました。
6.Berkshelfのインストール
サードパーティのクックブックを取得する為にBerkshelfをインストールします。 gem install でインストールするとversion2がインストールされるのですが、こちらは今後サポートしないよ、と公式サイトに記述があったのでversion3の方をbundleを利用してインストールします。
まずは、bundleをインストールします。
$gem install bundle $rbenv rehash $bundle --version Bundler version 1.5.3
Bundleで取得するGemを指定するために必要なGemfileを生成します。
$cd ~/vagrant/chef/chef-repo $bundle init
カレントディレクトリに生成されたGemfileを編集します。
$vi Gemfile
公式の通り、以下を追記。 なお、Pluginは入れないのでberkshelfのみ指定します。
source 'https://rubygems.org' gem "berkshelf";, github: "berkshelf/berkshelf"
インストール及びコマンドが実行出来る事を確認します。
$bundle install --path vendor/bundle $bundle exec berks --version 3.0.0.beta7
これで本ディレクトリではberksコマンドが使えます。 なお、pathを指定しないとグローバルな環境にberksをインストールするみたいですが、実際に動作出来るかは試しておりません。
あとGitからcloneしてrakeしてーみたいなやり方もありそうですが、こちらも未確認です
7.Berkshelfを使ってクックブックを取得する
サードパーティのクックブックを取得します。 本例ではOpscodeのnginx を取得してcookbookディレクトリ配下に配置します。
$vi Berksfile
以下のように記載します。
source "https://api.berkshelf.com/" cookbook 'nginx'
Berksfileに基づいて実際にクックブックを取得します。 一度、cookbooksを削除してからコマンドを実行します。
$rm -rf cookbooks $bundle exec berks vendor cookbooks
処理が終わると、依存しているものも合わせてインストールしてきています。
$tree -L 1 cookbooks cookbooks/ |-- Berksfile.lock |-- apt |-- bluepill |-- build-essential |-- nginx |-- ohai |-- rsyslog |-- runit |-- yum `-- yum-epel
依存関係については各クックブック配下のmetadata.jsonにdependenciesとして定義されているものがダウンロードされているようです。
8.Berkshelfで取得したクックブックを実行してみる
いよいよ!クックブックを実行してみます。
実行する際にどのクックブックを実行するか指定する為にblue.jsonを編集します。
$vi nodes/blue.json
レシピを追加します。
{ "run_list": [ "recipe[stop-iptables]", "recipe[nginx]" ] }
実行します。
$knife solo cook blue
途中、warningが出てgem install berkshelfしろと言われますが、処理は止まりませんし、bundleでインストールできているので無視します。
終わったら確認の為に、ブラウザでアクセスしてみます。nginxのデフォルトはport80なのでhttp://192.168.33.10とかでアクセスします。
EEPLリポジトリを使ってインストールしたnginxのデフォルト画面が表示されています。
9.感想
- Ruby力がなくてBerkshelfのインストール及び実行にすごく時間が掛かってしまった
- 多分OpsCodeのクックブックは色んなOSに対応している素晴らしいクックブックだと思うのですが、それが故か初心者としてはトラブったときに何が悪いか判断するのが難しいそうだと感じました。少なくともまだレシピをあんま書いた事ない人だと設定いじるとかも少し苦労しそうな気がしました。
- 実際に自分が使うときには一部使うような事をしようかと思いました。yum-eeplとか汎用的だと思うし、Berfshelfのものを使いたい。でも、nginxとかはPackageリソース使って自分でクックブックを書いた方が後々メンテしやすそうかなと。
- 書き方の参考という意味ではとても勉強になると思います。
10.参考
- Chef
入門Chef Solo - Infrastructure as Code
- Berkshelf関連
こんにちは。記事参考にさせていただきました。ありがとうございます。
返信削除1点、細かいですが誤りがあったみたいだったので報告しておきます。
x action [ :disable, stop ]
o action [ :disable, :stop ]
コメントありがとうございます!ご指摘頂いた箇所は誤りだったため、修正いたしました
削除