我配置了厨师环境,我可以使用capistrano部署我的应用程序。现在我想让我的厨师处理capistrano来部署我的应用程序。如何做呢 ?如何链接厨师与卡皮斯特拉诺部署
回答
你可以观看那个Foodfightshow插曲约Application Deployment。
你可以例如将配置文件(例如数据库凭证)与Chef一起放到服务器上,同时用Capistrano推送源代码。
你不能。或者至少它不会很直接。
厨师是一个拉动系统 - 客户从厨师服务器提取信息,并采取行动。
Capistrano是一个推送系统 - 您告诉它登录到服务器并在那里执行任务。
我看到你整合它们的唯一方法就是在每台机器上本地运行Capistrano,但我没有看到原因。
厨师的部署资源可能会做你需要的一切,而无需Capistrano整合。如果您仍然希望将部署推向独立于主厨客户端运行的服务器,则最好不要通过Chef部署并保留当前的系统。
如果您想持续交付,请将Capistrano脚本连接到您的CI服务器,并在管道末端运行它们。
@StephenKing引用的播客是关于此问题的重要信息来源。
我做的是相反的,即。通过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 [email protected]: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 [email protected]: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/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. javan-每当不写cisttab与卡皮斯特拉诺部署
- 3. 卡皮斯特拉诺部署后自动加载页面
- 4. 卡皮斯特拉诺3部署被打破
- 5. 卡皮斯特拉诺 - 部署后重命名
- 6. 卡皮斯特拉诺获取块
- 7. 卡皮斯特拉诺日志级别
- 8. 卡皮斯特拉诺很慢
- 9. 卡皮斯特拉诺的失败
- 10. 什么应该与卡皮斯特拉诺部署后的网址
- 11. 卡皮斯特拉诺如何与Rake相关?
- 12. 自动部署使用卡皮斯特拉诺没有保留旧版本
- 13. dotenv和linked_files与卡皮斯特拉诺3
- 14. 仍然没有找到与卡皮斯特拉诺的宝石
- 15. 厨师部署?
- 16. 斯卡拉和厨师 - 最近的斯卡拉包
- 17. 我怎样才能缩短卡皮斯特拉诺的说法
- 18. Ruby on Rails卡皮斯特拉诺更新版本
- 19. 卡皮斯特拉诺 - 清理旧版本问题
- 20. 卡皮斯特拉诺使用sudo即使使用“set:use_sudo,false”
- 21. 卡皮斯特拉诺没有越过'角色(:应用)'?
- 22. 卡皮斯特拉诺不包括食谱书
- 23. 为什么卡皮斯特拉诺这样表演?
- 24. 卡皮斯特拉诺乘客与混帐错误“sh:2:master:not found”
- 25. Rails应用程序与乘客和卡皮斯特拉诺采摘错误gemset
- 26. 厨师部署建议/ scenerio
- 27. 链接与andThen PartialFunctions在斯卡拉
- 28. 如何使用厨师的部署资源部署更改?
- 29. 斯卡拉链接列表
- 30. 卡皮斯特拉诺将-b标志传递给git-clone会导致错误