[AWS][DevOps] Vagrant+Chef Solo+BerkshelfでEC2インスタンスにnginxを入れる

By |7月 24, 2013|AWS, DevOps, |


前回の[AWS][DevOps] VagrantでEC2インスタンスを作成はVagrantでEC2インスタンスを作成しました。今回はChef Soloを使って、このインスタンスにnginxをインストールしてみます。

Chefはサーバ構成管理ツールで、端的に言うとサーバに対するパッケージのインストールや設定変更をRubyで記述し実行するツールです。つまりVagrantでサーバの起動や廃棄をコード化したように、サーバの変更をコード化するツールがChefです。

今回はVagrantで起動したサーバに対して変更を行うという操作をするために、前回の手順で作成したEC2インスタンスを廃棄せず以下の手順でサーバの変更を行います。したがって廃棄してしまっている場合は再度vagrant upをして準備してください。

まず、EC2インスタンスの設定を変更するのでEC2インスタンス自体にChefをインストールします。vagrant sshでログインしてインストールしても良いのですが、設定変更をすべてVagrant+Chefで管理していくという主旨を体感するためにVagrantfileの変更を既存のEC2インスタンスへ適用する手順を行います。

まず、vagrant-omnibusをいうプラグインをインストールします。

[html]
$ vagrant plugin install vagrant-omnibus
$ vagrant plugin list
vagrant-aws (0.2.2)
vagrant-omnibus (1.1.0)
[/html]

そしてVagrantfileを以下のように変更します。

前回との相違は”config.omnibus.chef_version = :latest”が1行追加されただけですね。この状態でvagrant provisionするとEC2インスタンスにChef Soloがインストールされます。
[html]
$ vagrant provision
[default] Rsyncing folder: /Users/kojo/Documents/workspace/aws-dummy/ => /vagrant
[default] Installing Chef 11.6.0 Omnibus package…
$ vagrant ssh
Last login: Tue Jul 23 17:36:00 2013 from xxx

__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/
There are 6 security update(s) out of 11 total update(s) available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-132-98-51 ~]$ knife -v
Chef: 11.6.0
[/html]

ChefはCookbook(正確にはRecipe)というファイル群を使ってサーバの構成を行います。実際に構成内容を記述したソースコードがRecipeで、それを包括するディレクトリのようなものはCookbookと呼ばれています。そしてnginxのようなメジャーなパッケージのCookbookは既に誰かが用意してくれていて、Opscodeコミュニティを探せば大体見つかります。

BerkshelfはChefのCookbookを管理するツールで、インストールするとberksコマンドが使えるようになり、予め用意されたBerksfileに従って指定されたサイトから指定されたCookbookを依存管理しながら落としてくるツールです。今回は上記したOpscodeコミュニティからnginxのCookbookを落としてくるのに使います。

それではBerkshelfをインストールします。
[html]
$ gem install berkshelf
$ berks -v
Berkshelf (2.0.7)
[/html]

続いてVagrantからBerkshelfを使うVagrantプラグインをインストールします。

[html]
$ vagrant plugin install vagrant-berkshelf
$ vagrant plugin list
vagrant-aws (0.2.2)
vagrant-berkshelf (1.3.3)
vagrant-omnibus (1.1.0)
[/html]

次にberks cookbookコマンドを叩きます。
[html]
$ berks cookbook .
create files/default
create templates/default
create attributes
create definitions
create libraries
create providers
create recipes
create resources
create recipes/default.rb
create metadata.rb
create LICENSE
create README.md
create Berksfile
create Thorfile
create chefignore
create .gitignore
run git init from "."
create Gemfile
conflict Vagrantfile
Overwrite /Users/kojo/Documents/workspace/aws-dummy/Vagrantfile? (enter "h" for help) [Ynaqdh] n <=上書きしない
skip Vagrantfile
[/html]

これで一般的なCookbookに必要なファイル群が作成されましたが今回はBerksfileとVagrantfile以外は触りません。Chefは裾野が広いので、また機会があれば触れたいと思います。

次にBerksfileにnginxを落とすための記述をします。

[html]
$ vi Berksfile
site: opscode

metadata
cookbook ‘nginx’ <=追加
[/html]

これでberksするとOpscodeからnginxのCookbookを落としてきます。依存するCookbookもすべて落としてきてるのがわかります。落としたCookbookは~/.berkshelf/default/vagrant/以下に入るようです。
[html]
$ berks
Using . (0.1.0) from metadata
Installing nginx (1.6.0) from site: ‘http://cookbooks.opscode.com/api/v1/cookbooks’
Installing build-essential (1.4.0) from site: ‘http://cookbooks.opscode.com/api/v1/cookbooks’
Installing yum (2.3.0) from site: ‘http://cookbooks.opscode.com/api/v1/cookbooks’
Installing apt (2.0.0) from site: ‘http://cookbooks.opscode.com/api/v1/cookbooks’
Installing runit (1.1.6) from site: ‘http://cookbooks.opscode.com/api/v1/cookbooks’
Installing ohai (1.1.10) from site: ‘http://cookbooks.opscode.com/api/v1/cookbooks’
$ ls ~/.berkshelf/default/vagrant/berkshelf-20130724-93757-14n8ckd-default/
Berksfile LICENSE Vagrantfile build-essential files nginx recipes templates Berksfile.lock README.md apt chefignore libraries ohai resources yum Gemfile Thorfile attributes definitions metadata.rb providers runit
[/html]

続いてVagrantfileに追記します。

6〜10行目が追加された行になります。

これで再度vagrant provisionします。

[html]
$ vagrant provision
[Berkshelf] Updating Vagrant’s berkshelf: ‘/Users/kojo/.berkshelf/default/vagrant/berkshelf-20130724-93757-14n8ckd-default’
[Berkshelf] Using . (0.1.0)
[Berkshelf] Using nginx (1.6.0)
[Berkshelf] Using build-essential (1.4.0)
[Berkshelf] Using yum (2.3.0)
[Berkshelf] Using apt (2.0.0)
[Berkshelf] Using runit (1.1.6)
[Berkshelf] Using ohai (1.1.10)
[default] Rsyncing folder: /Users/kojo/Documents/workspace/aws-dummy/ => /vagrant
[default] Rsyncing folder: /Users/kojo/.berkshelf/default/vagrant/berkshelf-20130724-93757-14n8ckd-default/ => /tmp/vagrant-chef-1/chef-solo-1/cookbooks
[default] Chef 11.6.0 Omnibus package is already installed.
[default] Running provisioner: chef_solo…
Generating chef JSON and uploading…
Running chef-solo…
[/html]

以下、つらつらリモートでのChefのログが出ます。

※余談ですが”[default] Rsyncing folder: /Users/kojo/Documents/workspace/aws-dummy/ => /vagrant”とあるようにvagrant provisionするとローカルのaws-dummyディレクトリとリモート(EC2インスタンス)の/vagrantが同期されます。ちょっとしたファイル転送にも使えます(使わないか…)

エラーが出ずに終われば以下のようにsshでログインしてnginxがインストールされたか確認します。

[html]
$ vagrant ssh
Last login: Tue Jul 23 21:06:57 2013 from xxx

__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/
There are 6 security update(s) out of 11 total update(s) available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-132-98-51 ~]$ nginx -v
nginx version: nginx/1.2.9
[/html]

バッチリです。