1、capistrano的安装

capistrano 是通过 Ruby 的软件包管理工具 RubyGames 来安装的。首先,请确认 RubyGames 是否安装。Rubygems没有安装的话再确认ruby是否安装。如果都没有安装,接下来先安装ruby。

wget http://218.29.54.43:82/down/ruby-1.9.2-p0.tar.bz2
tar -xvjf ruby-1.9.2-p0.tar.bz2
cd ruby-1.9.2-p0
./configure
make
make install

接着安装Rubygems
wget http://files.rubyforge.vm.bytemark.co.uk/rubygems/rubygems-1.8.9.tgz
tar -xvzf rubygems-1.8.9.tgz
cd rubygems-1.8.9
/usr/local/bin/ruby setup.rb

如果是旧版本可以对gem进行更新:
gem update --system

可以查看gem安装的软件:
gem list

 

查看gem是否安装了capistrno:
gem list capistrano 

如果没有安装此capistrano,最后用rubygems安装capistrano。
gem install Capistrano

 安装完之后可以用cap命令来检查 Capistrano 的版本。 
cap -version或者cap -V

2、capistrano的使用
Capistrano工作过程:capistrano服务器在工作中以svn客户端的身份,在本地执行svn checkout -q --username admin --password 123456 --no-auth-cache -r2 http://192.168.0.235:8080/svn/product002 /tmp/***********这个命令,把svn的服务端的值下载到本地的/tmp目录下边,然后对下载下来的目录进行打压缩,用sftp协议把数据传送到web服务器的/tmp/目录下边,然后解压缩到配置文件指定的目录下边。然后删除原来的current的软连接,建立新的链接指向新的目录文件。

有上边介绍可知,capistrano并非一定要和svn服务器在一台机器上边。下边来介绍capistrano的使用。

 

准备工作加配置:
先建立一个目录,最好和要发布的项目的名称一样,这样操作比较规划点。

mkdir /capistrano/product001
cd /Capistrano/product001
capify .

 命令执行完毕后你将会看到目录下生成一个Capfile文件和一个config文件夹。config下面包含有一个deploy.rb的文件,Capfile 的内容基本上不改。在config下的文件deploy.rb是capistrano的主配置文件。修改如下:

vim config/deploy.rb
1 set :application, "product002"
2 set :repository, "http://192.168.0.235:8080/svn/product001"
3
4 set :scm, :subversion
5 set :scm_username, 'admin'
6 set :scm_password, '123456'
7 set :checkout, "export"

9 role :web, "192.168.0.236"
10 #role :web, "192.168.0.234"
11 #role :app, "your app-server here"
12 #role :db, "your primary db-server here", :primary => true
13 #role :db, "your slave db-server here"
14 set :deploy_to, "/home/product001"
15 set :deploy_via, :copy
16
17 #set :user, "admin"
18 #set :runner, "admin"
19 #set :password, "123456"
20 #set :use_sudo, true
21
22 set :keep_releases, 3
23 #namespace :deploy do
24 # task :restart, :roles => :web do
25 # run "sudo chmod -R 775 /home/aaa/releases"
26 # end
27 #end

        第1行写项目名称,第2行写仓库地址,本实验是用的svn,可以用svn协议可以用http协议连接,用svn的时候svn服务端要打开。第4行写用的什么做仓库,可以用git还有其他的。第5-7行写svn的账户密码,还有svn客户端执行的方式。如果第2行填的是http协议的话,应该写http的账户密码。第9-13定义了要发布产品的服务器地址。14行指定了要发不到客户端的目录。17-20行指定了本地服务器以什么用户登陆到web服务器上进行操作,可以用普通用户,但是每个web服务器都要有这个普通账户,并且密码要一样,还要给这个账户设置好sudo权限。也可以用root账户,因为各个web服务器的root密码不可能一样,所有可以用ssh公钥,这个在最后介绍。第22行设置了capistrano存储的版本库的个数,在用cap deploy:cleanup清理旧的版本库的时候,这个决定了清理完之后还有几个版本库,默认是5个。第23-27是指定了capistrano在执行cap deploy(star|restart|stop)的时候在web服务器上执行的命令。

注意:
配置完之后要在客户端上设置,主要是设置sudo的配置文件:

vim /etc/sudoers
#Defaults requiretty 这一行要给注释掉。
不然一直报没有sudo权限,解释用root用户也是一样。

发布产品:

第一次部署的时候首先:cd /capistrano/product001
cap deploy:setup 
然后:cap deploy:check
最后:cap deploy

第一步主要是为了在web服务器上建立对应的树形目录:
执行完之后:
[root@bogon ~]#find /home/product001
/home/product001/releases
/home/product001/shared
/home/product001/shared/log
/home/product001/shared/system
/home/product001/shared/pids

第二步为了校验还有在发布产品之前,还有那些工作没有做好,需要设置。

第三步真正的开通用capistrano来发布产品。
Cap deploy缺省支持的命令还有:
disable_web:生成maintenance.html,你的系统需要能够自检测这个文件
enable_web:删除maintenance.html。
update_code:和版本管理器做代码同步。
rollback_code:如果部署完发现有问题,可以用这个命令换回上一个。
restart:重启,主要针对的namespace定义的重启shell脚本来,其实就是调用了reaper。
migrate:在服务器端运行rake RAILS_ENV=#{rails_env} migrate。
symlink:使current软连接指向最新的update_codedeploy:其实就是update_code+symlink+restart。
deploy_with_migrations:update_code+migrate+symlink+restart
rollback:rollback_code + restart。

普通用户发布产品:需要将svn目录下的内容都变成那个普通用户,不然没有权限

旧版本清除:
      反复执行 deploy:update 任务的话,会在目标主机上堆积旧的源代码。因为浪费磁盘空间,所以希望留下几代,剩下的都从最新版清除。
这时候,执行 deploy:cleanup 任务。
默认情况下清除后剩下 5 代左右的源代码。需要留下的代数可由 keep_releases 变量控制,所以在 config/deploy.rb 作如下书写的话,留下 3 代的源代码。
set :keep_releases, 3

ssh公钥配置:
配置文件中用到ssh公钥配置的时候,要先把下边的几行注释掉
删除deploy.rb中的:
17 #set :user, "admin"
18 #set :runner, "admin"
19 #set :password, "123456"
20 #set :use_sudo, true

登录A机器(Capistrano服务端) :执行ssh-keygen命令 生成密钥文件id_rsa,id_rsa.pub
将id_rsa.pub 拷贝到被登录主机B(被部署端,web服务器) 

登录B主机将id_rsa.pub写入到~/.ssh/authorized_keys
cat id_rsa.pub >> ~/.ssh/authorized_keys
有时候被部署端没有没有~/.ssh这个目录,要手工建立.ssh目录和authorized_keys这个文件。

在主机A执行 ssh B
需要输入rsa密码:

登录主机A执行
ssh-agent bash
ssh-add
Enter passphrase for /root/.ssh/id_rsa: 这个地方要重新输入密码

再次试登录主机B这个时候应该是不用密码的,依次将id_rsa.pub文件写到多台被部署机器的 ~/.ssh/authorized_keys中即可

 

关于cap的命令介绍
cap -vT 查看cap支持的命令
cap <some task> 可以跟deploy:**
cap invoke COMMAND=“uptime” 在远程服务器上执行单一的命令。
cap invoke COMMAND= “uptime” ROLES=sa
cap invoke COMMAND= “uptime” HOSTS=www.it168.com
cap shell 开启一个交互式的capistrano会话。

关于目录下的public,可以再svn上建立public作为公共的文件夹,在更新的时候不报错,具体的作用还没有发现。