capistrano3サーバ構築手順 (Amazon Linux + capistrano 3 + rbenv + Bundler + Ruby 2.2.0 + ssh経由でリモートサーバの設定ファイル変更する)

はじめに
===

AWSにEC2インスタンス(Amazon Linux)を新規作成して、capistrano 3.3 + rbenv + Bundler + Ruby 2.2.0をインストールして、capistrano3サーバを構築する手順です。

capistrano3サーバ上でcapistranoタスク(task)を実行する事で、ssh経由でリモートサーバ(CentOS 6.6)へ接続し、リモートサーバ上の設定ファイル(今回の例では/etc/hostsファイル)の内容を変更するところまで記載致します。

EC2インスタンス作成時に使用したAMI
===

・Amazon Linux AMI 2014.09.1 (HVM) - ami-4985b048

構築した環境
===

以下の構成でcapistrano3サーバを構築する手順になります。

・Amazon Linux
・capistrano3 (Capistrano 3.3.5)
・rbenv
・Bundler 1.7.12
・Ruby 2.2.0

capistrano3サーバに追加するタスクとssh接続先のサーバ
===

今回の例ではcapistrano3サーバからssh経由でリモートのCentOSサーバ(IPアドレスはサンプル用の仮IPアドレス198.51.100.10で記述しています)へ接続し、CentOSサーバの設定ファイルを書き換える手順まで記載致します。

capistrano3サーバからCentOS 6.6サーバ(198.51.100.10)へssh接続し、例として、そのサーバの/etc/hostsをcpコマンドでバックアップした上で、/etc/hostsの内容を書き換えるタスクをcapistrano3に追加します。

参考情報
===

capistrano3インストールについては、http://qiita.com/kazuph 様の以下ページを参考にさせて頂きました。
とても参考になりました。ありがとうございました。
http://qiita.com/kazuph/items/deeaa7d3f9889674d7fe

capistrano3サーバ用のEC2インスタンス作成手順
===

・「AWS Management Console」にログインします。

・capistrano3サーバ用のIAMロールを作成します。

「AWS Management Console」→「IAM」->「Roles」->「Create New Role」をクリックし、capistrano3サーバ用のIAMロールを作成します。

　作成するIAMロール名: capistrano-server-role

IAMロール作成手順は以下を参考にしてみて下さい。
http://qiita.com/na0AaooQ/items/3ec5f8b80150c37a0566

・capistrano3サーバ用のEC2用セキュリティグループを作成します。

「AWS Management Console」→「EC2」->「Security Groups」->「Create Security Group」をクリックし、capistrano3サーバ用のセキュリティグループを作成します。

　作成するセキュリティグループ名: capistrano-server

作成したセキュリティグループに、capistrano3サーバから設定ファイル変更対象のCentOSサーバ(今回の例では198.51.100.10/32)へssh接続通信を許可する設定を追加します。

今回の例ではセキュリティグループの「Outbound」はAll traffic(セキュリティグループ作成時のデフォルト設定)で、「Inbound」にはcapistrano3サーバからsshで接続する対象サーバのIPアドレス(198.51.100.10/32)を追加します。

[セキュリティグループのOutBound設定例]

| Type          | Protocol    | Port Range   | Destination      |
|:--------------|:------------|:-------------|:-----------------|
|All traffic    |All          |All           |0.0.0.0/0         |

[セキュリティグループのInbound設定例]

| Type          | Protocol    | Port Range   | Source           |
|:--------------|:------------|:-------------|:-----------------|
|SSH            |TCP          |22            |198.51.100.10/32  |

実際の運用環境では、各サーバのsshのポート番号はデフォルト22番から別のポートに変更されている事が多いと思います。その場合は上記「Inbound」の「Port Range」で通信許可しているポート番号を22番からsshに割り当てているポート番号に変更します。

・capistranoサーバ用のEC2インスタンスを作成します。

「AWS Management Console」→「EC2」->「Instances」->「Launch Instance」をクリックし、Amazon LinuxのAMIを使用して、capistranoサーバ用のEC2インスタンスを作成します。

EC2インスタンス作成手順は以下を参考にしてみて下さい。AMIは「Amazon Linux AMI 2014.09.1 (HVM) - ami-4985b048」を使用します。
http://qiita.com/na0AaooQ/items/2774f63f540969a55941

EC2インスタンス作成時には、先ほど作成したIAMロール「capistrano-server-role」とセキュリティグループ「capistrano-server」を指定します。

・capistrano3サーバ用のEC2インスタンスを作成します。

capistrano3サーバ構築手順 (パッケージ類のインストールやEC2インスタンスの初期設定)
===

・capistrano3サーバ用のEC2インスタンスが作成されたら、ec2-userでsshログインします。

・カーネルやパッケージ類をアップデートします。

```
$ hostname
ip-172-XX-XX-XXX
$ id
uid=XXX(ec2-user) gid=XXX(ec2-user) groups=XXX(ec2-user),XX(wheel)
$

$ sudo yum update
```

・capistrano3サーバの動作に必要なパッケージをインストールします。

```
$ sudo yum -y install gcc git tree libyaml libyaml-devel zlib zlib-devel

$ sudo yum -y install readline readline-devel openssl openssl-devel libxml2 libxml2-devel

$ sudo yum -y install libxslt libxslt-devel libxslt libxslt-devel libffi-devel
```

・ Amazon Linuxの初期設定を行います。

