うえきのブログ

妙高市に住んでいるサーバエンジニアのブログです

AWS EC2でaws-sdk-rubyとvim使う時に最低限設定しておくもの・・・をchefで設定してみた

Cookbookとかレシピを作成する

$ sudo gem install chef
$ knife config
(すべて初期値のままで良いのでエンターキーを押していく)
(~/.chef/knife に設定が書き出されるのでパスを追記する)
$ cat >> ~/.chef/knife.rb

file_cache_path "/tmp"
cookbook_path "/home/ec2-user/chef-solo/cookbooks"

$ knife cookbook create ec2_config
** Creating cookbook ec2_config
** Creating README for cookbook: ec2_config
** Creating CHANGELOG for cookbook: ec2_config
** Creating metadata for cookbook: ec2_config

ひとまず、いまの設定ファイルをままテンプレートとして置いておきます。設定ファイルの拡張子は ".erb" になります。

$ cp -pi ~/.screenrc cookbooks/ec2_config/templates/default/screenrc.erb
$ cp -pi ~/.vimrc cookbooks/ec2_config/templates/default/vimrc.erb

レシピはまずは簡単に2種類だけ設定してみます。

  • yum を使っていくつかのパッケージをインストールする
  • 上でコピーしたファイルをec2-userのホームディレクトリに展開する

レシピを書くにあたって AWS OpsWorks のgithubリポジトリにある opsworks_bundler を参考に(ほぼ丸パクリ)させてもらいました。
https://github.com/aws/opsworks-cookbooks

$ vi cookbooks/ec2_config/recipes/default.rb
#
# Cookbook Name:: ec2# Recipe:: default
#
# Copyright 2013, Kazuki Ueki
#
# All rights reserved
#

ec2_user  = 'ec2-user'
ec2_group = 'ec2-user'
if node[:bundler][:manage_package]
  gem_package "Installing Bundler #{node[:bundler][:version]}" do
    gem_binary node[:dependencies][:gem_binary]
    retries 2
    package_name "bundler"
    action :install
    version node[:bundler][:version]
  end
end

%w[libxml2-devel libxslt-devel libffi-devel git rubygems ruby-devel].each do |pkg_name|
  package pkg_name
end

template "/home/#{ec2_user}/.screenrc" do
  source 'screenrc.erb'
  user ec2_user
  group ec2_group
  mode 0644
end

template "/home/#{ec2_user}/.vimrc" do
  source 'vimrc.erb'
  user ec2_user
  group ec2_group
  mode 0644
end

うまく動くかテストしてみましょう。

$ sudo chef-solo -j ~/.chef/chef.json -c ~/.chef/knife.rb

特にエラーなく動いたらgithubにpushして別のEC2インスタンスでクリーンな状態で動かしてみます。

$ cd ~/chef-solo/cookbooks
$ git init .
$ git add .
$ git commit -m "Initial commit"
$ git remote add origin https://github.com/uekikazuki/ec2_config.git
$ git push -u origin master

別のEC2インスタンスに適用してみる

chefを入れるにもrubygemsやmakeパッケージが必要という鶏と卵な関係なので、そこは仕方なく手作業でインストールします。

$ sudo yum -y install git rubygems make gcc ruby-devel
$ sudo gem install chef --no-ri --no-rdoc

githubから作っておいたCookbookを取り寄せます。pull後のディレクトリは ~/.chef/cookbooks/ec2_config になります。

$ mkdir -p ~/.chef
$ cd .chef
$ git clone https://github.com/uekikazuki/ec2_config.git cookbooks

chef-solo を実行するためにファイルを2つ作成します。"chef-solo.rb" はgitで取ってきたCookbookのパスなどが書かれたコンフィグファイル、"ec2_config.json" はとってきたCookbookの中からどのレシピを実行するか(run_list)を指示したファイルです。

2つのファイルをchef-soloコマンドのオプションとして指定し実行します。

$ cat >> ~/.chef/chef-solo.rb

file_cache_path "/tmp"
cookbook_path "/home/ec2-user/.chef/cookbooks"

$ cat >> ~/.chef/ec2_config.json

{
  "run_list":["recipe[ec2_config]"]
} 

さあ!設定開始です!!パッケージをインストールするのでsudoで実行します。

$ sudo chef-solo -j ~/.chef/ec2_config.json -c ~/.chef/chef-solo.rb

画面に表示されるログにエラーがなければ成功です!
ホームディレクトリにドットファイルが作成されているか確認してみましょう。

$ ls -1a ~/.*rc
/home/ec2-user/.bashrc
/home/ec2-user/.screenrc
/home/ec2-user/.vimrc


成功しました!あとはchefを開発しているopscodeのドキュメント(特にPackagesのドキュメント)を読みながらレシピの書き方を覚えていきましょう。

2013-03-04 23:31 追記

  • chef のインストールには ruby-devel も必要なので yum の対象に追加
  • chef インストール時は --no-ri --no-rdoc でドキュメントはインストールしないように変更