这一章将就使用 Capistrano 的前提条件之一的 SSH 公钥进行介绍。
因为以已经配置好生产服务器为前提,所以现在应该可以通过 SSH 登陆到生产服务器。但是是否已在生产服务器上设置好了 SSH 公钥了呢。如果还没有的话,现在开始操作吧。
另外,在 Windows 环境下 Capistrano 的安装方法将在下一章( 第3章 Windows 环境下的 Capistrano)中说明。

首先,创建一个SSH公钥。
% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kuroda/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/kuroda/.ssh/id_rsa.
Your public key has been saved in /home/kuroda/.ssh/id_rsa.pub.
The key fingerprint is:
a3:ed:8b:aa:6d:6c:92:16:70:6b:1d:51:3a:24:6f:b9 kuroda@desktop
接着,将此公钥复制到生产服务器上。生产服务器的域名设为 alpha.oiax.jp
% scp .ssh/id_rsa.pub alpha.oiax.jp:~
[email protected]'s password:
登陆生产服务器。说一下,今后在本地主机上操作时的提示符为 % ,而在远程机上的提示符用 $ 表示。
% ssh alpha.oiax.jp
Password:
首先创建 app 用户。
% sudo /usr/sbin/useradd -m app
这是部署及运行 Rails 应用程序的专有用户。如果此用户名已被使用,则可以选择如 rails 等其它的名字。另外虽然也可以使用开发者个人的账户(如 kuroda)来部署,但在多人开发的情况下,容易牵涉到文件权限的问题,因此建议设立专用的用户。
首先,在 ~/.ssh 设公钥。
$ mkdir -m 700 .ssh
$ cat id_rsa.pub >> .ssh/authorized_keys
接下来在 /home/app/.ssh 设公钥。
$ sudo -u app mkdir -m 700 /home/app/.ssh
$ sudo -u app touch /home/app/.ssh/authorized_keys
$ sudo sh -c "cat id_rsa.pub >> /home/app/.ssh/authorized_keys"
退出。
$ exit
想省去反复输入路径短语这个麻烦的人可在 ssh-agent 设置密钥。
% ssh-agent bash
% ssh-add
Enter passphrase for /home/kuroda/.ssh/id_rsa: 
Identity added: /home/kuroda/.ssh/id_rsa (/home/kuroda/.ssh/id_rsa)
使用公钥登陆到生产服务器。
% ssh alpha.oiax.jp
$ exit
登录时没被要求密码的话就OK了。
接下来,用 app 用户登录。
% ssh [email protected]
$ exit
这里应该不用输入密码也可以登陆。

那么,让我们来试试 Capistrano 吧。
在本地主机适当的目录下,创建一个包含下列内容的文本文件 Capfile 。不添加扩展名。另外,用 'kuroda' 指定远程主机上使用 SSH 登录的用户名,并且使用远程主机的实际名称置换 'alpha.oiax.jp'。
set :user, 'kuroda'
task :stamp, :hosts => "alpha.oiax.jp" do
  run "touch /home/kuroda/touched"
end
至此,便登陆到 alpha.oiax.jp 并定义了执行 touch /home/kuroda/touched 命令的任务 stamp 。Unix 命令的 touch 是为了更新文件的时间戳,如果没有文件的话请创建一个。
为了执行 stamp 任务,进入保存 Capfile 的目录,输入 cap stamp
% cap stamp
  * executing `stamp'
  * executing "touch /home/kuroda/touched"
    servers: ["alpha.oiax.jp"]
    [alpha.oiax.jp] executing command
    command finished
在生产服务器上确认结果。
$ pwd
/home/kuroda
$ la -l touched
-rw-r--r--  1 kuroda kuroda 5 Mar 24 22:58 touched
在执行 stamp 任务之前所不存在的 touched 文件产生了。