ちょっと話題の記事

AWS EC2サーバに対するknife solo実行環境構築手順 on Mac OS Xを一から整理してみる

2013.12.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

師匠様方が走り回りまくる今日この頃、皆様いかがお過ごしでしょうか。しんやです。

弊社AWSコンサルチームでは、AWSでの環境構築を『AWS CloudFormation単独(パッケージのインストール等もCloudFormationで兼ねる)』、若しくは『AWS CloudFormation+Knife Solo』という組み合わせで行うのが主流となっています。当エントリでは後者の方、『AWS CloudFormation+Knife Solo』で環境構築を行う際の『knife solo』に於ける環境構築手順について、意外と初見では踏むべき手順が多く、躓く点も多かった(と個人的には思っている)ので備忘録も兼ねてエントリとしてまとめておこうと思います。

 

スタート地点

スタートはここからです。Mac OS X(今回の場合は10.8.4)にデフォルトのRubyが入ってる状態から。ここからスタートしてみます。

$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]

 

Gitインストール

都度githubからcloneする局面が出て来ますので、導入して無ければ入れておきましょう。

$ git version
git version 1.7.11.3

 

rbenvインストール

複数バージョンのRubyの導入・管理が行える『rbenv』をインストールします。

$ cd~
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
Cloning into '.rbenv'...
remote: Counting objects: 1743, done.
remote: Compressing objects: 100% (749/749), done.
remote: Total 1743 (delta 1131), reused 1517 (delta 962)
Receiving objects: 100% (1743/1743), 254.66 KiB | 89 KiB/s, done.
Resolving deltas: 100% (1131/1131), done.

rbenv実行の為のパスを通します。rbenv配下のものはbin/shims/の計2つ。

$ echo 'export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

rbenvで現在導入されているRubyの内容を確認。現在入っているのは冒頭確かめたもののみ。

$ rbenv versions
* system (set by /Users/shinyaa31/.rbenv/version)

 

ruby-buildインストール

rbenvのプラグインで、Unixライクなシステムで異なるバージョンのRubyをコンパイルし、インストール出来るものになります。rbenv installが柄逢えるようになります。インストール手順は上記エントリ内容そのままです。

$ mkdir -p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git
Cloning into 'ruby-build'...
remote: Counting objects: 2526, done.
remote: Compressing objects: 100% (1440/1440), done.
remote: Total 2526 (delta 1161), reused 2227 (delta 884)
Receiving objects: 100% (2526/2526), 352.27 KiB | 165 KiB/s, done.
Resolving deltas: 100% (1161/1161), done.

 

Rubyインストール by rbenv

上記で導入したrbenvでRubyをインストールします。まずは導入可能なバージョンの確認。ここでは2.x系の新しめな2.0.0-p247をチョイス。

$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  :
  1.9.3-p429
  1.9.3-p448
  1.9.3-preview1
  1.9.3-rc1
  2.0.0-dev
  2.0.0-p0
  2.0.0-p195
  2.0.0-p247
  2.0.0-preview1
  2.0.0-preview2
  2.0.0-rc1
  2.0.0-rc2
  2.1.0-dev
  2.1.0-preview1
  :
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02
  topaz-dev

インストール開始。しかしコケました。opensslが原因のようです。

$ rbenv install 2.0.0-p247
Downloading openssl-1.0.1e.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/66bf6f10f060d561929de96f9dfe5b8c
Installing openssl-1.0.1e...

BUILD FAILED

brewでopensslインストール。

$ brew --version
0.9.4
$ brew install openssl

そして再度rbenv install実行。...するもまたもやエラー。今度はgcc等が原因となっているようです。

BUILD FAILED

Inspect or clean up the working tree at /var/folders/p5/p0yjc08x2rv3qnwc6js8nbj80000gn/T/ruby-build.20131113181200.81292
Results logged to /var/folders/p5/p0yjc08x2rv3qnwc6js8nbj80000gn/T/ruby-build.20131113181200.81292.log

Last 10 log lines:
checking for gcc-4.2... no
checking for clang... no
checking for gcc... no
checking for cc... no
checking for gcc... no
checking for cc... no
checking for cl.exe... no

XCodeを導入、そこから[Preferences]→[Downloads]→[Components]でCommand Line Toolsをインストール。

xcode-cli-install

再度インストール挑戦。XCode CLIの導入で諸々必要なライブラリは入ったようです。

