http://capistranorb.com/documentation/getting-started/installation/
简介:
capistrano是一个自动向远程服务器部署代码的工具,使用起来非常的方便。
它可以将你的代码自动从git或svn上pull出来指定分支的代码到你的部署目录下,同时维护一个current软链接,指定最新的版本。
同时它出会将最近(默认5次)几次的版本存放在release1, release2,releaseN目录下。
当你需要更新部署时,只需要一个条命令:
cap development deploy
即可将新代码pull下来,也可以通过一个命令:
cap deploy:rollback
实现将代码回滚到上一次的版本,方便我们切换不同版本和部署。
最NB的话,它默认通过SSH链接所有的远程服务器,生产环境或开发环境或DB环境,将所有代码同步到所有环境下,真正的实现一键部署多个服务器。
本教程使用的git为coding.net的免费git库,实现ssh远程部署到development和production环境下。
一. SSH自动登录remote server
1. 生成ssh密钥
一般登录服务器都需要用户名和密码,通过SSH的安全策略实现无用户名和密码的远程访问服务器,这时你需要生成ssh public Key。
通过下面的命令生成一对rsa Key。
me@localhost $ ssh-keygen -t rsa -C 'me@my_email_address.com'
它会在你在~/.ssh/目录下生成id_rsa和id_rsa.pub,其中id_rsa为私钥,id_rsa.pub为公钥,你将公钥拷贝到远程服务器上的~/.ssh/目录下,即可实现对远程服务器的免用户名密码登录。
[me@localhost ~]# ls ~/.ssh/
id_rsa id_rsa.pub known_hosts
2. 将私钥加载到ssh授权代理中
me@localhost $ ssh-add
Identity added: /Users/me/.ssh/id_rsa (/Users/me/.ssh/id_rsa)
通过上面的命令将私钥添加到ssh授权代理中,可以通过下面的命令查看下,是否已经加载成功。
如果上面命令出错:
执行:
eval `ssh-agent -s` 注意这里是反引号
me@localhost $ ssh-add -l
2048 af:ce:7e:c5:93:18:39:ff:54:20:7a:2d:ec:05:7c:a5 /Users/me/.ssh/id_rsa (RSA)
注意:如果ssh-add失败,先执行ssh-agent bash,再执行上述命令
小技巧:
ssh-add在每次重启后都要重新执行一下,为了方便不用每次都执行它,可以写个配置文件:
vim ~/.ssh/config
##################
# For Coding.net #
##################
Host coding.net
#User depoly
Hostname YOUR_SERVER
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
3. 远程服务器添加deploy用户
所有的远程服务器都要创建一个deploy用户,并且设置Lock为无密码,让别人可以不设置密码登录。
root@remote $ adduser deploy
root@remote $ passwd -l deploy
The second line
locks
the user, it changes the user’s password to an untypable string, guaranteeing that the user has no password which can be used to log in.
4.设置远程服务器授权的公钥
将上面第1步生成的id_rsa.pub公钥文件拷贝到所有需要部署的远程服务器(再次确认是否已经创建了deploy用户),可以使用scp,也可以直接打开拷贝内容。
将id_rsa.pub里的内容拷贝到远程服务器的~/.ssh/目录下,并且命名为:authorized_keys
示例使用拷贝文本方式:
root@remote $ su - deploy
deploy@remote $ cd ~
deploy@remote $ mkdir .ssh
deploy@remote $ echo "ssh-rsa jccXJ/JRfGxnkh/8iL........dbfCH/9cDiKa0Dw8XGAo01mU/w== /Users/me/.ssh/id_rsa" >> .ssh/authorized_keys
deploy@remote $ chmod 700 .ssh
deploy@remote $ chmod 600 .ssh/authorized_keys
注意:
一定要将公钥放到deploy用户的HOME目录下
一定要给公钥文件指定权限
一定要将公钥命名为:authorized_keys
5. 测试无用户名密码登录
ssh deploy@REMOTE_SERVER_IP
二. 安装capistrano环境
完全按照官方手册说明来做。
$ gem install capistrano
$ git clone https://github.com/capistrano/capistrano.git
$ cd capistrano
$ gem build *.gemspec
$ gem install *.gem
1. 初始化cap环境
- $ sudo 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
- Capified
- $ tree
- .
- ├── Capfile
- ├── config
- │ ├── deploy
- │ │ ├── production.rb
- │ │ └── staging.rb
- │ └── deploy.rb
- └── lib
- └── capistrano
- └── tasks
2. 配置deploy.rb
deploy.rb为主配置文件。所有子配置文件可以重写该配置信息。
我的配置如下:
set :application, 'YOUR_APP_NAME'
set :repo_url, 'git@git.coding.net:USER_NAME/PROJECT.git'
3. 配置development.rb和production.rb
在config/deploy/拷贝development.rb文件
cp production.rb development.rb
development.rb内容如下:
server 'DEV_SERVER_IP', #开发环境服务器地址
user: 'deploy', #开发环境服务器用户名,上面已经创建
roles: %w{web app},
ssh_options: { # ssh配置,用来无用户名和密码登录远程服务器,具体配置参数见:http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start
user: 'deploy',
keys: %w(/root/.ssh/id_rsa), # ssh私钥所在目录
port:22, # 远程服务器ssh开放端口
forward_agent: true, # 开启代理转发,参考:http://unixwiz.net/techtips/ssh-agent-forwarding.html#fwd
auth_methods: %w(publickey password)
# password: 'please use keys'
}
production.rb内容参考development.rb。
4. 开始部署吧
在你的应用目录下执行:
cap development deploy
你可以看到下列执行结果如下:
[root@localhost ~]# cap development deploy 00:00 git:wrapper 01 mkdir -p /tmp/PROJECT/ ✔ 01 deploy@YOUR_SERVER 0.232s Uploading /tmp/PROJECT/git-ssh.sh 100.0% 02 chmod +rx /tmp/PROJECT/git-ssh.sh ✔ 02 deploy@YOUR_SERVER 0.135s 00:00 git:check 01 git ls-remote --heads git@git.coding.net:USER_NAME/PROJECT.git 01 8fa0414597075b5918ccb137222fc00b8c429a28 refs/heads/develop 01 d32023f5853a1b3e11bdad00333fa0389916b75a refs/heads/master ✔ 01 deploy@YOUR_SERVER 0.511s 00:01 deploy:check:directories 01 mkdir -p /var/www/PROJECT/shared /var/www/PROJECT/releases ✔ 01 deploy@YOUR_SERVER 0.136s 00:01 git:clone 01 git clone --mirror git@git.coding.net:USER_NAME/PROJECT.git /var/www/PROJECT/repo 01 Cloning into bare repository '/var/www/PROJECT/repo'... ✔ 01 deploy@YOUR_SERVER 8.670s 00:10 git:update 01 git remote update --prune 01 Fetching origin ✔ 01 deploy@YOUR_SERVER 0.329s 00:10 git:create_release 01 mkdir -p /var/www/PROJECT/releases/20160628134729 ✔ 01 deploy@YOUR_SERVER 0.157s 02 git archive master | tar -x -f - -C /var/www/PROJECT/releases/20160628134729 ✔ 02 deploy@YOUR_SERVER 1.889s 00:13 git:set_current_revision 01 echo "d32023f5853a1b3e11b33333efa0389916b75a" >> REVISION ✔ 01 deploy@YOUR_SERVER 0.161s 00:13 deploy:symlink:release 01 ln -s /var/www/PROJECT/releases/20160628134729 /var/www/PROJECT/releases/current ✔ 01 deploy@YOUR_SERVER 0.137s 02 mv /var/www/PROJECT/releases/current /var/www/PROJECT ✔ 02 deploy@YOUR_SERVER 0.138s 00:14 deploy:log_revision 01 echo "Branch master (at d32023f5853a1b3e11bdad002aefa449916b75a) deployed as release 20160628134729 by root" >> /var/www/YOUR… ✔ 01 deploy@YOUR_SERVER 0.157s
一些坑:
默认cap会将代码部署到 /var/www目录下,一定要确保有deploy用户有对该目录的读写权限
建议使用
id_rsa.pub authorized_keys
的方式进行免密码登陆
首次部署, 需要执行
cap [environment] deploy:check
命令, 把 linked_files
在服务器上创建
Just enjoy it!!