Linux上にchef+vagrantのレシピ開発環境を構築して、本番サーバに適用するまでのHOWTO


Mac上にchef+vagrantでレシピの開発環境を構築しましたが、『みなさんMac上に構築しているけど、実はLinux上にも構築できるよね。』と言うことになってLinux上に構築しました。正直な所、うちのMacはSSDなので、仮想マシンの作成と破棄を何度も何度も繰り返したくないと言うのが本音です。どうせssh経由で操作するので、同じことが出来れば、SSDの寿命に気を使わないで済むのが嬉しいですし。

Mac上に構築したものはそれはそれで利用しますが、今後はLinux上に構築したものを利用していきたいと思います。

なお、目的はレシピを開発マシンで作成して、それを公開サーバに転送、インストールするだけなので、chef serverではなくchef soloを利用します。そうすれば、レンタルサーバに対してのセットアップも楽が出来ますしね。

本記事でやっている事は下記の通り。

  1. rbenvとrubyの開発環境の構築
  2. virtual boxとvagrantでのchefで書いたコードのテスト環境準備
  3. テスト対象サーバ、本番サーバに開発環境からchefによるアクセス、インストールを可能にする
  4. samba3.xをchefでインストールしてみる

rbenvでrubyの開発環境を整える。

sudo apt-get update; sudo apt-get upgrade
sudo apt-get install ruby-build git tree

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

source ~/.bash_profile

# インストール可能なrubyのバージョンを調べて、最新版を入れる。
rbenv install -l
rbenv install 2.1.2
rbenv global 2.1.2

# バージョンやインストール先を確認しておく。
ruby -v
which ruby
which gem

gem install chef
gem install knife-solo

# apt-get upgradeでカーネル更新等があった場合の為に、念のために再起動しておく。
# なんかubuntuってカーネル更新が多いような気がします・・・
sudo reboot

vagrantでテスト用のUbuntuServer14.04 LTSを手っ取り早く構築できるようにする

パッケージ管理マネージャを使うと古い物が入って、新しいパッケージをダウンロードしてと言われるので、virtualboxvagrant共に、ブラウザから最新版を確認した上でダウンロードします。

cd /tmp
sudo apt-get install libsdl1.2debian

# http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp
wget http://download.virtualbox.org/virtualbox/4.3.10/virtualbox-4.3_4.3.10-93012~Ubuntu~raring_amd64.deb
sudo dpkg -i virtualbox-4.3*

# http://www.vagrantup.com/downloads.html
wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.6.1_x86_64.deb
sudo dpkg -i vagrant_*

# /tmpにファイルを残すと忘れるので削除しておく
rm virtualbox-4.3*.deb
rm vagrant_*.deb

# saharaプラグインを入れて、vmwareで言う所の
# スナップショットを使えるようにしておく
vagrant plugin  install sahara

仮想マシンのイメージをダウンロード・登録する。

Vagrantbox.esから、お好みのイメージをダウンロードし、OSイメージとして利用できるようにします。今回は『Ubuntu Server Precise 14.04 amd64』をダウンロードさせてもらいました。

vagrant box add base https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box
mkdir -p ~/chef/vagrant
cd ~/chef/vagrant
vagrant init

# 必要に応じて下記のファイルを編集する。
# 編集しなくても良いが、ネットワーク設定だけはいじっておいた方がapt-get等が使えて便利
# vi Vagrantfile

下記のように、public_networkのコメントを外しておく。

config.vm.network "public_network"

仮想マシンの起動・終了・破棄

# 起動
vagrant up

# 停止
vagrant halt

# 削除
vagrant destroy

# sshでアクセス
vagrant ssh

仮想マシンのスナップショット操作

# sandboxモードを有効にして、巻き戻し地点であると明示する
vagrant sandbox on

# sandbox on した箇所まで巻き戻す
vagrant sandbox rollback

# 状態のマージ
vagrant sandbox commit

# sandboxモードを解除する
vagrant sandbox off

対象サーバに対して、開発サーバからsshでログインできるようにしておく。

chefを使う上で、対象のサーバにsshの公開鍵を使ってパスワードなし(公開鍵ログインなので、パスワード認証よりもセキュアです)でログインできるようにし、更に、Linux上から、ホスト名を指定しただけで対象ホストにsshログインし、<ホスト名> コマンドでコマンド実行が出来る様にしておきます。

ついでに、対象ホストでsudoする際にパスワードなしでsudo出来る様にもしておきます。

これは、vagrantで管理する対象サーバと、実際にchefで構築対象としたい本番サーバの両方に対して実行しておきます。

# 開発マシンでssh-keygenを実行し、秘密鍵、公開鍵を作っておく。
# 既に作成済みの場合は、やらなくて良い。
# オプションは全部未指定でenter押下で。
ssh-keygen -t rsa

# ホスト名、適度に変えてください。/etc/hostsにも設定して、
# 対象ホストにpingが通る事まで確認して下さい。
TARGET_HOST_NAME=ubuntu_server
ping $TARGET_HOST_NAME

