share facebook facebook twitter menu hatena pocket slack

2012.02.22 WED

Capistranoってなんじゃ?(EC2にインストール編)

三浦 悟

WRITTEN BY 三浦 悟

CapistranoはSSH経由でリモートコマンドを実行するためのツールで、端末間でのアプリケーションのデプロイ等に利用されています。
Ruby on Railsの台頭とともに知名度を上げ、Railsのデプロイメントでは定番のツールになっています。

Capistranoはそれ自体がRuby製で、Rubyの為のツールのようですが、冒頭の通りSSHでリモートコマンド実行を管理する用途であればどのような状況でも利用できます。

今回試してみるユースケースでは、1台の管理サーバーから2つのサーバー上にファイルを作成してみます。

まず、EC2でAmazon Linuxを3台分マイクロインスタンスで起動します。
ここでは管理サーバーをadmin、リモートの2台をhoge1、hoge2とし、3台にそれぞれEIPを付与します。
仮にそれぞれのEIPは以下の通りとします。

admin: xxx.xxx.xxx.xxx
hoge1: yyy.yyy.yyy.yyy
hoge2: zzz.zzz.zzz.zzz

また、adminからhoge1、hoge2にはsshでアクセスする為、hoge1、hoge2が所属するセキュリティブループにadminからのSSH接続を許可しておきます。

○インストール

それでは、インストールをしてみます。
Capistranoは管理サーバーにのみインストールを行い、リモート先のサーバーにはインストールする必要はありません。
zlib-develやopenssl-devel等の必要なライブラリはあらかじめインストール済みとします。
尚、今回はrvmをつかってRubyをインストールします。

$ cd ~/
$ bash -s stable $ source ~/.bash_profile
$ rvm install 1.9.3
$ rvm 1.9.3 --default

Capistranoはgemで提供されているのでgemからインストールし、インストールが成功しているかバージョンを
確認してみます。

$ gem install capistrano
$ cap --version
Capistrano v2.10.0

以上でインストールは完了です。

○SSH設定

管理サーバーであるadminからhoge1、hoge2へSSHアクセスを行う必要があるので、SSHの設定を行います。
まずadmin, hoge1, hoge2で同じユーザーを作成します。

・admin、hoge1、hoge2

# useradd memorycraft
# passwd memorycraft

次にadminで作成したSSH公開鍵をhoge1、hoge2へ登録します。

・admin

# su - memorycraft
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/memorycraft/.ssh/id_rsa):
Created directory '/home/memorycraft/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/memorycraft/.ssh/id_rsa.
Your public key has been saved in /home/memorycraft/.ssh/id_rsa.pub.
The key fingerprint is:
4d:78:29:3a:b1:e2:19:a3:f0:47:fb:53:75:5d:c1:76 memorycraft@ip-10-146-93-65
The key's randomart image is:
+--[ RSA 2048]----+
|              ...|
|         . .   oE|
|      . o +  ....|
|       + =. . .  |
|.   = + S...     |
| o + * ..        |
|  o =  .         |
|   . ..          |
|      ..         |
+-----------------+

$ cd ~/.ssh/
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7wXX3xR9rT7EoVfT1NI3oZbzAZGJKD45jnm3CR40G37w+MCFpw1x4XlEF5IWNAXUIKWowVsul88i4g3NDpFd7QFDN0X5cgfkmddLh5B7qDGMKZU8/N4T55AYP4go5TkH0XSESrZDMBcdCII6n6/saB1xMLOO0+dqBLQZ48G2LyrJd6ZxEBHEUhP6Ed4MQeQoQw1uonMsbHC8UwPTfggfhhAGgv488GVgYUo6jYzMez/iagXObrpzBE3gM6vMpPRSH+IivGBeFZirIMOm4qrQPxaojy5f6YQoeqMG3MFKwk/575vCT4cjJa2WwIHEqzMRYfWeFrgRGVqUYbtZ3nV0Hw== memorycraft@ip-10-146-93-65
↑これをコピーする

・hoge1, hoge2

# su - memorycraft
$ ssh memorycraft@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is 01:b3:bd:1f:ee:85:7f:ce:9a:e9:a0:f0:15:e1:10:ed.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Permission denied (publickey).
$ cd ~/.ssh
$ vi authorized_keys
↑さきほどコピーした内容をペーストする
$ chmod 600 authorized_keys

以上で登録が完了しました。
それでは、接続を確認してみます。

・admin→hoge1

# su - memorycraft
$ ssh memorycraft@yyy.yyy.yyy.yyy
Last login: Mon Feb 20 19:05:05 2012 from xxx.xxx.xxx.xxx

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

See /usr/share/doc/system-release/ for latest release notes.
There are 23 security update(s) out of 32 total update(s) available

・admin→hoge2

# su - memorycraft
$ ssh memorycraft@zzz.zzz.zzz.zzz
Last login: Mon Feb 20 19:05:05 2012 from xxx.xxx.xxx.xxx

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

See /usr/share/doc/system-release/ for latest release notes.
There are 23 security update(s) out of 32 total update(s) available

無事に接続の確認ができました。

○Capistranoのテスト

それでは、Capistranoを使用してhoge1、hoge2にファイルを作成してみます。
Capistranoは、タスクを定義するCapfileという名前のファイルを読み込んで実行します。
まず、adminでCapfileという名前のファイルを作成し、以下のように内容を記述します。

・admin

# su - memorycraft
$ mkdir cap_test
$ cd cap_test
$ vi Capfile

そして、以下のように入力します。

memorycraftでログインします。

set :user, ‘memorycraft’ # helloworldという名前でhoge1(yyy.yyy.yyy.yyy), hoge2(zzz.zzz.zzz.zzz)それぞれにリモートコマンドを実行するタスクを定義
task :helloworld, :hosts => “xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy” do
# /home/memorycraft/footprintというファイルにhelloworld_日付という文字列を追加する
run “echo helloworld_`date` >> /home/memorycraft/footprint”
end

各行の意味はコメントの通りになります。
それでは、Capistranoを実行してみます。
Capistranoの実行はcapコマンドを使用し、タスク名を指定します。

$ cap helloworld
  * executing `helloworld'
  * executing "echo helloworld_`date` >> /home/memorycraft/footprint"
    servers: ["yyy.yyy.yyy.yyy", "zzz.zzz.zzz.zzz"]
    [yyy.yyy.yyy.yyy] executing command
    [yyy.yyy.yyy.yyy] sh -c 'echo helloworld_`date` >> /home/memorycraft/footprint'
    [zzz.zzz.zzz.zzz] executing command
    [zzz.zzz.zzz.zzz] sh -c 'echo helloworld_`date` >> /home/memorycraft/footprint'
    command finished in 39ms

エラーが出なかったので正常に終了したようです。
それでは、hoge1、hoge2でファイルを確認してみましょう。

・hoge1

$ tail -1000f /home/memorycraft/footprint
helloworld_Mon Feb 20 21:12:40 UTC 2012

・hoge2

$ tail -1000f /home/memorycraft/footprint
helloworld_Mon Feb 20 21:12:40 UTC 2012

上記のように、指定した文字が入っています。
Capfileの記述を見ると、シェルで可能なことであれば設定することができる為、デプロイ以外にも様々な使い道があります。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら

三浦 悟

三浦 悟

高円寺在住のなんじゃ系男子 またの名をmemorycraftといいます。 炭水化物大好き 日々の「なんじゃ?」を記事にしてます。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。