```
$ sudo cp -p /etc/localtime /etc/localtime.ORG
$ diff /etc/localtime /etc/localtime.ORG
$

$ sudo cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$

$ date
Tue Jan 27 00:51:09 JST 2015
$
```

```
$ sudo cp -p /etc/sysconfig/clock /etc/sysconfig/clock.ORG
$ sudo diff /etc/sysconfig/clock /etc/sysconfig/clock.ORG
$
```

```
$ sudo vi /etc/sysconfig/clock
ZONE="UTC"
UTC=true
　↓
ZONE="Asia/Tokyo" 
UTC=false
ARC=false
```

```
$ cat /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false
ARC=false
$
```

・capistranoユーザを作成します。

capistranoユーザとcapistranoグループを作成します。
uidやgidは適宜システム上に存在しない番号を確認の上で指定します。

```
$ sudo cp -p /etc/passwd /etc/passwd.ORG
$ sudo diff /etc/passwd /etc/passwd.ORG
$ sudo cp -p /etc/shadow /etc/shadow.ORG
$ sudo diff /etc/shadow /etc/shadow.ORG
$ sudo cp -p /etc/group /etc/group.ORG
$ sudo diff /etc/group /etc/group.ORG
$

$ sudo groupadd -g [capistranoグループに指定するgid] capistrano
$ sudo useradd -u [capistranoユーザに指定するuid] -s /bin/bash -d /home/capistrano -g capistrano -N -c 'Capistrano User' capistrano
]$

$ id capistrano
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$
```

・capistranoサーバのホスト名を変更します。

```
$ sudo cp -p /etc/sysconfig/network /etc/sysconfig/network.ORG
$ diff /etc/sysconfig/network /etc/sysconfig/network.ORG
$

$ sudo sed -i -e 's/^HOSTNAME=localhost.localdomain/HOSTNAME=example-capistrano-server/g' /etc/sysconfig/network
$

$ diff /etc/sysconfig/network.ORG /etc/sysconfig/network
2c2
< HOSTNAME=localhost.localdomain
---
> HOSTNAME=example-capistrano-server
$
$ grep HOSTNAME /etc/sysconfig/network
HOSTNAME=example-capistrano-server
$
```

一度、capistrano3サーバをリブートします。

```
$ sudo reboot
```

capistrano3サーバ構築手順 (capistranoユーザで/home/capistrano/配下にrbenv + ruby-buildをインストールする)
===

・capistrano3サーバ用のEC2インスタンスが起動してきたら、ec2-userでsshログインします。

・capistrano3サーバにrubygemsがインストールされているか確認します。

```
$ hostname
example-capistrano-server
$ rpm -qa | grep rubygems
rubygems20-2.0.14-1.20.amzn1.noarch
$
```

・ec2-userからcapistranoユーザへスイッチします。この後の手順は基本的にcapistranoユーザで実行します。

```
$ sudo su -
# su - capistrano
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$
```

・capistrano3サーバにrbenvとruby-buildをインストールします。

今回の例ではcapistranoユーザで/home/capistrano/配下にrbenv + ruby-buildをインストールします。

```
$ pwd
/home/capistrano
$ ls -lrta /home/capistrano/rbenv
ls: cannot access /home/capistrano/rbenv: No such file or directory
$
```

```
$ git clone git://github.com/sstephenson/rbenv.git /home/capistrano/rbenv
$
```

```
$ mkdir -p /home/capistrano/rbenv/plugins
$

$ git clone https://github.com/sstephenson/ruby-build.git /home/capistrano/rbenv/plugins/ruby-build
$
```

・rbenvとruby-buildがインストールされた事を確認します。

```
$ pwd
/home/capistrano
$ rbenv -v
rbenv 0.4.0-129-g7e0e85b
$

$ ls -lrta /home/capistrano/
total 28
-rw-r--r--  1 capistrano capistrano  124 Nov  4 08:09 .bashrc
-rw-r--r--  1 capistrano capistrano  176 Nov  4 08:09 .bash_profile
-rw-r--r--  1 capistrano capistrano   18 Nov  4 08:09 .bash_logout
drwxr-xr-x  4 root       root       4096 Jan 27 00:59 ..
drwxrwxr-x 10 capistrano capistrano 4096 Jan 27 01:18 rbenv
drwxrw----  3 capistrano capistrano 4096 Jan 27 01:19 .pki
drwx------  4 capistrano capistrano 4096 Jan 27 01:19 .
$

$ ls -lrta /home/capistrano/rbenv/plugins/ruby-build/
total 52
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 01:19 ..
-rw-rw-r-- 1 capistrano capistrano  438 Jan 27 01:19 .travis.yml
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 01:19 share
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 01:19 script
-rw-rw-r-- 1 capistrano capistrano 9811 Jan 27 01:19 README.md
-rw-rw-r-- 1 capistrano capistrano 1063 Jan 27 01:19 LICENSE
-rwxrwxr-x 1 capistrano capistrano  357 Jan 27 01:19 install.sh
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 01:19 bin
drwxrwxr-x 5 capistrano capistrano 4096 Jan 27 01:19 test
drwxrwxr-x 8 capistrano capistrano 4096 Jan 27 01:19 .git
drwxrwxr-x 7 capistrano capistrano 4096 Jan 27 01:19 .
$
```

・capistranoユーザの.bash_profileにrbenvのパスと「rbenv init -」を設定する。

```
$ echo $SHELL
/bin/bash
$ cp -p /home/capistrano/.bash_profile /home/capistrano/.bash_profile.ORG
$ diff /home/capistrano/.bash_profile /home/capistrano/.bash_profile.ORG
$

$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$
```

