― Web Technology and Life ―

kinfe-soloを使ったchef-soloに入門したオレオレメモ ~ubuntu環境へのruby~

2013-05-22
naoyaさんの「入門Chef Solo - Infrastructure as Code」を読んで、サーバー状態管理ツールのchef-soloに入門したので、そのメモを書きます。ubuntu10.04,zsh,rubyまったくわからんって状況の人はマルコピで入門できるような未来のオレオレのためのメモを公開します。

chefの概要

chefとは、rubyで書かれたサーバーの状態管理ツールで、apache,mysqlなどなどのサーバーのミドルウェアだったり、ユーザー/グループ作成など、rubyで実行内容を書くことで一括実行し、かつ、そのサーバーへの追加変更事項も管理できます。類似ツールとしては、Puppetなどがあるようですが、僕はよく知りません。

ベースのchefは、server-client方式で、chef-serverに設定情報を保存し、状態管理したサーバーにはchef-clientを入れて設定に変更があったらclientからserverにその内容を取りに行って実行するという使い方がされます。

naoyaさんがメインで紹介しているchef-soloはいわゆるスタンドアロン型で、単体で設定管理と実行を行う環境を提供してくれます。knife-soloは、オレオレな開発環境から、リモート先のサーバーの状態を(一括)管理できます。chef-serverで、設定の管理と実行ができる中央集約型ですね。

図で書けばわかりやすですがそんな感じ。

個人的に感じたメリット

ポイント

naoyaさんが強調しているように、chefは冪等性(べきどうせい)という何度実行しても同じ状態を維持するという方針があり、それゆえ、サーバーのインストールの自動化ツールでなくサーバーの状態管理ツールという点が個人的にも非常にメリットを感じました。

個人的に今までやっていた「オレオレinstall.shの作成」とその課題

個人的な話をすると、今までサーバーの構築はオレオレなinstall.shに、インストールしたいライブラリとか、作成したいユーザーとかもろもろ書いて、それをscpとかセットアップしたいサーバーに送って実行ということをしていて、それでほぼ自動化できていたので、自動化に関してさらさら課題はありませんでした。

ただ、この方法の問題は、「やっぱりあのライブラリも必要らしいからそれも入れよう」とか「configの設定はこうしておこう」とか、新しいことをしようとするいろいろコジコジあとからいじること多いと思うのですが、オレオレshに書き込んで実行しても、上のほうに書いてある「sudo aptitude install apache2」とかの実行で「すでに入っているよ」とか言われちゃうので、この変更はスクリプトに追記して実行というわけにはいかないんですね。。。それで、開発環境でゴリゴリ変更したミドルウェアの設定とかを、本番環境を改めて作ろうって場合とかに、いろんなライブラリをインストールしてほげほげするのがわりとはまるんですよね。(まぁそういうときにだいたいやったことを整理してドキュメント/ブログにしてノウハウの蓄積をするという流れになるんですが)これが結構めんどくさくて、不快かつ負担になっていたわけです。

個人的なメリットまとめ ~それぞれの効率性の比較~

ということで、私も自動化というよりは状態管理に非常にメリットを感じていて、要するに以下のようになります。chef経由でサーバーの設定の変更を管理しておけば、環境のコピーがしやすいということですね。これはとても大きなメリットだと思います。

ツール 構築の自動化 サーバーの変更管理
オレオレinstall.sh そこそこ 低い
chef 高い 高い

とくに初期環境からchefで管理しておけばシステム全体の開発効率、スケールアウトのコストがめちゃくちゃ下がると思うので、小規模環境でも是非とも導入しておきたいと思ったわけですね。

ubuntuへのインストールなどの覚書

一回やったことはブログに書いておくと、楽ちんということで調べればわかることもオレオレメモにするのが得策です。というわけで、rubyとか入れる話はだいたいスルーされているので、そのあたりも合わせてオレオレ環境に即してメモっておきます。

rbuy環境を整える

最近は、システムで入っているものでなく自分の環境に(しかもバージョンを自由に切り替えられる)言語を入れられるのが、LL系ではやっているので、その○○env系で入れます。

sudo aptitude install -y build-essential libreadline-dev libssl-dev zlib1g-dev
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshenv #おいらはzsh環境
echo 'eval "$(rbenv init -)"' >> ~/.zshenv
exec $SHELL -l
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build #rbenv installコマンドを使えるようにする
rbenv install --list #install可能なrubyのバージョン一覧
rbenv install 1.9.3-p392 #rubyはバージョンで勝手違うらしいので、使いたいものによって注意が必要(とりあえず、1.9系の最新版
rbenv rehash #gemモジュールとかバージョン別rubyを入れた後にうつおきまりコマンド
rbenv global #現在のグローバル(ディレクトリ別の使用環境のlocalもある)なrubyのバージョンを確認
rbenv blobal1.9.3-p392 #グローバルなバージョンを1.9.3-p392に変更
rbenv versions #現在のバージョンとinstall済み一覧を確認
gem i rbenv-rehash #毎回rehashしなくていいようにするgemモジュール
rbenv rehash #rbenv-rehashを入れたことを知らせるrehash

