我已经配置了 Chef 环境,并且能够使用 capistrano 部署我的应用程序。现在我想要我的 厨师办理卡皮斯特拉诺 部署我的应用程序。怎么做到呢 ?

请您参考如下方法:

我做相反的事情,即。通过 Capistrano 部署我的 Chef 食谱。我推荐它。

#config/deploy.rb 
... 
before 'bundle:install', "provision:default", "deploy:config_db_yml_symlink" 
... 

这将在安装包之前执行服务器的 Chef 配置,这很重要,因为许多 gem 依赖于安装到操作系统的软件包。
#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 的文件夹,用于处理厨师角色的定义,尽管食谱位于不同的存储库中。
#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 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!