2013-03-12 14 views
7

私はシェフ環境を設定しており、私はcapistranoを使って自分のアプリケーションを配備することができます。今私は私のシェフcapystranoを処理するために私のアプリを展開したい。どのようにそれを行うことができますか?シェフとカピストラーを配備する方法

答えて

2

あなたはその食べ物の様子のエピソードを約Application Deploymentと見ることができます。

Capistranoでソースコードをプッシュしながら、設定ファイル(例えば、データベースの資格情報など)をChefのサーバーに入力します。

2

できません。少なくとも、それはあまり簡単ではありません。

シェフはプルシステムです。クライアントはシェフサーバーから情報を引き出し、それに対処します。

カピストラーノはプッシュシステムです。サーバーにログインしてタスクを実行するように指示します。

あなたがそれらを統合するために私が見るのは、カピストラーノを各マシンでローカルに実行することだけですが、その理由は分かりません。

シェフのデプロイメントリソースは、おそらくカプリストラノを統合する必要なしに、必要なすべてを実行できます。シェフクライアントの実行とは独立してデプロイをサーバーにプッシュしたい場合は、シェフ経由で展開して現在のシステムを維持しないほうがよいでしょう。

継続的に配信したい場合は、CapistranoスクリプトをCIサーバーに接続し、パイプラインの最後に実行します。

@StephenKingによって紹介されたポッドキャストは、この問題に関する素晴らしい情報源です。

3

私は逆のことをします。私のシェフのレシピをCapistrano経由で配備する。私はそれをお勧めします。

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

これは前にバンドル宝石の多くがOSにインストールされたパッケージに依存しているために重要である、インストール後にサーバーのシェフの設定を実行します。

#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'] 
}) 

を定義しています。また、EC2セキュリティグループを使用してサーバーを役割にマッピングするためにcapistrano-ec2groupを使用します。

group :myapp_web, :web 
group :myapp_web, :app 
group :myapp_db, :db, :primary=>true 
group :myapp_db_slave, :db_slave 

だから、基本的には、1つのレポであなたのシェフのレシピを保つ別のレポでのご使用の環境変数、および他のレポでアプリ - との両方のプロビジョニングサーバにカピストラーノを使用してアプリケーションを配備します。

シェフのレシピをアプリケーションレポに保存することもできますが、プロジェクト間での再利用はできません。重要なのは、変更されたすべてを環境変数に置き、アプリとレシピに別々に保存することです。

これは、あなたは、単にEC2で最大1をスピンする必要がある新しいサーバーを追加するために、正しく設定され、必要なセキュリティグループを適用し、

cap deploy 
関連する問題