```
$ vi /home/capistrano/.bash_profile
　(末尾の記述を変更します)
PATH=$PATH:$HOME/bin

export PATH
　↓
##### rbenv
export RBENV_ROOT="/home/capistrano/rbenv" 
export PATH="${RBENV_ROOT}/bin:${PATH}:$HOME/bin" 
eval "$(rbenv init -)" 
#####
```

・変更した/home/capistrano/.bash_profileを確認します。

```
$ diff /home/capistrano/.bash_profile /home/capistrano/.bash_profile.ORG
10,14c10,12
< ##### rbenv
< export RBENV_ROOT="/home/capistrano/rbenv"
< export PATH="${RBENV_ROOT}/bin:${PATH}:$HOME/bin"
< eval "$(rbenv init -)"
< #####
---
> PATH=$PATH:$HOME/bin
>
> export PATH
$
```

```
$ cat /home/capistrano/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

##### rbenv
export RBENV_ROOT="/home/capistrano/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}:$HOME/bin"
eval "$(rbenv init -)"
#####
$
```

・capistranoユーザに先ほど.bash_profileへ追加した設定を反映します。

```
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ source /home/capistrano/.bash_profile
$
```

・念の為、capistranoユーザでログインし直します。

```
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ exit
# id
uid=0(root) gid=0(root) groups=0(root)
# su - capistrano
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$
```

・/home/capistrano/rbenv/shimsと/home/capistrano/rbenv/versionsディレクトリ作成確認。

先ほど.bash_profileに設定した「rbenv init -」により/home/capistrano/rbenv/shimsディレクトリが作成されている事を確認します。

この段階では、以下のように空ディレクトリだけ作成されていれば問題ありません。

```
$ ls -lrta /home/capistrano/rbenv/shims
total 8
drwxrwxr-x 12 capistrano capistrano 4096 Jan 27 01:34 ..
drwxrwxr-x  2 capistrano capistrano 4096 Jan 27 01:42 .
$

$ ls -lrta /home/capistrano/rbenv/versions
total 8
drwxrwxr-x 12 capistrano capistrano 4096 Jan 27 01:34 ..
drwxrwxr-x  2 capistrano capistrano 4096 Jan 27 01:34 .
$
```

capistrano3サーバ構築手順 (capistranoユーザでrbenvによりRuby 2.2.0をインストールする)
===

・インストール可能なRubyのバージョンを表示します。

```
$ hostname
example-capistrano-server
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ pwd
/home/capistrano
$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
　　(途中省略)
  2.2.0-dev
  2.2.0-preview1
  2.2.0-preview2
  2.2.0-rc1
  2.2.0
  rbx-2.2.0
　　(途中省略)
```

・capistranoユーザでrbenvによりRuby 2.2.0をインストールします。

今回の例ではrbenvによりRuby 2.2.0をインストールします。/home/capistrano配下にインストールします。

以下のコマンドを実行すると、/home/capistrano/rbenv/versions/2.2.0にインストールされます。

```
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ pwd
/home/capistrano
$ rbenv ruby -v
rbenv: no such command `ruby'
$ rbenv versions
* system (set by /home/capistrano/rbenv/version)
$

$ rbenv install 2.2.0
Downloading ruby-2.2.0.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/7671e394abfb5d262fbcd3b27a71bf78737c7e9347fa21c39e58b0bb9c4840fc
Installing ruby-2.2.0...
Installed ruby-2.2.0 to /home/capistrano/rbenv/versions/2.2.0

$
```

・rehashします。

```
$ rbenv rehash
$
```

・rbenvでRuby 2.2.0がインストールされた事を確認します。

```
$ ls -lrta /home/capistrano/rbenv/versions/2.2.0/
total 24
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 01:50 ..
drwxr-xr-x 4 capistrano capistrano 4096 Jan 27 01:56 lib
drwxr-xr-x 2 capistrano capistrano 4096 Jan 27 01:56 bin
drwxr-xr-x 3 capistrano capistrano 4096 Jan 27 01:56 include
drwxr-xr-x 6 capistrano capistrano 4096 Jan 27 01:56 .
drwxr-xr-x 5 capistrano capistrano 4096 Jan 27 01:56 share
$
```

・rbenvでインストールしたRuby 2.2.0を利用するようにします。

```
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ pwd
/home/capistrano
$ ruby -v
ruby 2.0.0p598 (2014-11-13 revision 48408) [x86_64-linux]
$

$ rbenv version
system (set by /home/capistrano/rbenv/version)
$
```

```
$ rbenv global 2.2.0
$
```

```
$ ruby -v
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]
$

$ rbenv version
2.2.0 (set by /home/capistrano/rbenv/version)
$
```

capistrano3サーバ構築手順 (capistranoユーザでBundlerをインストールする)
===

・Ruby Gem Bundlerをインストールします。

```
$ exit
logout
# su - capistrano
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$
```

```
$ pwd
/home/capistrano
$ rbenv exec gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)
$
```

```
$ rbenv exec gem install bundler
Fetching: bundler-1.7.12.gem (100%)
Successfully installed bundler-1.7.12
Parsing documentation for bundler-1.7.12
Installing ri documentation for bundler-1.7.12
Done installing documentation for bundler after 2 seconds
1 gem installed
$
```

```
$ rbenv exec gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
bundler (1.7.12)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)
$
```

・Ruby Gem Bundlerがインストールされた事を確認します。

```
$ pwd
/home/capistrano
$ rbenv rehash
$

