Chef Soloローカル開発環境の自動構築 ~knife-solo 操作編~
knife-soloとは・・・・?
knife-soloとは、ChefをChef Solo環境で利用するためにユーリティリティツールで、
knife-soloを使うと、手元で作ったクックブックをリモートのサーバに転送して
chef-soloコマンドを実行するといった一連の作業を自動化できる。
knife-soloはRubyGemsとして公開されており、gemでインストール可能。
そのため、はじめにrubyとgemのインストールを行う。
1. Rubyのインストールに必要なライブラリをインストール
* コンパイルコマンドを含めzip解凍などに必要なライブラリをインストールする。
yum install gcc zip unzip zlib zlib-devel openssl openssl-devel
2. Rubyをインストール
* gemがyumで入手できる ruby のバージョンに対応していないので、
公式サイトから最新版を入手してソースからコンパイル&インストールを行う。
* ruby の公式ページに行って最新版をダウンロード。
https://www.ruby-lang.org/ja/downloads/
* この時点では、2.4.0が最新版(安定版)なのでこちらを使う。
mkdir works
cd works
wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.gz --no-check-certificate
tar zxvf ruby-2.4.0.tar.gz
cd ruby-2.4.0
./configure
make; make install
* Rubyがインストールされたことを確認
ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]
3. Rubyにzlibとopensslを組み込む
* rubyをソースからインストールしてchefをインストールしようとすると
zlibやopenssl まわりのエラーが出てしまうので、
rubyのソースディレクトリから zlib のライブラリを作っておく。
cd ext/zlib
ruby extconf.rb
make; make install
* つぎに同じくソースディレクトリからopensslのライブラリをつくる。
同様の流れでmakeを行うと以下のエラーが出てしまう。
「No rule to make target `/thread_native.h」
元々のMakefileにtop_srcdirの記述が足りないことが原因のため、
以下コマンドを実行することでopensslのライブラリをつくる。
cd ext/openssl
ruby extconf.rb
sed -i -e "1i top_srcdir = $(cd ../.. && pwd)" Makefile
make; make install
※sed の 「$(cd ../.. && pwd)」という部分は、
rubyのソースディレクトリを指定しておけばOK。
4. gemをインストール
* rubygem の公式サイトに行って最新版をダウンロード。
https://rubygems.org/pages/download/
* この時点では、2.6.8が最新版(安定版)なのでこちらを使う。
mkdir works
cd works
wget https://rubygems.org/rubygems/rubygems-2.6.8.zip --no-check-certificate
unzip rubygems-2.6.8.zip
cd rubygems-2.6.8
ruby setup.rb
make; make install
5. chefdkインストール
* chefdkインストール
wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.7.0-1.el6.x86_64.rpm
rpm -ivh chefdk-0.7.0-1.el6.x86_64.rpm
6. knife-solo/Berkshelfをインストール
* knife-soloをインストール
gem install knife-solo
* knife-soloは、他のgemのインストール有無によってデフォルトのオプションが変化するため、クックブックの依存関係を管理するBerkshelfをインストールしておく。
gem install berkshelf
7. knife-soloでリポジトリを作成
knife-soloでChef Soloを利用するにあたって、
まずはChefリポジトリを新規にローカル側に作成する。
「knife solo init . 」コマンドを実行すると
Chefに必要な各種ファイルとディレクトが展開される。
knife solo init .
※以下のエラーが起きる場合がある
Cannot find subcommand for: 'solo init .'
※原因はgemのknife-soloが二つ存在していること。
以下コマンドを実行し再度「knife solo init . 」を実行すればよい。
/opt/chef/embedded/bin/gem install knife-solo
gem cleanup knife-solo
knife solo init .
8. rsyncをインストール
knifo-soloサーバー側にrsyncをインストールしておく
yum install rsync
9. knife solo bootstrapによるChef Soloのインストールテスト
knife solo bootstrap [ホスト名 or IPアドレス] コマンドを実行し、knife-soloサーバーから他のサーバに対してChef Soloのインストールを実行してみる。
knife solo bootstrap 192.168.33.11 (※192.168.33.11のサーバを別途用意しておく)
10. knifeでクックブックを作成
クックブックの作成はknife-soloではなく、先ほどと同じくknifeで作ります。
knifeはChefに付属のツールで、knife-soloはChef Solo用にknifeを拡張するプラグインという関係。
したがって、kunifeがもともともっている機能で事足りるものはknifeで、knife-soloで拡張しないと使えない機能は、knife soloのようにサブコマンとsoloを付けて実行する。
knife cookbook create を実行しクックブックを作成する。
このとき -o でクックブックの出力先をsite-cookbooksディレクトリに指定します。
Chefにおいては自作のクックブックはsite-cookbooksに置くのが慣習になっているのでそれに従うようにする。
* site-cookbooks配下にdstatクックブックを作成
knife cookbook create dstat -o site-cookbooks
11. Nodeオブジェクトを設定
nodes/192.168.33.11.jsonを編集してランリストにdstatのレシピを追記する。
ーーーーーーーーーーーーーーーーーーーーーーーーー
{
"run_list":[
"recipe[dstat]"
]
}
ーーーーーーーーーーーーーーーーーーーーーーーーー
12. dstatをインストールするレシピを作成
site-cookbooks/dstat/recipes/default.rbに以下を追記。
ーーーーーーーーーーーーーーーーーーーーーーーーー
package "dstat" do
action :install
end
ーーーーーーーーーーーーーーーーーーーーーーーーー
13. knife-soloでChef Soloを実行
knife-soloを使ってリモートのノード(192.168.33.11)にプロビジョニングを実施。
knife solo cook [ホスト名 or IPアドレス] コマンドで実行する。
また、knife solo cookコマンドの裏側では、rsyncでknife-soloサーバからリモートにクックブックが転送され、
SSH経由でsudo付きでchef-soloコマンドが実装されている。その際、先に作ったNodeオブジェクトからノードの状態が読み込まれている。
knife solo cook 192.168.33.11