$ rbenv install 2.0.0-p247
Downloading ruby-2.0.0-p247.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/c351450a0bed670e0f5ca07da3458a5b
Installing ruby-2.0.0-p247...
Installed ruby-2.0.0-p247 to /Users/shinyaa31/.rbenv/versions/2.0.0-p247
$

状況確認及びバージョン切替。新しいバージョンのRuby導入と、利用バージョンの切替が完了しました。今後の作業はこのRuby2.0.0-p247で行います。

 rbenv versions
* system (set by /Users/shinyaa31/.rbenv/version)
  2.0.0-p247
$ rbenv global 2.0.0-p247
$ rbenv versions
  system
* 2.0.0-p247 (set by /Users/shinyaa31/.rbenv/version)
$

 

knife-soloインストール by gem

当エントリのゴールとなる環境のメインとなるもの。このknife-soloインストールでChef自体も入ります。

あれ?そう言えばRubyGemsのインストールはどこかでしてたっけ?下記エントリでは1.9系の場合はRuby導入時にRubyGemsも入る、とあるけど...2.0系導入した事によって自然と入ったのかな?まぁひとまず良しとしよう(笑)この時点で導入されていなければ導入しておき、gemにてknife-soloをインストールしてください。

$ sudo gem install knife-solo
Password:
Fetching: mixlib-config-2.0.0.gem (100%)
Successfully installed mixlib-config-2.0.0
:
Fetching: pry-0.9.12.3.gem (100%)
Successfully installed pry-0.9.12.3
Fetching: chef-11.8.0.gem (100%)
Successfully installed chef-11.8.0
Fetching: knife-solo-0.4.0.gem (100%)
Thanks for installing knife-solo!

If you run into any issues please let us know at:
  https://github.com/matschaffer/knife-solo/issues

If you are upgrading knife-solo please uninstall any old versions by
running `gem clean knife-solo` to avoid any errors.

See http://bit.ly/CHEF-3255 for more information on the knife bug
that causes this.
Successfully installed knife-solo-0.4.0
Parsing documentation for mixlib-config-2.0.0
Installing ri documentation for mixlib-config-2.0.0
:
Installing ri documentation for pry-0.9.12.3
Parsing documentation for chef-11.8.0
Installing ri documentation for chef-11.8.0
Parsing documentation for knife-solo-0.4.0
Installing ri documentation for knife-solo-0.4.0
28 gems installed
$
:

rbenv rehashで上記インストール内容を反映。これで、knife soloコマンドが使えるようになります。

$ rbenv rehash

まず最初にknife設定コマンドを実行。基本そのままEnter押下で進めました。

$ knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/Users/shinyaa31/.chef/knife.rb] 
Please enter the chef server URL: [https://xxxxxxxxxxxxx-MacBook-Air.local:443] 
Please enter an existing username or clientname for the API: [shinyaa31] 
Please enter the validation clientname: [chef-validator] 
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] 
Please enter the path to a chef repository (or leave blank): 
*****

You must place your client key in:
  /Users/shinyaa31/.chef/shinyaa31.pem
Before running commands with Knife!

*****

You must place your validation key in:
  /etc/chef-server/chef-validator.pem
Before generating instance data with Knife!

*****
Configuration file written to /Users/shinyaa31/.chef/knife.rb
$

knife solo initコマンドでknifeコマンド実行のためのディレクトリ(プロジェクト?)を作成します。編集する内容はこのフォルダ配下、またknife soloコマンドの実行は主にこのフォルダ直下にて行う事になります。

$ knife solo init chef-labo
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
$  
$ ls -la ./chef-labo/
total 8
drwxr-xr-x  10 shinyaa31  staff   340 11 13 19:32 .
drwxr-xr-x+ 91 shinyaa31  staff  3094 11 13 19:32 ..
drwxr-xr-x   3 shinyaa31  staff   102 11 13 19:32 .chef
-rw-r--r--   1 shinyaa31  staff    12 11 13 19:32 .gitignore
drwxr-xr-x   3 shinyaa31  staff   102 11 13 19:32 cookbooks
drwxr-xr-x   3 shinyaa31  staff   102 11 13 19:32 data_bags
drwxr-xr-x   3 shinyaa31  staff   102 11 13 19:32 environments
drwxr-xr-x   3 shinyaa31  staff   102 11 13 19:32 nodes
drwxr-xr-x   3 shinyaa31  staff   102 11 13 19:32 roles
drwxr-xr-x   3 shinyaa31  staff   102 11 13 19:32 site-cookbooks
$

 

