简介
capistrano是一个ruby语言写的代码自动部署工具。它的源代码在https://github.com/capistrano/capistrano。
作为一个自动部署工具,它的功能主要有:
1 可实现自动部署
2 通过ssh,可远程执行命令。
它与其他的自动部署工具不同之处有:
1和git /svn等版本控制工具亲和性高, 可实现自动代码拉取和回滚等功能。
推荐文档
https://github.com/stefanooldeman/capistrano-handbook/wiki
https://github.com/capistrano/capistrano/wiki
如何安装capistrano
sudo apt-get install ruby1.9.1 rubygems
sudo gem install capistrano -v 2.5.15
其实capistrano3 已经发布了, 但是其文档当前比较少,只有其官网http://capistranorb.com/上有一点点可怜的入门教程。
而capistrano2的文档则相对比较全, 推荐这个wiki
https://github.com/capistrano/capistrano/wiki
用gem安装的时候切换成国内的源会比较快
gem sources --remove http://rubygems.org/
gem sources -a http://ruby.taobao.org/
gem sources -l # 请确保只有 ruby.taobao.org
如果是debian用户需要在安装完gem之后运行:
export RUBYOPT=rubygems
不然在运行cap的时候会出错,并提示:
costa@pepsi :~/test/vines$ cap
/var/lib/gems/1.8/gems/capistrano-2.15.5/bin/cap:3:in `require': no such file to load -- capistrano/cli (LoadError)
from /var/lib/gems/1.8/gems/capistrano-2.15.5/bin/cap:3
Authentication权限的配置
部署项目首先需要有权限。
权限分为两种:
1 执行部署脚本的服务器需要有访问被部署的服务器的权限。 这部分是通过ssh协议实现的。
可以通过密码鉴权,也可以通过public key鉴权。
通过密码鉴权只需要配置:user 和 :password 这两个配置项。
不过今天我一直都不能配置直接用password登录成功,非常郁闷。
通过public key鉴权, 不需要配置password。
step 1: 生成并且配置好public key, 可参考http://www.ece.uci.edu/~chou/ssh-key.html
step 2: 在执行部署脚本的服务器上启动ssh-agent。并将private key加入ssh-agent管理。
exec ssh-agent bash
ssh-add <你的private key文件>
2 被部署的服务器访问代码服务器的权限。代码服务器指的是类似git svn这样的服务器。
代码服务器对外的服务接口有多种形式的实现。以git为例, 一般有ssh git http这3种协议。
ssh 协议上文已说过有两种方式鉴权。如果代码服务器与被部署的服务器接受同样的public key的话, 可以利用ssh的 agent forwarding的性质直接借用前一次的权限。
关于ssh agent forwarding的原理可以看这篇文章:
http://unixwiz.net/techtips/ssh-agent-forwarding.html
如果是git、http或者ssh采用用户名密码鉴权可以设置scm_username和scm_password这两个配置。
ssh的 public key鉴权方式不知道如何配置。
https的客户端证书鉴权方式不知道如何配置。
在cap 中打开ssh agent forwarding选项需要在脚本中设置:
ssh_options[:forward_agent] = true
如何配置一个项目进行自动部署
部署一个项目,首先进行在项目的根目录下执行 "capify ."
执行后在根目录下会创建 config/deploy.rb。
在deploy.rb中定义下面的配置项:
:application 项目名称
:user :password上文讲过是ssh的用户名和密码
:scm :scm_username :scm_password 定义你的代码服务器、用户名和密码。 例如 git costaxu 123
:repository 代码服务器的uri
:deploy_to 部署的位置
:use_sudo 是否运行sudo部署。 true or false。 如果配置成true, 你的部署用户需要有sudo的权限, 并且不需要输入密码就可以sudo。
:keep_releases 在部署之后保持的release的数量。部署中不会自动清除release, 需要手工执行
cap deploy:cleanup 会删除多余的release。
如何部署
在项目的根目录下,运行 cap deploy。
运行完之后会在deploy_to目录下生成 current 和 release。 current软链到release下面的某个子目录,表示当前版本。
如何回滚到上一个版本
在项目的根目录下,运行 cap deploy:rollback。
怎么写一个任务
任务是capistrano的基础。 任务可以定义在deploy.rb中或者Capfile中。 也可以写在其他文件中,由Capfile指定加载。
一个最简单的capistrano任务如下:
desc "Search Remote Application Server Libraries"
task :search_libs, :roles => :app do
run "ls -x1 /usr/lib | grep -i xml"
end
第一行 desc是一行描述。
第二行 task 指定了任务的名字,以及在哪些role上运行这个任务。 每台被部署的服务器都会指定一个或多个role。
第三行 run 是DSL语言的一个action module。 可以用来运行命令。
部署的任务流程
一个deploy任务流程如下:
namespace :deploy do
task :default do
update
update_code
strategy.deploy!
finalize_update
symlink
restart # <= v2.5.5
end
end
default是一个namespace下的默认流程。
cap deploy 相当于执行 cap deploy:default
如何把自己的任务放入任务流
可以利用before/ after, 把你自己的流程加入到部署的默认流程当中 。
例如下面的流程定义
after("deploy:symlink") do
# Some more logic here perhaps
notifier.email_the_boss
end
你可以在deploy:symlink完成之后 运行 notifier.email_the_boss。
一般情况下你需要自定义deploy:restart deploy:start deploy:stop 这3个task。
例如
namespace :deploy do
task :start, roles => :app do
puts "start vines"
end
task :stop, roles=> :app do
puts "stop vines"
end
task :restart, :roles => :app do
puts "restart vines"
end
end
如何上传、下载文件
可以用 upload , download实现上传和下载
上传文件或者文件夹使用
upload(from, to, options={}, &block)
下载文件或者文件夹使用
download(from, to, options={}, &block)
例如:
task :test_upload do
upload_options={}
upload_options[:recursive] = true
upload_options[:via] = :scp
upload("/home/costa/test/log", "/home/deploy/", upload_options)
end
如何直接执行远程命令
cap invoke COMMAND=""
costa@pepsi:~/test/vines$ cap invoke COMMAND="free -m"
* 2014-02-22 23:17:58 executing `invoke'
* executing "free -m"
servers: ["192.168.1.135"]
[192.168.1.135] executing command
** [out :: 192.168.1.135] total used free shared buffers cached
** [out :: 192.168.1.135] Mem: 248 185 63 0 20 88
** [out :: 192.168.1.135] -/+ buffers/cache: 77 171
** [out :: 192.168.1.135] Swap: 375 85 290
command finished in 178ms
事务性
cap简单的实现了事务性功能, 也就是说确保任务成功, 若不能成功,则回滚。
例如:
task :deploy do
transaction do
update_code
symlink
end
end
task :update_code do
on_rollback { run "rm -rf #{release_path}" }
source.checkout(release_path)
end
task :symlink do
on_rollback do
run <<-EOC
rm #{current_path};
ln -s #{previous_release} #{current_path}
EOC
end
run "rm #{current_path}; ln -s #{release_path} #{current_path}"
end
远程shell
cap shell
* 2014-02-22 23:32:43 executing `shell'
====================================================================
Welcome to the interactive Capistrano shell! This is an experimental
feature, and is liable to change in future releases. Type 'help' for
a summary of how to use the shell.
--------------------------------------------------------------------
cap> pwd
[establishing connection(s) to 192.168.1.135]
** [out :: 192.168.1.135] /data/home/deploy
cap> ls
** [out :: 192.168.1.135] git_test log projects test vines
cap>
内置task
cap deploy # Deploys your project.
cap deploy:check # Test deployment dependencies.
cap deploy:cleanup # Clean up old releases.
cap deploy:cold # Deploys and starts a `cold' application.
cap deploy:create_symlink # Updates the symlink to the most recently deployed version.
cap deploy:migrate # Run the migrate rake task.
cap deploy:migrations # Deploy and run pending migrations.
cap deploy:pending # Displays the commits since your last deploy.
cap deploy:pending:diff # Displays the `diff' since your last deploy.
cap deploy:restart # Blank task exists as a hook into which to install your own environment specific behaviour.
cap deploy:rollback # Rolls back to a previous version and restarts.
cap deploy:rollback:code # Rolls back to the previously deployed version.
cap deploy:setup # Prepares one or more servers for deployment.
cap deploy:start # Blank task exists as a hook into which to install your own environment specific behaviour.
cap deploy:stop # Blank task exists as a hook into which to install your own environment specific behaviour.
cap deploy:symlink # Deprecated API.
cap deploy:update # Copies your project and updates the symlink.
cap deploy:update_code # Copies your project to the remote servers.
cap deploy:upload # Copy files to the currently deployed version.
cap deploy:web:disable # Present a maintenance page to visitors.
cap deploy:web:enable # Makes the application web-accessible again.
cap invoke # Invoke a single command on the remote servers.
cap shell # Begin an interactive Capistrano session.
冷部署用的是 deploy:cold