$ rbenv exec gem which bundler
/home/capistrano/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/bundler-1.7.12/lib/bundler.rb
$
```

capistrano3サーバ構築手順 (capistranoユーザでcapistrano3をインストールする)
===

・capistranoユーザでcapistrano3インストール先の/home/capistrano/capistranoディレクトリを作成します。

```
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ pwd
/home/capistrano
$

$ ll /home/capistrano/capistrano
ls: cannot access /home/capistrano/capistrano: No such file or directory
$

$ mkdir /home/capistrano/capistrano
$

$ ll /home/capistrano/capistrano
total 0
$
```

・/home/capistrano/capistrano/Gemfileを作成します。

```
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ cd /home/capistrano/capistrano
$ pwd
/home/capistrano/capistrano
$
```

```
$ rbenv exec bundle init
Writing new Gemfile to /home/capistrano/capistrano/Gemfile
$
```

```
$ ls -lrta /home/capistrano/capistrano/
total 12
drwx------ 6 capistrano capistrano 4096 Jan 27 02:13 ..
-rw-r--r-- 1 capistrano capistrano   64 Jan 27 02:13 Gemfile
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 02:13 .
$
$ cat /home/capistrano/capistrano/Gemfile
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
$

$ pwd
/home/capistrano/capistrano
$ rbenv exec gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
bundler (1.7.12)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)
$
```

```
$ cp -p /home/capistrano/capistrano/Gemfile /home/capistrano/capistrano/Gemfile.ORG
$ diff /home/capistrano/capistrano/Gemfile /home/capistrano/capistrano/Gemfile.ORG
$
$ echo "gem 'capistrano'" >> /home/capistrano/capistrano/Gemfile
$
$ diff /home/capistrano/capistrano/Gemfile /home/capistrano/capistrano/Gemfile.ORG
5d4
< gem 'capistrano'
$
```

```
$ cat /home/capistrano/capistrano/Gemfile
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
gem 'capistrano'
$
```

・capistranoユーザで/home/capistrano/capistrano配下にcapistrano3をインストールします。

```
$ pwd
/home/capistrano/capistrano
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$

$ bundle install
Fetching gem metadata from https://rubygems.org/.......
Resolving dependencies...
Using rake 10.4.2
Installing capistrano-stats 1.1.1
Installing i18n 0.7.0
Installing colorize 0.7.5
Installing net-ssh 2.9.2
Installing net-scp 1.2.1
Installing sshkit 1.6.1
Installing capistrano 3.3.5
Using bundler 1.7.12
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from capistrano-stats:
    Capistrano will ask you the next time you run it if you would like to share
    anonymous usage statistics with the maintainance team to help guide our
    development efforts. We emplore you to opt-in, but we understand if your
    privacy is important to you in this regard.
Post-install message from capistrano:
Capistrano 3.1 has some breaking changes. Please check the CHANGELOG: http://goo.gl/SxB0lr

If you're upgrading Capistrano from 2.x, we recommend to read the upgrade guide: http://goo.gl/4536kB

The `deploy:restart` hook for passenger applications is now in a separate gem called capistrano-passenger.  Just add it to your Gemfile and require it in your Capfile.
$
```

・capistrano3がインストールされた事を確認します。

```
$ ls -lrta /home/capistrano/capistrano/
total 20
drwx------ 6 capistrano capistrano 4096 Jan 27 02:13 ..
-rw-r--r-- 1 capistrano capistrano   64 Jan 27 02:13 Gemfile.ORG
-rw-r--r-- 1 capistrano capistrano   81 Jan 27 02:14 Gemfile
-rw-rw-r-- 1 capistrano capistrano  448 Jan 27 02:15 Gemfile.lock
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 02:15 .
$

$ pwd
/home/capistrano/capistrano
$ rbenv exec gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
bundler (1.7.12)
capistrano (3.3.5)
capistrano-stats (1.1.1)
colorize (0.7.5)
i18n (0.7.0)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
net-scp (1.2.1)
net-ssh (2.9.2)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
sshkit (1.6.1)
test-unit (3.0.8)
$
```

capistrano3サーバ構築手順 (capistranoユーザでcap installを実行してcapistrano3設定ファイル類を生成する)
===

・cap installコマンドを実行し、capistrano3の設定ファイル類を生成する。

```
$ hostname
example-capistrano-server
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ pwd
/home/capistrano/capistrano
$ ls -lrta /home/capistrano/capistrano/
total 20
drwx------ 6 capistrano capistrano 4096 Jan 27 02:13 ..
-rw-r--r-- 1 capistrano capistrano   64 Jan 27 02:13 Gemfile.ORG
-rw-r--r-- 1 capistrano capistrano   81 Jan 27 02:14 Gemfile
-rw-rw-r-- 1 capistrano capistrano  448 Jan 27 02:15 Gemfile.lock
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 02:15 .
$
```

```
$ cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified
$
```

capistrano3サーバ構築手順 (capistrano3設定ファイル類の生成確認)
===

・先ほど実行したcap installコマンドにより、以下のようなcapistrano3用の設定ファイル類が生成されている事を確認します。

```
$ ls -lrta /home/capistrano/capistrano/
total 32
drwx------ 6 capistrano capistrano 4096 Jan 27 02:13 ..
-rw-r--r-- 1 capistrano capistrano   64 Jan 27 02:13 Gemfile.ORG
-rw-r--r-- 1 capistrano capistrano   81 Jan 27 02:14 Gemfile
-rw-rw-r-- 1 capistrano capistrano  448 Jan 27 02:15 Gemfile.lock
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 config
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 lib
-rw-r--r-- 1 capistrano capistrano  837 Jan 27 02:25 Capfile
drwxrwxr-x 4 capistrano capistrano 4096 Jan 27 02:25 .
$

