Centos6.4 部署安装Webistrano

安装环境:

安装epel源:

wget -q -O -http://www.atomicorp.com/installers/atomic |sh

安装软件包:

yum install ruby ruby-devel ruby-docs ruby-ri ruby-irbruby-rdoc rubygems

安装git

Yum install git –y

安装mysql

Yum install mysql mysql-servermysql-devel

初始化mysql

Mysql_install_db

登陆mysqk

Mysq –uroot –p直接回车进入

mysql设置密码

Use mysql;

Update user set password=PASSWORD(“123456”) where user=’root’;

Flush privileges;

启动mysql

/etc/init.d/mysqld restart||start||stop

使用gem安装软件:

Gem install Capistrano

Gem install rails 如果提示要求ruby版本1.9.3以上,则制定安装rails版本

Detail:

Gem install rails –v 2.1.2

安装完成后安装bundler

Gem installbundler

Gem installopen4 exception_notification

然后使用git拿到webistrano

Git clone https://github.com/peritor/webistrano.git

使用bundlerinstall 更新&&安装ruby的环境包

Detail:

Bundle install

然后通过阅读webistranoREADME文件进行安装

RAILS_ENV=productionrake db:create 创建相关的数据库

RAILS_ENV=productionrake db:migrate 创建相关的表结构

操作完成后,通过rubyscript/server –d –p 3000 –e prodution来启动webistrano

报错:

1.ERROR: 'rake/rdoctask' is obsolete and nolonger supported. Use 'rdoc/task'

这个错误是说rdoc过期

解决方法:

降低rake版本

gemuninstall rake -v 10.1.0

安装0.8.7rake版本

Geminstall rake –v 0.8.7

然后就可以通过rake 建立相关的数据库及表结构了


2.bundle install的时候提示要求1.3.5或更高版本的bundler,请运行gem install bundler –v 1.3.5

执行完gem install bundler –v 1.3.5安装成功后依然出现这个提示

解决方法:

修改gemfilegem

gem 'bundler', " ~>1.3.5"

手动将bundler的版本更改成1.3.5


3.安装0.8.7rake后,提示bundler版本要求10.0.1

解决方法:更改gemfile文件

gem "rake" , "0.8.7" 手动添加版本信息

然后执行bundle update rake

然后执行 gem install rake –v 0.8.7

这是将rake更改成0.8.7的方法在ruby1.8.7的版本下


webistrano是capistrano的web版,用法和capistrano差不多,附上capistrano的用法:

安装capistrano后,执行capify conf/------conf文件下生产配置文件

如果开始没有安装capistrano

则使用gem install capistranovim Gemfile 添加一行gem capistrano”然后执行bundle install即可

编辑config下的deploy文件

set :application, "set your application name here"

set :repository, "set your repository location here"

如果你不熟悉ruby语法,你会发现这看起来十分像配置文件。但是,因为在ruby中调用函数的时候,不需要使用括号,文件里面的每一行其实就是调用set()函数:


set(:application, "your-app-name")