ちょっと、オレオレ環境な疑問なのですが、zsh系の話だとだいたい上記のようなの.zshrcに書き込めって書いてあるのが多いのですが、この使い分けあまりよくわかっていませんが、zshenvに入れてます。。。bash的には、bashrc(zshrc),bash_profile(zshenv)のような対応関係な気がしているんだけど、どうなんでしょう???あと、「exec $SHELL -l」の部分も昔はsourceコマンドで読み込みみたいな感じだったけど、この○○env系は「exec $SHELL -l」っていうのが多い。リナックスコマンドはほんとによくわからん(苦笑)これまた、ゆくゆく調べたい・・・

knife-soloとchef-soloのインストール

基本的にぼくはgemでいれちゃう。

gem install chef
knife configure #最初は基本Enter連打
#knife自体はchefをいれたときにはいっていけど
#knife soloサブコマンドを使うにはknife-soloというgemを入れる必要があるみたい。
#3.0バージョンはgitからということでgemは使わない
git clone https://github.com/matschaffer/knife-solo.git
cd knife-solo
git checkout v0.3.0.pre1 #v0.3.0.pre1だとインストールできたけどほかはわかりません
rake install 
echo "knife[:solo_path] = '/tmp/chef-solo'" >> ~/.chef/knife.rb #3.0用らしい

knife-soloを使う前の準備 ~構築対象のサーバーのssh周りの変更~

ここも自動化したいところですが、ぼくはよくわからないので、構築先のサーバーとかで毎回手動で行う数少ない作業の一つです。

  • 【構築対象のサーバ変更】knifeがログインするユーザーをパスワードなしでsudoできるように/etc/sudoersを変更 (%admin ALL=NOPASSWD:ALLとかに)
  • 【構築対象のサーバ変更】ssh-keygen -t rsa
  • 【構築対象のサーバ変更】.ssh/authorized_keysにknifeの実行元のユーザーのsshの公開鍵をはる
  • 【構築対象のサーバ変更】portを変えるなどsshの設定変更ででセキュリティを強化(必須ではないけど、myfinderさんのssh設定の記事などを参考に。)
  • 【knifeの実行元サーバ変更】以下のように.ssh/configにconfig設定をいれておく

.ssh/configの設定内容

Host example.com
    HostName 222.222.222.222
    User chef
    Port 12345
    UserKnownHostsFile /home/hirobanex/.ssh/known_hosts
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentityFile "/home/hirobanex/.ssh/id_rsa"
    IdentitiesOnly yes

このあたりの設定は人それぞれだし、画一化できないので、難しい気がしていますが、どうなんでしょうか?

初めに使うknifeのコマンド群

以下の というところは、上記の例でいえば「example.com」というのが入る。

# 基本knifeのコマンドを使うとgitと連携とかしてくれて楽
knife solo init chef-repo                  #リポジトリを作る
knife cookbook create  -o site-cookbooks #cookbookの作成
vi .//site-cookbook//recipes/default.rb #ここに実行したい内容を書く
knife cookbook test  -o site-cookbooks   #cookbookの構文テスト
knife solo prepare             #リモート先のホストにchef-soloをいれる
knife solo cook            #リモート先のホストでchef-soloを実行する

とりあえず、レシピの書き方は入門Chef Solo - Infrastructure as Codeを読むか、公式ドキュメントのresourceリストをみるのが現状のベスト。

終わりに

「chefでufwを設定してubuntuのセキュリティを強化する方法」という記事も書いているので、そちらもご参考にしていただきつつですね、chefをいろいろいじるにはvagrantという仮想化ツールを使うのがいいということになっているのですが、こちらもubuntuだと一般のレッドハット系の設定と違うところがあるので、別記事でオレオレメモを残しておきたいと思います。

chefも実際よくわからないしsshの設定とかよくわからないところが多く、naoyaさんの入門Chef Solo - Infrastructure as Codeにお世話になったのはもとより、hachioji.pmのLike a ハッカソンでいじっているときに、uzullaさんにsshの細かい設定教えてもらったり、tiwtterでrubyの設定の仕方教えてもらったりして、なんとかいじれるようになりました。

これからも自分の環境に即していじっていきたいと思いますが、いづれにせよコミュニティの皆様に大変感謝です!!

chef update_at : 2013-05-22T10:41:42
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus