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