berkshelfのインストール by gem

Cookbookとその依存関係の管理を行うツール、berkshelfもこのタイミングでインストールします。knife-solo同様gemにて実行。

$ sudo gem install berkshelf
Password:
Fetching: i18n-0.6.5.gem (100%)
Successfully installed i18n-0.6.5
:
Parsing documentation for rbzip2-0.2.0
Installing ri documentation for rbzip2-0.2.0
Parsing documentation for berkshelf-2.0.10
Installing ri documentation for berkshelf-2.0.10
42 gems installed
$

rbenv rehash後、試しに設定ファイル(Berksfile)を作成し、ダウンロードを実行してみます。(※ちなみにオプション --path 以下を省略すると ~/.berkshelf/cookbooks に導入される模様。それは避けたいので、作成プロジェクト配下のcookbooks/を指定しています)。

$ rbenv rehash
$ cd chef-labo/
$ vi Berksfile
--------------
site :opscode

cookbook 'mysql'
cookbook 'nginx', '~> 0.101.5'
--------------
$
$ berks install --path ./cookbooks/
Installing mysql (4.0.4) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing nginx (0.101.6) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing openssl (1.1.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing build-essential (1.4.2) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing runit (1.4.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing yum (2.4.2) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing bluepill (2.3.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing rsyslog (1.9.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing ohai (1.0.2) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
$

cookbooks配下にそれぞれクックブックがダウンロードされました!

$ ls -lta ./cookbooks/
total 0
drwxr-xr-x  11 shinyaa31  staff  374 11 13 20:00 .
drwxr-xr-x  12 shinyaa31  staff  408 11 13 20:00 ..
drwxr-xr-x  11 shinyaa31  staff  374 11 13 20:00 bluepill
drwxr-xr-x   8 shinyaa31  staff  272 11 13 20:00 build-essential
drwxr-xr-x  10 shinyaa31  staff  340 11 13 20:00 mysql
drwxr-xr-x  13 shinyaa31  staff  442 11 13 20:00 nginx
drwxr-xr-x   8 shinyaa31  staff  272 11 13 20:00 ohai
drwxr-xr-x   8 shinyaa31  staff  272 11 13 20:00 openssl
drwxr-xr-x   9 shinyaa31  staff  306 11 13 20:00 rsyslog
drwxr-xr-x  11 shinyaa31  staff  374 11 13 20:00 runit
drwxr-xr-x  12 shinyaa31  staff  408 11 13 20:00 yum

 

knife-soloの実行

Chefのレシピ作成やその他環境整備についてはこのエントリでは割愛します。そしていよいよ実行へ。

事前準備としてknife solo prepare (ホスト名)が必要となり、VPC外部から直接アクセス可能な状態のEC2ならばホスト名にそのまま対象のIPなりドメイン名なりを指定すれば良い訳ですが、踏み台用EC2サーバを介してを用いて対象となるEC2サーバに対しknife-soloを実行する場合は一つ仕込みが必要です。以下都元さんのエントリ『踏み台(bastion)サーバを構築する』の手順を行う事で多段アクセスを経ての対象サーバでの操作が可能となります。

$ vi /Users/(ユーザー名)/.ssh/config
Host bastion
  Hostname 54.222.xxx.xxx
  User ec2-user
  IdentityFile /Path/to/pemfile/xxxxxxx.pem

Host web-server
  Hostname 10.0.0.123
  User ec2-user
  IdentityFile /Path/to/pemfile/xxxxxxx.pem
  ProxyCommand ssh bastion -W %h:%p

$ ssh web-server
(踏み台サーバを介したWebサーバへのアクセスが一発で可能に)

これで、晴れてknife-solo実行が所定のEC2サーバに対して行えるようになりました!

$ knife-solo prepare web-server
$ knife-solo cook web-server

 

まとめ

という訳で一連の流れを追って整理してみました。実行までに漕ぎ着けられれば何だ簡単じゃん、という気もしますが、こうして見てみると割と色々なテクニックやプロダクトを組み合わせて成立しているのだなというのが分かります。一言で言えば『◯◯して△△したあと、□□□□をやれば行けますよ』という場合でも、割と前提を知ってないとちんぷんかんぷん状態になりがちです。学んだ・聞いた・教わった内容をこうしてまとめておくだけでも、十分勉強になりますね。備忘録の域を出ない内容ではありますが、このエントリがどなたかのChef(Knife-solo)での環境構築の一助になれば幸いです。