読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Knife SoloとAmazon EC2で始めるChef Solo

aws サーバ管理

 Chef Soloの入門として、Knife SoloとAmazon EC2を使ってのセットアップの練習です。Chefの取っ付きにくさは、最初に色々なファイルやフォルダを用意する必要があるところだと思います。そこをKnife Soloは、コマンド1つで初期設定してくれます。ということで、Knife Soloで使い方を覚えるというのは良い選択肢だと思います。今回は、次のようにクライアントからKnife Solo経由でChef Soloを流しこんで、サーバの設定を行う構成になっています。

Amazon Linux AMIの起動



 EC2のウィザードから、Amazon Linux AMIを起動します。今回利用したバージョンは、Amazon Linux AMI 2013.03です。インスタンスサイズは何でも良いので、試すだけであればMicroインスタンスで充分です。セキュリティグループなど適時設定してください。

後々使いやすいように、~/.ssh/configにaws-knifeでログイン出来るように設定もしておきます。

host aws-knife
  hostname 99.99.99.99
  user ec2-user
  identityfile ~/.ssh/your_keypair.pem

knife-soloのインストール&初期設定



 knife soloのインストールと初期のレポジトリの作成を行います。下記の例ではrvmをつかっていますが、必要に応じてsudo等を使ってください。

$ gem install knife-solo
$ knife solo init chef-repo
$ ls
cookbooks	nodes		site-cookbooks
data_bags	roles		solo.rb

 knife solo initを行うと5つのディレクトリが自動で生成されます。それぞれの役針は下記のとおりです。さしあたっては、site-cookbooksとnodesの2つを使えば充分です。

  • cookbooksは、第三者が作ったクックブックをダウンロードして格納する場所。
  • site-cookbooksは、自分が作ったクックブックを格納する場所。
  • nodesは、ノードごとに実行するJSONファイルを格納する場所。
  • data_bagsは、ユーザごとに定義したJSONファイルを格納する場所。
  • rolesは、ノードの役割ごとにグルーピングの定義をしたJSONファイルを格納する場所。


 サーバ側の設定の準備を行います。aws-knifeというのはサーバ名です。任意の名前を使ってください。(IPアドレスやFQDNでも大丈夫です。)

$ knife solo prepare aws-knife
WARNING: No knife configuration file found
Bootstrapping Chef...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6471  100  6471    0     0   6452      0  0:00:01  0:00:01 --:--:--  7805
Downloading Chef  for el...
Installing Chef 
warning: /tmp/tmp.F9iGP0Es/chef-.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                ########################################### [100%]
   1:chef                   ########################################### [100%]
Thank you for installing Chef!
Generating node config 'nodes/aws-knife.json'...

 実行するとchefのrpmをダウンロードして、nodesの下にノード名.jsonというファイルを作成します。

レシピの作成



 それではいよいよレシピを作成します。入門Chef Soloにならってnginxのレシピを書きます。
まずknife cookbook createコマンドでレシピのひな形を作ります。-oは、作成するフォルダの指定です。

$ knife cookbook create nginx -o site-cookbooks
WARNING: No knife configuration file found
** Creating cookbook nginx
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx


 recipies/default.rbに命令群を書きます。インストールするパッケージと、起動設定、テンプレート(設定ファイル)の指定をしています。
site-cookbooks/nginx/recipes/default.rb

package "nginx" do
  action :install
end

service "nginx" do
  supports :status => true, :restart => true, :reload => true
  action [ :enable, :start]
end

template "nginx.conf" do
  path "/etc/nginx/nginx.conf"
  source "nginx.conf.erb"
  owner "root"
  group "root"
  mode 0644
  notifies :reload,'service[nginx]'
end


 nodes以下のファイルの設定を行います。nginxレシピに対する変数と、実行するレシピの指定をしています。
nodes/aws-knife.json

{
  "nginx": {
      "port" : 80
  },
  "run_list": [
      "nginx"
  ]
}

 コンフィグファイルの設定を行います。基本的には、nginx.confをそのまま持っていくだけで大丈夫です。サーバごとに任意に変えたいところを変数化します。今回の例では、<%=node['nginx']['port']%>の部分です。
templates/default/nginx.conf.erb

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server {
        listen       <%=node['nginx']['port']%>;
        server_name  localhost;

        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }
    }
}

knife soloによりサーバ構築の実行



 いよいよレシピを元にサーバを構築します。実行は下記のコマンドだけです。
knife solo cook aws-knife
|

 エラーが出なければ、ブラウザからサーバのURLを叩いてみましょう。

なんという事でしょう。サーバに一度もログインせずに、nginxのインストールから起動まで行えました。

まとめ



 とっつきにくいようですが、Chef Soloは相当出来る子です。またKnife Soloはとっても便利です。そして、何か困った時は、入門Chef Soloをご参考に!!



See Also:
手動でサーバの設定をすることを禁ずる。入門Chef Solo
何故、fluentdなのか?