使用你的应用的名字替代:application变量,不要包含空格--这会创建一个部署目录。使用你的版本管理URL目录替代:repository(在这个例子中,我们使用SVN


如果你的SVN需要用户名和密码,请按如下配置:

set :scm_username, "svn-username"

set :scm_password, "svn-password"



接着,取消注释并配置部署目录。如果你的部署服务器上没有部署的目录,Capistrano会帮你创建它:


set :deploy_to, "/path/to/doc/root/www/#{application}"

这里,我们使用我们之前设置的目标部署目录的application变量。这写全部是ruby的标准语法,在所有的Capistrano脚本中适用,这样可以使我们的工作更有效,而不是混杂各种令人头晕的语法在里面。

最后,我们需要配置部署的服务器信息。你可以添加很多你需要部署的服务器,你只需遵循SSH可以理解的命名规则:

role :app, "app-server-1", "app-server-2", "app-server-3"

role :web, "192.168.3.173"

role :db, "db-server-1", :primary => true

如果你只是想测试一下Capistrano,你可以把你的工作站配置到部署地址; 这样,你就无需考虑服务器之间的跳转:



role :app, "me@my-local-ip"

现在,我们可以告诉Capistrano为我们建立部署路径的配置:


cap deploy:setup

当你运行这个命令,Capistrano开始为你展示它所做的。这样一来,可以方便我们调试Capfile,并可以消除你的疑虑知道它在做什么动作。每当你连接到一台服务器,系统会需要你提供密码,然后Capistrano就会运行一连串的命令。

执行完deploy:setup命令后,部署路径就会创建了一些新增的目录,运行cap命令去推送新版本,执行回滚和其他动作:

myapp/

releases/ shared/log shared/pids shared/system

接着,我们开始部署应用。Capistrano会自动检查源代码并发布,同时创建一个叫做current的symlink链接:


cap deploy:cold

执行完这个命令后,让我们来看看发布目录:


# current@ -> /www/captest/myapp/releases/20131119144520

这个一个"cold"发布,意思是表示只执行一次的任务。之后如果我们需要再发布应用,你只需使用部署任务:


cap deploy

当你执行完deploy:cold或者deploy命令后,查看一下部署目录,你会发现你的源代码会按照Capistrano的方式被发布出去。

部署任务替代了登录服务器,获取源代码,设置数据库和重启服务器。任务只需运行很短时间,我们能就现在可以享受懒惰的感觉了!


深入知识

我们只需运用deploy:setup , deploy:cold, deploy命令就可以发布应用。recipe里面其实包含了很多东西,让我们来看看所有可用的任务:

cap -Tv

和rake -T很相像,这个命令会列出所有的任务和任务相关的文档。如果你已经运行过几次deploy,我们就可以尝试一下rollback或者rollback_code任务。

每次你执行回滚的时候,Capistrano会把symlink指向前一次发布的目录。回滚操作可以重复执行,直到你找到了你想要的稳定版本:

cap deploy:rollback_code

属于你自己的任务

当你使用Capistrano应用到你的rails项目中,你就会发现他是如何让你变得更懒惰。使用Rails特有命令的任务同样可以包含任何的命令在里面。

当你运行Capistrano任务,例如deploy,你会很多SSH命令和回应会回显出来。如果你需要发布到几台服务器上,你看到来自多台服务器的回应,因为Capistrano可以在多台服务器上运行任务,只要你需要发布到多少台服务器都可以。

它的用处是非常广的——检查硬盘空间,从集群中复制实时数据和运行维护计划——那么我们应该如何构建我们自己的任务呢?


Capistrano的任务是通过如下的语法来定义的:

desc "Short description here..."

task :name_of_function, :roles => :servers do

# tasks is in here...

end

Ruby的优雅语法让所有事情都变得十分简单,那么让我们来单独讨论它。第一行是一些解释说明,这些说明会在你运行命令时被输出(同样在你的项目的跟目录下):


cap -Tv

Ruby支持在调用函数的时候,不使用括号,所以第二行实际上是调用了Capistrano的任务函数.

第一个参数是新任务的名字(name_of_function)。第二个参数是指定执行任务的服务器集合;这个可以是:server,:app,:db或者其他服务器的集合。

任务第一部分由do开始,这个是一个匿名函数,它是表示任何在do和end之间的任务都会被执行。你可能在javascript函数中也遇到过匿名函数。

一个非常简单的任务'df -h'将会被执行,用于检查服务器的磁盘使用情况。这个任务不会修改服务器上的任何配置,所以你可以大胆的去运行它:

desc "Check disk space"

task :diskspace, :roles => :servers do

run 'df -h'

end

run函数只会简单的在服务器上运行命令。你可以使用sudo来替代它,使用sudo在远程服务器上实行命令:

desc "Who hasn't been cleaning out their home directories?"

task :home_disk_usage, :roles => :servers do

sudo 'du -sh /home/*'

end

如果你就如上一节提到的一样,capified你的项目,你甚至可以添加你自己自定义的任务到标准的Rails recipe上,并修改Rails recipe的行为。这样可以让你的Capistrano按照你的意思去工作,这样的好处就在于当你忘记了某些命令如何运行。


在capified之后的Rails项目中添加你自己的任务,只需按照上面提到的任务语法,把它们添加到 config/deploy.rb中。当你添加了以恶搞任务,运行runcap -Tv命令检查你的任务是否存在,并运行其他任务。

Tasks可以被其他Task调用就如函数一样,所以复杂的Tasks可以切分成多个简单的tasks并按照“DRY”原则设计你的Capistrano recipes。Tasks可以通过rails函数调用实现互相调用:

task :home_disk_usage, :roles => :servers do

vhosts_disk_usage

run "ls /home/"

end

你可能需要自定义的任务知道你的项目是在哪个路径上。这就用到了我们在开头提到的配置变量,并通过ruby语法来定义:


run "tar czf ~/snapshot.tgz #{release_path}"

如果你需要其他变量,你可以像之前的语法一样去set:


set :foo, "bar"

或者,你可以通过set函数提示用户输入变量,但是用法有一点点不同:

set(:deploy_version) do

Capistrano::CLI.ui.ask "What version is this? "

end

变量使用方法是一样的,不管是用那个方式去set他们。

所有的这些都离不开ruby,所以你会发现Capistrano更像一个框架而并非是一个独立的应用或脚本。如果Ruby对于你来说是一件新鲜的事情, 请继续学习吧——你很会就能熟悉它。

最后,就像DRY原则一样,尽量保持代码整洁。所有的Rails recipes可以在deploy 命名空间中找到,当你运行runcap -Tv的时候你就会发现的。命名空间允许你把任务组合在一起,这可以通过namespace命令包含你的这些任务:

namespace :our_tasks do

desc "The default task"

task :default do

restart

end


desc "Empty logs"

task :empty_logs do

# ...

end

end

当你运行runcap -Tv,你可以看到任务已经被组合在一起:


cap our_tasks # The default task

cap our_tasks:empty_logs # Empty logs


定制Rails recipe

创建Capistrano任务很简单,但是我们之前使用的Rails recipe已经包含了90%我们需要的东西。在这个例子中,更好的方式是定制recipe而不是创建就一个。我们可以通过覆盖特定的任务,实现对某些行为的定制。

我在尝试使用Capistrano来运行makefile的时候发现这个特性。在这里我完成了大部分的代码管理,数据库版本控制和安装配置。我们可以在不需要提交或编辑文件的场合使用这个方法。所以通过capistrano来部署是相当诱人的。

当你读到这里并想:"这是酷毙了,但是我们还没打算迁移到Rails"。定制化会很适合你,因为你可以覆盖执行rails命令相关的任务。

第一,尝试在非Rails项目中使用cap,但是请确保有一个config/目录,这样capify可以放置它的deploy.rb文件。当capify运行完毕后,你可以开始尝试运行各种我们上面提到的cap deploy任务。

但是,当Rails服务器不存在或者Rakefile不存在时候,Capistrano就会发生错误。

这是因为其中一个任务deploy:restart,会尝试重启rails服务器。另外一个任务会尝试运行runrake db:migrate。你的项目很可能不支持这两个任务,所以你需要添加如下的代码到config/deploy.rb,覆盖他们:

desc "Do nothing"

deploy.task :restart, :roles => :app do

# ...do what you like here...

end


这个很直观,这段代码是在deploy 命名空间中覆盖了restart任务,和所有包含在任务里面的命令(所有包含在do和end之间的代码)都可以被编辑。你可能需要重启Apache服务器而不是rails服务器:

desc "Do nothing"

deploy.task :restart, :roles => :app do

sudo '/etc/init.d/restart'

end

当你运行cap命令 deploy:cold,rails迁移命令会创建对应的数据库。我们可以按照我们实际需要覆盖它:

deploy.task :migrate, :roles => :app do

run "make data"

end

结论

Capistrano提供给我们相当简洁的方法去发布应用。它还能在其他关于远程服务器的领域中使用,例如监视,随意的任务,创建一次性备份和其他。

这些要归功于Ruby的优雅简洁,Capistrano可以推广到很多地方。Rails recipe可以被其他non-rails应用所提到,还可以使用小小的ruby知识就能添加一个新的recipes

最后,要让所有事情变得更迅速,使用SSH认证登录远程服务器。如果你需要把认证文件放在其他地方,你只需添加如下代码到deploy.rb文件:

ssh_options[:keys] = "/path/to/identity_file"

通过这个方式,你可以通过cap命令完全发布你的应用——现在你就是真正的懒人了。