$ ls -lrta /home/capistrano/capistrano/config/
total 16
-rw-rw-r-- 1 capistrano capistrano 1275 Jan 27 02:25 deploy.rb
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 .
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 02:25 deploy
drwxrwxr-x 4 capistrano capistrano 4096 Jan 27 02:25 ..
$

$ ls -lrta /home/capistrano/capistrano/config/deploy
total 16
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 ..
-rw-rw-r-- 1 capistrano capistrano 1459 Jan 27 02:25 staging.rb
-rw-rw-r-- 1 capistrano capistrano 1459 Jan 27 02:25 production.rb
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 02:25 .
$

$ ls -lrta /home/capistrano/capistrano/lib/
total 12
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 capistrano
drwxrwxr-x 4 capistrano capistrano 4096 Jan 27 02:25 ..
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 .
$

$ ls -lrta /home/capistrano/capistrano/lib/capistrano/
total 12
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 02:25 tasks
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 ..
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 .
$

$ ls -lrta /home/capistrano/capistrano/lib/capistrano/tasks/
total 8
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 ..
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 02:25 .
$
```

capistrano3サーバ構築手順 (capistrano3のインストール確認)
===

・capistrano3が/home/capistrano/capistrano配下にインストールされた事を確認します。以下のように表示されていれば、capistrano3のインストール自体は完了です。capistrano3のタスク追加については後述致します。

```
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ exit
logout
# id
uid=0(root) gid=0(root) groups=0(root)
# su - capistrano

$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$
$ cd /home/capistrano/capistrano/
$ pwd
/home/capistrano/capistrano
$
```

・cap -Vコマンドを実行して、capistranoのバージョンが表示される事を確認します。

```
$ pwd
/home/capistrano/capistrano
$ cap -V
Capistrano Version: 3.3.5 (Rake Version: 10.4.2)
$
```

・cap -Tコマンドを実行して、capistranoのタスク一覧が表示される事を確認します。

```
$ pwd
/home/capistrano/capistrano
$ cap -T
cap deploy                         # Deploy a new release
cap deploy:check                   # Check required files and directories exist
cap deploy:check:directories       # Check shared and release directories exist
cap deploy:check:linked_dirs       # Check directories to be linked exist in shared
cap deploy:check:linked_files      # Check files to be linked exist in shared
cap deploy:check:make_linked_dirs  # Check directories of files to be linked exist in shared
cap deploy:cleanup                 # Clean up old releases
cap deploy:cleanup_rollback        # Remove and archive rolled-back release
cap deploy:finished                # Finished
cap deploy:finishing               # Finish the deployment, clean up server(s)
cap deploy:finishing_rollback      # Finish the rollback, clean up server(s)
cap deploy:log_revision            # Log details of the deploy
cap deploy:published               # Published
cap deploy:publishing              # Publish the release
cap deploy:revert_release          # Revert to previous release timestamp
cap deploy:reverted                # Reverted
cap deploy:reverting               # Revert server(s) to previous release
cap deploy:rollback                # Rollback to previous release
cap deploy:set_current_revision    # Place a REVISION file with the current revision SHA in the current release path
cap deploy:started                 # Started
cap deploy:starting                # Start a deployment, make sure server(s) ready
cap deploy:symlink:linked_dirs     # Symlink linked directories
cap deploy:symlink:linked_files    # Symlink linked files
cap deploy:symlink:release         # Symlink release to current
cap deploy:symlink:shared          # Symlink files and directories from shared to release
cap deploy:updated                 # Updated
cap deploy:updating                # Update server(s) by setting up a new release
cap install                        # Install Capistrano, cap install STAGES=staging,production
$
```

capistrano3インストール直後の初期設定 (config/deploy.rb)
===

・/home/capistrano/capistrano/config/deploy.rbの初期設定を行います。

```
$ pwd
/home/capistrano/capistrano
$ cp -p /home/capistrano/capistrano/config/deploy.rb /home/capistrano/capistrano/config/deploy.rb.ORG
$ diff /home/capistrano/capistrano/config/deploy.rb /home/capistrano/capistrano/config/deploy.rb.ORG
$
```

```
$ vi /home/capistrano/capistrano/config/deploy.rb
　(中身を全部消して、以下の記述だけに変更します)

　　↓

#####
# config valid only for current version of Capistrano
lock '3.3.5'
set :pty, true
#####
```

```
$ cat /home/capistrano/capistrano/config/deploy.rb
#####
## config valid only for current version of Capistrano
lock '3.3.5'
set :pty, true
######
$
```

capistrano3インストール直後の初期設定 (config/deploy/develop.rb capistrano3サーバからssh接続する設定ファイル変更対象サーバを記述する)
===

・/home/capistrano/capistrano/config/deploy/develop.rbを作成します。

capistrano3サーバからssh接続する設定ファイル変更対象サーバを記述します。

今回の例ではcapistrano3サーバからssh接続して設定ファイルを変更するサーバは以下のIPアドレスだとします。
　198.51.100.10
capistranoサーバから198.51.100.10へssh接続する場合のユーザ名はexampleとします。

```
$ ll /home/capistrano/capistrano/config/deploy/develop.rb
ls: cannot access /home/capistrano/capistrano/config/deploy/develop.rb: No such file or directory
$
```

以下のような設定をdevelop.rbに記述します。
198.51.100.10サーバへのexampleユーザ追加は後述致します。

```
$ vi /home/capistrano/capistrano/config/deploy/develop.rb
role :web, %w{example@198.51.100.10}
```

```
$ cat /home/capistrano/capistrano/config/deploy/develop.rb
role :web, %w{capistrano@198.51.100.10}
$

