capistrano3.5环境搭建

官方文档:

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环境

 
 
  1. $ sudo cap install
  2. mkdir -p config/deploy
  3. create config/deploy.rb
  4. create config/deploy/staging.rb
  5. create config/deploy/production.rb
  6. mkdir -p lib/capistrano/tasks
  7. Capified
  8. $ tree
  9. .
  10. ├── Capfile
  11. ├── config
  12.    ├── deploy
  13.       ├── production.rb
  14.       └── staging.rb
  15.    └── deploy.rb
  16. └── lib
  17. └── capistrano
  18. └── 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!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值