7

Chef レシピでプライベート リポジトリを複製するのに苦労しています。さて、昨日は動作していましたが、Vagrant ボックスを 6 回「シェフ」した後、壊れてしまいました。ご想像のとおり、私はシェフの初心者です。

こちらの deploy_resource ガイドに従って、 deploy.rb レシピ (短縮) を作成しました。

deploy_branch "/var/www/html/ps" do
  repo              git@github.com:simonmorley/private-v2.git
  ssh_wrapper       "/tmp/.ssh/chef_ssh_deploy_wrapper.sh"
  branch            "rails4"
  migrate           false
  environment       "RAILS_ENV" => node[:ps][:rails_env] 
  purge_before_symlink %w{conf data log tmp public/system public/assets}
  create_dirs_before_symlink []
  symlinks(                        # the arrow is sort of reversed:
    "conf"   => "conf",            # current/conf          -> shared/conf
    "data"   => "data",            # current/data          -> shared/data
    "log"    => "log",             # current/log           -> shared/log
    "tmp"    => "tmp",             # current/tmp           -> shared/tmp
    "system" => "public/system",   # current/public/system -> shared/system
    "assets" => "public/assets"    # current/public/assets -> shared/assets
  )
  scm_provider Chef::Provider::Git # is the default, for svn: Chef::Provider::Subversion
  notifies :restart, "service[ps]"
  notifies :restart, "service[nginx]"
end

デフォルトでは、ディレクトリなどを作成するために次のものがあります。

directory "/tmp/.ssh" do
  action :create
  owner node[:base][:username]
  group node[:base][:username]
  recursive true
end

template "/tmp/.ssh/chef_ssh_deploy_wrapper.sh" do
  source "chef_ssh_deploy_wrapper.sh.erb"
  owner node[:base][:username]
  mode 0770
end

# Put SSH private key to be used with SSH wrapper
template "/tmp/.ssh/id_deploy" do
  source "id_rsa.pub.erb"
  owner node[:base][:username]
  mode 0600
end

そしてラッパーで:

#!/bin/sh
exec ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "/tmp/.ssh/id_deploy" "$@"

公開鍵を作成し、これを github にアップロードしました。

レシピをデプロイすると、次のエラーが表示されます。

 deploy_branch[/var/www/html/ps] action deployEnter passphrase for key '/tmp/.ssh/id_deploy': 

明らかに、パスワードが設定されていません...したがって、秘密鍵が欠落している必要があります..

たまたま、レシピから id_deploy キーを削除し、フォルダーを削除して、もう一度実行しました。なんと、動作し始めました... id_rsa.pub && id_rsa ファイルは、テストのために手動で生成したときから /root/.ssh にあったためです。

ここで何が間違っているのかわかりません。したがって、私の質問は次のとおりです。

  • 展開先の各ノードに秘密鍵と公開鍵が必要ですか? ドキュメントはこれについて言及していません。
  • これは非 root ユーザーとしてデプロイすべきではありませんか? 自分のロール ファイルにユーザーを設定しました。
  • ssh_wrapper が本来の動作をしないのはなぜですか
4

2 に答える 2

18

これを適切に理解するのに数日かかりました。

明確にするために、これは私がそれを修正するためにしたことです。それが正しいかどうかはわかりませんが、私にとってはうまくいきます。

  • このチュートリアルに従って、公開鍵と秘密鍵のセットを生成します。

  • 複製する Github リポジトリに公開鍵を追加します。

  • 公開鍵と秘密鍵の両方を含むデフォルトのレシピでテンプレートを作成します。下記参照。

  • 公開鍵と秘密鍵に関連するテンプレートを作成しました。

  • Chef_ssh_deploy_wrapper.sh.erb ファイルを作成しました (以下を参照)。

  • deploy.rb レシピを作成しました (以下を参照)。

  • レシピをアップロードしてロールに追加しました。シェフクライアントを実行しました。

  • ちょっとプレスト!ビールを飲みながら座って、レポを見てください。ディレクトリにスマートにクローンされます。

テンプレートは次のとおりです。

ディレクトリとテンプレートを作成します。

template "/tmp/.ssh/chef_ssh_deploy_wrapper.sh" do
  source "chef_ssh_deploy_wrapper.sh.erb"
  owner node[:base][:username]
  mode 0770
end

template "/home/#{node[:base][:username]}/.ssh/id_rsa.pub" do
  source "id_rsa.pub.erb"
  owner node[:base][:username]
  mode 0600
end

template "/home/#{node[:base][:username]}/.ssh/id_rsa" do
  source "id_rsa.erb"
  owner node[:base][:username]
  mode 0600
end

ssh ラッパーを作成しますchef_ssh_deploy_wrapper.erb

#!/bin/sh
exec ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "/home/#{node[:base][:username]}/.ssh/id_rsa" "$@"

(必ずここで秘密鍵を使用してください。そうしないと失敗します)

最後に deploy.rb レシピ:

deploy_branch node[:my_app][:deploy_to] do
  repo              node[:base][:repository]
  ssh_wrapper       "/tmp/.ssh/chef_ssh_deploy_wrapper.sh"
  branch            "rails4"
  user               node[:base][:username]
  group              node[:base][:username]
  rollback_on_error  true
  migrate            false
  environment        "RAILS_ENV" => node[:my_app][:environment] 
  purge_before_symlink %w{conf data log tmp public/system public/assets}
  create_dirs_before_symlink []
  symlinks(                        
    "config"   => "config",        
    "data"   => "data",            
    "log"    => "log",             
    "tmp"    => "tmp",             
    "system" => "public/system",  
    "assets" => "public/assets"  
  )
  scm_provider Chef::Provider::Git # is the default, for svn: Chef::Provider::Subversion
  before_restart do
    system("su #{node[:base][:username]} -c 'cd #{node[:my_app][:deploy_to]}/current && /usr/bin/bundle install'") or raise "bundle install failed"
    system("su #{node[:base][:username]} -c 'RAILS_ENV=production /usr/local/bin/rake assets:precompile'")
  end
  notifies :restart, "service[my_app]"
  notifies :restart, "service[nginx]"
end

最初はソースから ruby​​ をコンパイルしていたが、最終的に rvm を使用することにしたため、再起動前は置き換えられました。マルチユーザーのインストールがはるかに簡単です。

注意: 私は sudo ユーザーとしてデプロイしています。root としてデプロイしている場合 (これは避けてください)、代わりに /root/.ssh パスを使用してください。

この記事から多くのインスピレーションを得ました。

頑張ってください、これが誰かに役立つことを願っています。

于 2013-08-28T18:17:33.793 に答える
1

あなたの質問にはdeploy_resourceソースへのリンクがないため、これが当てはまるかどうかはgitわかりませんが、下のリソースを使用している場合は、次のことが役立つ場合があります...

同様の質問に対するこの回答で説明されているように、リポジトリ URL の「外部トランスポート」部分として SSH コマンドを追加することで、各 SSH キーに対応する余分なスクリプト ファイルの作成を回避できます。

git "/path/to/destination" do
  repository "ext::ssh -i /path/to/.ssh/deployment_key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no git@github.com %S /my_name/some_repo.git"
  branch "master"
  ...
end
于 2015-11-19T17:19:11.487 に答える