$ ll /home/capistrano/capistrano/config/deploy/develop.rb
-rw-rw-r-- 1 capistrano capistrano 80 Jan 27 02:53 /home/capistrano/capistrano/config/deploy/develop.rb
$
```

capistrano3インストール直後の初期設定 (Capfile)
===

・/home/capistrano/capistrano/Capfileの確認。

今回の例ではとりあえず初期設定のまま変更せずに進めます。

```
$ cat /home/capistrano/capistrano/Capfile
# Load DSL and set up stages
require 'capistrano/setup'

# Include default deployment tasks
require 'capistrano/deploy'

# Include tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails
#   https://github.com/capistrano/passenger
#
# require 'capistrano/rvm'
# require 'capistrano/rbenv'
# require 'capistrano/chruby'
# require 'capistrano/bundler'
# require 'capistrano/rails/assets'
# require 'capistrano/rails/migrations'
# require 'capistrano/passenger'

# Load custom tasks from `lib/capistrano/tasks' if you have any defined
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
$
```

capistrano3のタスク追加手順
===

・capistrano3サーバへのcapistrano3インストール後、capistranoのタスクを追加する手順について記載致します。

・/home/capistrano/capistrano/lib/capistrano/tasks/utils.rakeを作成し、capistranoのタスクを追加します。

先ほど記載した「example@198.51.100.10」サーバへssh接続して、実行させたいコマンドをタスクとして追加します。

```
$ ls -lrta /home/capistrano/capistrano/lib/capistrano/tasks/
total 8
drwxrwxr-x 3 capistrano capistrano 4096 Jan 27 02:25 ..
drwxrwxr-x 2 capistrano capistrano 4096 Jan 27 02:25 .
$
```

タスクを定義するrakeファイルを作成します。

```
$ vi /home/capistrano/capistrano/lib/capistrano/tasks/utils.rake
```

```rb:utils.rake
namespace :hosts_file_utils do
  task :show_hosts_file do
    on roles(:web) do
      execute "cat /etc/hosts"
    end
  end
  task :backup_hosts_file do
    on roles(:web) do
      execute "sudo -u root cp -p /etc/hosts /etc/hosts.`date '+%Y%m%d_%H%M%S'`"
    end
  end
  task :change_hosts_file do
    on roles(:web) do
      execute "sudo -u root cp -p /etc/hosts /etc/hosts.`date '+%Y%m%d_%H%M%S'`"
      execute "sudo -u root sed -i -e 's/^192.51.100.100 old-example-server/192.51.100.220 new-example-server/' /etc/hosts"
    end
  end
end
```

rakeファイルに保存した内容を確認します。

```
[capistrano@example-capistrano-server ~]$ cat /home/capistrano/capistrano/lib/capistrano/tasks/utils.rake
namespace :hosts_file_utils do
  task :show_hosts_file do
    on roles(:web) do
      execute "cat /etc/hosts"
    end
  end
  task :backup_hosts_file do
    on roles(:web) do
      execute "sudo -u root cp -p /etc/hosts /etc/hosts.`date '+%Y%m%d_%H%M%S'`"
    end
  end
  task :change_hosts_file do
    on roles(:web) do
      execute "sudo -u root cp -p /etc/hosts /etc/hosts.`date '+%Y%m%d_%H%M%S'`"
      execute "sudo -u root sed -i -e 's/^192.51.100.100 old-example-server/192.51.100.220 new-example-server/' /etc/hosts"
    end
  end
end
[capistrano@example-capistrano-server ~]$
```

rakeファイルのパーミッションは以下のようなものになっていれば問題ありません。

```
[capistrano@example-capistrano-server ~]$ ll /home/capistrano/capistrano/lib/capistrano/tasks/utils.rake
-rw-rw-r-- 1 capistrano capistrano 548 Jan 27 04:02 /home/capistrano/capistrano/lib/capistrano/tasks/utils.rake
[capistrano@example-capistrano-server ~]$
```

capistrano3サーバにssh接続先サーバへ接続する為の公開鍵と秘密鍵を作成する
===

今回の例ではcapistrano3サーバから198.51.100.10サーバに対して、sshログイン出来るようにします。

capistrano3サーバでcapistranoユーザの公開鍵と秘密鍵を作成します。

```
$ hostname
example-capistrano-server
$ id
uid=XXXXX(capistrano) gid=XXXXX(capistrano) groups=XXXXX(capistrano)
$ pwd
/home/capistrano

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/capistrano/.ssh/id_rsa):
Created directory '/home/capistrano/.ssh'.
Enter passphrase (empty for no passphrase):　→　今回は例なのでパスフレーズを入力せずEnterキー押下。