mkdir ~/server
echo 'ssh `basename $0` $*' > ~/server/ssh-to
chmod 770 ~/server/ssh-to
echo 'export PATH=$PATH:~/server' >> ~/.bash_profile

cd ~/server
ln -s ssh-to $TARGET_HOST_NAME

source ~/.bash_profile

# ホスト名を指定しただけでログインできるようになっているはず。
# 普段は、ubuntuってホスト名を設定したなら、ubuntuとするだけです。
$TARGET_HOST_NAME

対象サーバでchefコマンドを実行できるユーザーがパスワード無しでsudo出来る様にする。

/etc/sudoersを編集します。このファイルの編集にミスるとsudoする際にエラーが出てしまい、/etc/sudoersを修正出来なくなってしまいます。なので、sshのセッションを2つ張って、片方のセッションでは、sudo su- して、rootになったままの状態にしておくと良いです。/etc/sudoersの編集をミスった場合でも、rootで該当ファイルを訂正すれば良いだけなので。もちろん、リカバリ方法はあるんですが、、、再起動とか色々必要になるので。

sudo cp /etc/sudoers /etc/sudoers.bak
sudo vi /etc/sudoers

下記のようにする。viで編集確定するときは『w!』で。編集が終わったら、パスワードなしでsudo出来る事を確認する。

#%sudo  ALL=(ALL:ALL) ALL
%sudo   ALL=(ALL:ALL) NOPASSWD: ALL

以上で、chefの開発環境のセットアップが終わりです。次に、chefを使ったレシピの作成方法に入っていきます。

chefを使ってみる

どうせなら目的を持って作成してみようと思います。ウェブブラウザのインストールが一般的なようですが、今回はローカルの仮想マシンに対してchefによる環境構築を行うため、ファイルサーバを作成してもセキュリティ上の問題はありません。せっかくなのでsambaをインストールしてみます。

【閑話休題】samba4ってどうなってる?

samba4が出てきて、もうかなりの年月が経っていますが、samba4によるファイルサーバ運用はまだ人柱の感があります。2015年辺りには安定していそうな感もありそうですが、まだ3.x系列の最新版を使っていた方が良さそうです。なので、samba4ではなく、samba3.xをセットアップ対象とします。

chefによるレポジトリを作成する

knife solo init chef-repo
# Creating kitchen...
# Creating knife.rb in kitchen...
# Creating cupboards...

# 自動作成されたリポジトリを確認しておきます。
cd chef-repo && tree

# .
# ├── cookbooks
# ├── data_bags
# ├── environments
# ├── nodes
# ├── roles
# └── site-cookbooks

# gitで管理する
git init
git add .
git commit -m 'first commit'

対象サーバに対して、knife soloが使えるように、prepareしておく。

knife solo prepare <対象ホスト名>

sambaをインストールする為のクックブック、レシピを書く。

cookbookディレクトリ以下にsambaディレクトリや、そのレシピのひな形等を作成。感触をつかむために、(ひな形を作るだけなので何もしないけど)nginxのひな形も一緒に作ってみます。cookbooksディレクトリは、公開されているcookbookを入れる為のディレクトリで、.gitignoreにもそう書いてあるので、site-cookbooksに、自分で書いたレシピを書きためる事にします。

knife cookbook create samba -o ./site-cookbooks
knife cookbook create nginx -o ./site-cookbooks
git add site-cookbooks
git commit -a -m 'samba/nginxのひな形を追加した'

まだ何もできていないけど、取りあえずログを出力する命令のみ書いて、対象サーバに対して実行してみます。
site-cookbooks/samba/recipes/default.rbに下記を追記

log "install samba...."
package "samba" do
action :install
end

nodes/ホスト名.jsonを下記のように修正

"run_list":[
"samba"
]}

実行してみる

knife solo cook <ユーザー名>@ubuntu14
# ....
# ....
#Recipe: samba::default
#  * log[install samba...] action write
#
#  * package[samba] action install
#    - install version 2:4.1.6+dfsg-1ubuntu2 of package samba
#
# Running handlers:
# Running handlers complete
#
# Chef Client finished, 2/2 resources updated in 48.404479108 seconds

warningでsslがどうこうと言うメッセージが出た場合には、将来のリリースで対処策が変わるかもしれないので、取りあえず無視しておきます。これで、対象のサーバにsshでログインして、dpkgコマンドでsambaがインストールされたことを確認します。

# sshの公開鍵を作成した時に、~/serverディレクトリに作成した
# ssh-toのソフトリンクを使って、ホスト名に続いてコマンドを入れれば、
# sshしてコマンド実行してくれるようにしましたので、ちょっと楽をします。
ubuntu14 sudo dpkg -l samba

最後に

本投稿では、開発環境の作成とテスト、それと、本番環境への適用をする際の手順を記載しました。正直な所、テストした後に、apt-get purge sambaとかをしてテストし、ある程度まとまったところで、vagrantでイメージを作り直すなり、スナップショット使うなりでテストした方が効率的なような気がします。

タグ付けされた , , . ブックマークする へのパーマリンク.

コメントを残す

メールアドレスが公開されることはありません。