程序员人生 网站导航

capistrano3.5环境搭建

栏目:框架设计时间:2016-07-06 08:54:57
官方文档:

http://capistranorb.com/documentation/getting-started/installation/

简介:

capistrano是1个自动向远程服务器部署代码的工具,使用起来非常的方便。

它可以将你的代码自动从git或svn上pull出来指定分支的代码到你的部署目录下,同时保护1个current软链接,指定最新的版本。

同时它出会将最近(默许5次)几次的版本寄存在release1, release2,releaseN目录下。

当你需要更新部署时,只需要1个条命令:

cap development deploy

便可将新代码pull下来,也能够通过1个命令:

cap deploy:rollback

实现将代码回滚到上1次的版本,方便我们切换不同版本和部署。

最NB的话,它默许通过SSH链接所有的远程服务器,生产环境或开发环境或DB环境,将所有代码同步到所有环境下,真实的实现1键部署多个服务器

本教程使用的git为coding.net的免费git库,实现ssh远程部署到development和production环境下。

1. SSH自动登录remote server

1. 生成ssh密钥

1般登录服务器都需要用户名和密码,通过SSH的安全策略实现无用户名和密码的远程访问服务器,这时候你需要生成ssh public Key。

通过下面的命令生成1对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在每次重启后都要重新履行1下,为了方便不用每次都履行它,可以写个配置文件:

vim ~/.ssh/config


##################
# For Coding.net #
##################
Host  coding.net
        #User depoly
        Hostname YOUR_SERVER
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa


3. 远程服务器添加deploy用户

所有的远程服务器都要创建1个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
注意:

  1定要将公钥放到deploy用户的HOME目录下

  1定要给公钥文件指定权限

  1定要将公钥命名为:authorized_keys

5. 测试无用户名密码登录

ssh  deploy@REMOTE_SERVER_IP


2. 安装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

1些坑:

默许cap会将代码部署到 /var/www目录下,1定要确保有deploy用户有对该目录的读写权限

建议使用 id_rsa.pub authorized_keys 的方式进行免密码登陆

首次部署, 需要履行 cap [environment] deploy:check 命令, 把 linked_files 在服务器上创建



Just enjoy it!!



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