$ ll /home/capistrano/.ssh/
total 8
-rw------- 1 capistrano capistrano 1679 Jan 27 03:16 id_rsa
-rw-r--r-- 1 capistrano capistrano  418 Jan 27 03:16 id_rsa.pub
$
```

・公開鍵の情報を確認します。

```
$ cat /home/capistrano/.ssh/id_rsa.pub
ssh-rsa AAAA******** (公開鍵の文字列) ***********capistrano@example-capistrano-server
$
```

ssh接続先サーバにsshログイン用ユーザ作成 + capistranoユーザの公開鍵を/home/example/.ssh/authorized_keysに追加
===

今回の例ではcapistrano3サーバからのssh接続先サーバ、198.51.100.10にexampleユーザを追加します。

```
198.51.100.10にrootユーザでログインします。
[root@not-aws-vpc-server-198-51-100-10 ~]# cp -p /etc/passwd /etc/passwd.ORG
[root@not-aws-vpc-server-198-51-100-10 ~]# cp -p /etc/shadow /etc/shadow.ORG
[root@not-aws-vpc-server-198-51-100-10 ~]# cp -p /etc/group /etc/group.ORG
[root@not-aws-vpc-server-198-51-100-10 ~]#

[root@not-aws-vpc-server-198-51-100-10 ~]# groupadd example
[root@not-aws-vpc-server-198-51-100-10 ~]# useradd -s /bin/bash -d /home/example -g example example
[root@not-aws-vpc-server-198-51-100-10 ~]#

[root@not-aws-vpc-server-198-51-100-10 ~]# su - example
[example@not-aws-vpc-server-198-51-100-10 ~]$ id
uid=XXX(example) gid=XXX(example) groups=XXX(example) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[example@not-aws-vpc-server-198-51-100-10 ~]$
```

```
[example@not-aws-vpc-server-198-51-100-10 ~]$ mkdir /home/example/.ssh
[example@not-aws-vpc-server-198-51-100-10 ~]$ chmod 700 /home/example/.ssh
[example@not-aws-vpc-server-198-51-100-10 ~]$
```

```
[example@not-aws-vpc-server-198-51-100-10 ~]$ echo "ssh-rsa AAAA******** (先ほど作成したcapistrano3サーバの/home/capistrano/.ssh/id_rsa.pubの公開鍵の内容を貼り付ける) ********capistrano@example-capistrano-server" >> /home/example/.ssh/authorized_keys
[example@not-aws-vpc-server-198-51-100-10 ~]$
```

```
[example@not-aws-vpc-server-198-51-100-10 ~]$ chmod 600 /home/example/.ssh/authorized_keys
[example@not-aws-vpc-server-198-51-100-10 ~]$
[example@not-aws-vpc-server-198-51-100-10 ~]$ ll /home/example/.ssh/authorized_keys
-rw-------. 1 example example 418 Jan 26 18:27 /home/example/.ssh/authorized_keys
[example@not-aws-vpc-server-198-51-100-10 ~]$
```

・capistrano3サーバからexampleユーザでssh経由で接続した時、root権限が必要な設定ファイルを変更出来るようsudo権限追加。

※今回は例なのでsudoで強い権限を渡しておりますが、実運用の際には、sudoで実行可能なコマンドを絞るなどの対応が必要かもしれません。

```
[root@not-aws-vpc-server-198-51-100-10 ~]# cp -p /etc/sudoers /etc/sudoers.ORG
[root@not-aws-vpc-server-198-51-100-10 ~]# diff /etc/sudoers /etc/sudoers.ORG
[root@not-aws-vpc-server-198-51-100-10 ~]#
```

```
[root@not-aws-vpc-server-198-51-100-10 ~]# visudo
　(末尾に以下の設定を追加)

User_Alias  CAPISTRANO_USER    = example
CAPISTRANO_USER      ALL = (root) NOPASSWD: ALL
```

```
[root@not-aws-vpc-server-198-51-100-10 ~]# diff /etc/sudoers /etc/sudoers.ORG
119,121d118
<
< User_Alias  CAPISTRANO_USER    = example
< CAPISTRANO_USER      ALL = (root) NOPASSWD: ALL
[root@not-aws-vpc-server-198-51-100-10 ~]#
```

・capistrano3サーバから「example@198.51.100.10」でsshログイン出来る事を確認。

```
[capistrano@example-capistrano-server ~]$ id
uid=11050(capistrano) gid=11050(capistrano) groups=11050(capistrano)
[capistrano@example-capistrano-server ~]$ ssh example@198.51.100.10

[example@not-aws-vpc-server-198-51-100-10 ~]$ sudo su -
[root@not-aws-vpc-server-198-51-100-10 ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@not-aws-vpc-server-198-51-100-10 ~]#

