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 でドキュメントはインストールしないように変更