我已经配置了厨师环境,我可以使用capistrano部署我的应用程序。现在我想让主厨处理 capistrano 来部署我的应用。怎么办呢?
答案 0 :(得分:3)
我正好相反,即。通过Capistrano部署我的厨师食谱。我推荐它。
#config/deploy.rb
...
before 'bundle:install', "provision:default", "deploy:config_db_yml_symlink"
...
这将在捆绑安装之前执行服务器的主厨配置,这很重要,因为很多宝石都依赖于安装到操作系统的软件包。
#config/deploy/provision.rb
Capistrano::Configuration.instance(:must_exist).load do
namespace :provision do
task :default do
provision.setup
provision.web
provision.db
provision.db_slave
end
task :setup, once: true do
provision.get_environment_variables
provision.update_cookbooks
end
task :db, :roles => :db do
next if find_servers_for_task(current_task).empty?
if rails_env == 'staging'
run %{cd #{release_path}/provision; sudo chef-solo -c solo.rb -j db.json -l debug}
else
run %{cd #{release_path}/provision; sudo chef-solo -c solo.rb -j db_master.json -l debug}
end
end
task :db_slave, :roles => :db_slave do
next if find_servers_for_task(current_task).empty?
run %{cd #{release_path}/provision; sudo chef-solo -c solo.rb -j db_slave.json -l debug}
end
task :web, :roles => :web do
next if find_servers_for_task(current_task).empty?
run %{cd #{release_path}/provision; sudo chef-solo -c solo.rb -j web.json -l debug}
end
task :get_environment_variables do
run "if [ -d ~/.config ]; then " +
"cd ~/.config && git fetch && git reset origin/master --hard; " +
"else git clone git@github.com:mycompany/config.git .config; fi"
run "sudo cp ~/.config/secureshare/#{rails_env}/environment /etc/environment"
end
task :update_cookbooks do
run "if [ -d /u/chef ]; then " +
"cd /u/chef && git fetch && git reset origin/master --hard; " +
"else git clone git@github.com:mycompany/chef.git /u/chef; fi"
end
end
namespace :deploy do
task :setup, :except => { :no_release => true } do
dirs = [deploy_to, releases_path, shared_path]
dirs += shared_children.map { |d| File.join(shared_path, d.split('/').last) }
dirs += [File.join(shared_path, 'sockets')]
run "#{try_sudo} mkdir -p #{dirs.join(' ')}"
run "#{try_sudo} chmod g+w #{dirs.join(' ')}" if fetch(:group_writable, true)
run "#{try_sudo} chown -R ubuntu:ubuntu #{dirs.join(' ')}" if fetch(:group_writable, true)
end
task :config_db_yml_symlink do
run "ln -s #{shared_path}/database.yml #{release_path}/config/database.yml"
end
end
end
我的项目中有一个名为provision的文件夹,用于处理chef角色的定义,尽管这些食谱位于不同的存储库中。
#provision/solo.rb
root = File.absolute_path(File.dirname(__FILE__))
cookbook_path '/u/chef'
role_path root + "/roles"
log_level :debug
log_location STDOUT
节点在项目中定义
#provision/db_slave.json
{
"run_list": ["role[db_slave]"]
}
和角色
#provision/roles/db_slave.rb
name "db_slave"
description 'A postgresql slave.'
run_list(["recipe[base]", "recipe[postgresql::slave]", "recipe[rails]","recipe[papertrail]", "recipe[fail2ban]"])
override_attributes(
'kernel' => {
'shmmax' => ENV['KERNEL_SHMMAX'],
'shmall' => ENV['KERNEL_SHMALL'],
'msgmax' => ENV['KERNEL_MSGMAX'],
'msgmnb' => ENV['KERNEL_MSGMNB']
},
'postgresql' => {
'user' => ENV['PG_USER'],
'password' => ENV['PG_PASSWORD'],
'database' => ENV['PG_DATABASE'],
'master_host' => ENV['PG_HOST']
},
'app_dir' => ENV['APP_DIR'],
'papertrail' => {
'port' => ENV['PAPERTRAIL_PORT'],
'log_files' => [
"#{ENV['APP_DIR']}/shared/log/*.log",
"/var/log/*.log",
"/var/log/syslog",
"/var/log/upstart/*.log",
"/var/log/postgresql/*.log"
]
},
'new_relic' => {
'key' => ENV['NEW_RELIC_LICENSE_KEY']
})
所有这些都不会在应用中保留任何敏感信息。我还使用capistrano-ec2group,以便使用EC2安全组将服务器映射到角色。
group :myapp_web, :web
group :myapp_web, :app
group :myapp_db, :db, :primary=>true
group :myapp_db_slave, :db_slave
所以基本上你将你的厨师食谱保存在一个仓库中,你的环境变量保存在另一个仓库中,你的应用程序保存在另一个仓库中 - 并使用Capistrano来配置服务器和部署你的应用程序。
您还可以将您的厨师食谱保存在您的应用程序仓库中,但这会阻碍项目之间的重复使用。关键是将所有更改的内容放入环境变量中,并将它们分别存储到应用程序和配方中。
如果配置正确,要添加新服务器,只需在EC2中旋转一个,应用所需的安全组,然后
cap deploy
答案 1 :(得分:2)
您可以观看关于Application Deployment的Foodfightshow剧集。
你可以,例如将配置文件(例如数据库凭证)放入带有Chef的服务器,同时使用Capistrano推送源代码。
答案 2 :(得分:2)
你做不到。或者至少它不会非常简单。
Chef是一个拉系统 - 客户端从Chef服务器提取信息,并对其采取行动。
Capistrano是一个推送系统 - 你告诉它登录服务器并在那里执行任务。
我看到你整合它们的唯一方法是在每台机器上本地运行Capistrano,但我没有看到原因。
Chef的部署资源可以完成您所需的一切,而无需集成Capistrano。如果您仍希望独立于chef-client运行将部署推送到服务器,那么最好不要通过Chef部署并保留当前系统。
如果您想要持续投放,请将您的Capistrano脚本连接到CI服务器并在管道末端运行它们。
@StephenKing推荐的播客是关于此事的重要信息来源。