[root@not-aws-vpc-server-198-51-100-10 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.51.100.100 old-example-server
[root@not-aws-vpc-server-198-51-100-10 ~]#
```

capistrano3サーバでタスクを実行してssh経由で設定ファイル変更対象サーバの設定ファイルを変更できるかテスト
===

capistrano3サーバでタスク実行する前の変更前の状態です。

```
[root@not-aws-vpc-server-198-51-100-10 ~]# hostname
ip-172-31-1-134
[root@not-aws-vpc-server-198-51-100-10 ~]# ll /etc/hosts*
-rw-r--r--. 1 root root 193 Jan 26 18:55 /etc/hosts
-rw-r--r--. 1 root root 370 Jan 12  2010 /etc/hosts.allow
-rw-r--r--. 1 root root 460 Jan 12  2010 /etc/hosts.deny
-rw-r--r--. 1 root root 158 Jan 12  2010 /etc/hosts.ORG
[root@not-aws-vpc-server-198-51-100-10 ~]#

[root@not-aws-vpc-server-198-51-100-10 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.51.100.100 old-example-server
[root@not-aws-vpc-server-198-51-100-10 ~]#
```

・capistrano3サーバでリモートサーバ(198.51.100.10)の/etc/hosts内容を表示するタスクを実行します。

```
[root@example-capistrano-server ~]# hostname
example-capistrano-server
[root@example-capistrano-server ~]# su - capistrano
Last login: Tue Jan 27 03:47:52 JST 2015 on pts/1
[capistrano@example-capistrano-server ~]$ id
uid=11050(capistrano) gid=11050(capistrano) groups=11050(capistrano)
[capistrano@example-capistrano-server ~]$ cd /home/capistrano/capistrano/
[capistrano@example-capistrano-server capistrano]$ pwd
/home/capistrano/capistrano
[capistrano@example-capistrano-server capistrano]$
```

```
[capistrano@example-capistrano-server capistrano]$ bundle exec cap develop hosts_file_utils:show_hosts_file
INFO [bb1a5f59] Running /usr/bin/env cat /etc/hosts as example@192.51.100.10
DEBUG [bb1a5f59] Command: cat /etc/hosts
DEBUG [bb1a5f59]        127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
DEBUG [bb1a5f59]        ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
DEBUG [bb1a5f59]
DEBUG [bb1a5f59]        192.51.100.100 old-example-server
INFO [bb1a5f59] Finished in 0.334 seconds with exit status 0 (successful).
[capistrano@example-capistrano-server capistrano]$
```

・capistrano3サーバでリモートサーバ(198.51.100.10)の/etc/hostsをバックアップするタスクを実行します。

```
[capistrano@example-capistrano-server capistrano]$ bundle exec cap develop hosts_file_utils:backup_hosts_file
INFO [2edd70cd] Running /usr/bin/env sudo -u root cp -p /etc/hosts /etc/hosts.`date '+%Y%m%d_%H%M%S'` as example@192.51.100.10
DEBUG [2edd70cd] Command: sudo -u root cp -p /etc/hosts /etc/hosts.`date '+%Y%m%d_%H%M%S'`
INFO [2edd70cd] Finished in 0.460 seconds with exit status 0 (successful).
[capistrano@example-capistrano-server capistrano]$
```

・capistrano3サーバでリモートサーバ(198.51.100.10)の/etc/hosts内容を変更するタスクを実行します。


```
[capistrano@example-capistrano-server capistrano]$ id
uid=11050(capistrano) gid=11050(capistrano) groups=11050(capistrano)
[capistrano@example-capistrano-server capistrano]$ pwd
/home/capistrano/capistrano
[capistrano@example-capistrano-server capistrano]$ bundle exec cap develop hosts_file_utils:change_hosts_file
INFO [88227421] Running /usr/bin/env sudo -u root cp -p /etc/hosts /etc/hosts.`date '+%Y%m%d_%H%M%S'` as example@192.51.100.10
DEBUG [88227421] Command: sudo -u root cp -p /etc/hosts /etc/hosts.`date '+%Y%m%d_%H%M%S'`
INFO [88227421] Finished in 0.408 seconds with exit status 0 (successful).
INFO [edf52807] Running /usr/bin/env sudo -u root sed -i -e 's/^192.51.100.100 old-example-server/192.51.100.220 new-example-server/' /etc/hosts as example@192.51.100.10
DEBUG [edf52807] Command: sudo -u root sed -i -e 's/^192.51.100.100 old-example-server/192.51.100.220 new-example-server/' /etc/hosts
INFO [edf52807] Finished in 0.047 seconds with exit status 0 (successful).
[capistrano@example-capistrano-server capistrano]$
```

・capistrano3サーバで実行したタスクの動作確認。

capistrano3サーバで実行したタスクにより、ssh接続先サーバ(192.51.100.220)の/etc/hostsが変更された事を確認します。/etc/hostsの内容が以下に変更された事を確認します。
192.51.100.100 old-example-server　→　192.51.100.220 new-example-server

/etc/hosts変更前のバックアップファイル(/etc/hosts.20150127_042209)が作成されている事も確認します。

```
[root@not-aws-vpc-server-198-51-100-10 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.51.100.220 new-example-server
[root@not-aws-vpc-server-198-51-100-10 ~]#
```

```
[root@not-aws-vpc-server-198-51-100-10 ~]# ls -lrta /etc/hosts*
-rw-r--r--. 1 root root 158 Jan 12  2010 /etc/hosts.ORG
-rw-r--r--. 1 root root 460 Jan 12  2010 /etc/hosts.deny
-rw-r--r--. 1 root root 370 Jan 12  2010 /etc/hosts.allow
-rw-r--r--. 1 root root 193 Jan 27 04:19 /etc/hosts.20150127_042209
-rw-r--r--. 1 root root 193 Jan 27 04:19 /etc/hosts.20150127_042127
-rw-r--r--. 1 root root 193 Jan 27 04:22 /etc/hosts
[root@not-aws-vpc-server-198-51-100-10 ~]#
[root@not-aws-vpc-server-198-51-100-10 ~]# diff /etc/hosts /etc/hosts.20150127_042209
4c4
< 192.51.100.220 new-example-server
---
> 192.51.100.100 old-example-server
[root@not-aws-vpc-server-198-51-100-10 ~]#
```

長くなりましたが、以上になります。