2014年3月24日月曜日

Berkshelf version3+Knife soloでnginx環境をVagrantに作ってみた話

このエントリーをはてなブックマークに追加 はてなブックマーク - Berkshelf version3+Knife soloでnginx環境をVagrantに作ってみた話

今度、仕事でChefを使いそうで、ラクをしたい!からサードパーティのクックブックを使う為にBerkshelfというツールを使ってみたのでその時の手順メモ。

いや、Ruby力があればもっとあれば。。。

なお、vagrantプラグインのBerkshelfは使っていません。(Berkshelf version3とプラグインの相性が悪いとか聞いたので)

当方RubyやChef初心者なので使い方間違ってたらごめんなさい。。。

なお、省略。

  • rbenvのインストール
  • Vagrantのインストール
  • CentOS6.4のBox取得

目次

  1. Chef、Knife-soloの準備
  2. Vagrantで仮想環境の設定
  3. Chefのリポジトリ作成
  4. 仮想環境にChefをインストールする
  5. 自分でクックブックを書いて適応してみる
  6. Berkshelfのインストール
  7. Berkshelfを使ってクックブックを取得する
  8. Berkshelfで取得したクックブックを実行してみる
  9. 感想
  10. 参考

動作環境

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.jsondependenciesとして定義されているものがダウンロードされているようです。

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

ドットインストール Chef入門

  • Berkshelf関連

Berkshelf(公式)

Berkshelf 入門

ツールを使いたいだけの人のための bundler 入門 (例: vagrant + veewee)

vagrant-berkshelf を使わずに Berkshelf + knife-solo で環境作ってみた話

2 件のコメント:

  1. こんにちは。記事参考にさせていただきました。ありがとうございます。
    1点、細かいですが誤りがあったみたいだったので報告しておきます。

    x    action [ :disable, stop ]
    o    action [ :disable, :stop ]

    返信削除
    返信
    1. コメントありがとうございます!ご指摘頂いた箇所は誤りだったため、修正いたしました

      削除