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 < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) $ 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の記述を見る通り、シェルでできることであればなんでも設定できるため、デプロイ以外にも様々な使い道があります。
次回は、デプロイをためしてみたいと思います。
今回は以上です。