10

あるノードで動作し、別のノードで失敗する Chef を使用してアプリケーション コードをデプロイしようとしています。構成がまったく同じ場合、あるノードで機能し、別のノードで機能しない理由を特定できませんが、少なくとも失敗したノードで問題をデバッグすることはできます。

  deploy_revision app_config['deploy_dir'] do
    scm_provider Chef::Provider::Git 
    repo app_config['deploy_repo']
    revision app_config['deploy_branch']
    if secrets["deploy_key"]
      git_ssh_wrapper "#{app_config['deploy_dir']}/git-ssh-wrapper" # For private Git repos 
    end
    enable_submodules true
    shallow_clone false
    symlink_before_migrate({}) # Symlinks to add before running db migrations
    purge_before_symlink [] # Directories to delete before adding symlinks
    create_dirs_before_symlink [] # Directories to create before adding symlinks
    # symlinks()
    action :deploy
    restart_command do
      service "apache2" do action :restart; end
    end
  end

これは、コードをデプロイするための私のレシピです。シェフは常に独自のデフォルトを詰め込んでいるため、シンボリックリンクを完全に無効にしようとしたことに注意してください。これでもエラーが発生します。

================================================================================
Error executing action `deploy` on resource 'deploy_revision[/var/www]'
================================================================================


Chef::Exceptions::FileNotFound
------------------------------
Cannot symlink /var/www/shared/config/database.yml to /var/www/releases/7404041cf8859a35de90ae72091bea1628391075/config/database.yml before migrate: No such file or directory - /var/www/shared/config/database.yml or /var/www/releases/7404041cf8859a35de90ae72091bea1628391075/config/database.yml

Resource Declaration:
---------------------
# In /var/chef/cache/cookbooks/kapture/recipes/api.rb

 68: 
 69:   deploy_revision app_config['deploy_dir'] do
 70:     scm_provider Chef::Provider::Git 
 71:     repo app_config['deploy_repo']
 72:     revision app_config['deploy_branch']
 73:     if secrets["deploy_key"]
 74:       git_ssh_wrapper "#{app_config['deploy_dir']}/git-ssh-wrapper" # For private Git repos 
 75:     end
 76:     enable_submodules true

Compiled Resource:
------------------
# Declared in /var/chef/cache/cookbooks/kapture/recipes/api.rb:69:in `from_file'

deploy_revision("/var/www") do
  destination "/var/www/shared/cached-copy"
  symlink_before_migrate {"config/database.yml"=>"config/database.yml"}
  updated_by_last_action true
  restart_command #<Proc:0x00007f40f366e5a0@/var/chef/cache/cookbooks/kapture/recipes/api.rb:82>
  repository_cache "cached-copy"
  retries 0
  keep_releases 5
  create_dirs_before_symlink ["tmp", "public", "config"]
  updated true
  provider Chef::Provider::Deploy::Revision
  enable_submodules true
  deploy_to "/var/www"
  current_path "/var/www/current"
  recipe_name "api"
  revision "HEAD"
  scm_provider Chef::Provider::Git
  purge_before_symlink ["log", "tmp/pids", "public/system"]
  git_ssh_wrapper "/var/www/git-ssh-wrapper"
  remote "origin"
  shared_path "/var/www/shared"
  cookbook_name "kapture"
  symlinks {"log"=>"log", "system"=>"public/system", "pids"=>"tmp/pids"}
  action [:deploy]
  repo "git@github.com:kapture/api.git"
  retry_delay 2
end

[2012-09-24T15:42:07+00:00] ERROR: Running exception handlers
[2012-09-24T15:42:07+00:00] FATAL: Saving node information to /var/chef/cache/failed-run-data.json
[2012-09-24T15:42:07+00:00] ERROR: Exception handlers complete
[2012-09-24T15:42:07+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2012-09-24T15:42:07+00:00] FATAL: Chef::Exceptions::FileNotFound: deploy_revision[/var/www] (kapture::api line 69) had an error: Chef::Exceptions::FileNotFound: Cannot symlink /var/www/shared/config/database.yml to /var/www/releases/7404041cf8859a35de90ae72091bea1628391075/config/database.yml before migrate: No such file or directory - /var/www/shared/config/database.yml or /var/www/releases/7404041cf8859a35de90ae72091bea1628391075/config/database.yml

database.ymlここでは、 、tmp/system/およびフォルダに言及していることがわかりpidsます。これらはすべて、Chef が好んで設定するデフォルトです (関連するバグを参照) 。

質問1

これらのシンボリック リンクは何のためのもので、シンボリック リンクが必要かどうかはどうすればわかりますか。私はどのようなものをシンボリックリンクしていますか? 移行を使用するので、移行に役立つ場合は、それらが機能する必要があります。

私はドキュメントを何度も読みましたが、これが平易な英語であるとは説明していません-少なくとも私が見つけたものではありません.

質問2

それらを必要としない場合、シンボリックリンクを完全に無効にするにはどうすればよいですか? そのバグレポートの例に従っても役に立ちませんでした。

4

3 に答える 3

18

すべてのシンボリックリンク属性をクリアします。

deploy_revision("/var/www") do
  # ...
  symlink_before_migrate.clear
  create_dirs_before_symlink.clear
  purge_before_symlink.clear
  symlinks.clear
end
于 2012-09-24T16:25:29.930 に答える
3

共有の展開ディレクトリが適切なディレクトリ構造 (/var/www/shared/[log,pids,system,config]) であり、アプリケーションに必要なすべての構成ファイルが構成ディレクトリにあることを確認してください。

アプリケーションのクックブックのレシピには、このエラーが再び発生しないように (再帰的に) 作成するディレクトリ名の配列が含まれている必要があります。

シンボリック リンクが存在するため、アプリケーション コードは進化し続けますが、shared/log を current/log などにシンボリック リンクすることで、ログ、pids、およびシステム フォルダーを共有できます。

于 2012-09-24T16:33:04.663 に答える
1

Chefは、このトロールアプリケーションクックブックを使用して、ディレクトリ構造をキャッシュします(どういうわけか、私はそれを掘り下げていません)。これは、デプロイリソースに含まれているものであり、使用することはありませんが、作成されたディレクトリ構造などを削除することで修正できます/var/derp。また、tmpディレクトリが設定されていることを確認してください。

これが問題になる可能性があるいくつかの理由:

  • ファイルのアクセス許可が正しくありません
  • 現在実行中のchefユーザーはファイルにアクセスできません
  • applicationRailsデプロイの構成でクックブックを使用していて、アプリケーションのディレクトリ構造が同じではありません。

これは間違いなく、Chefがデプロイの状態をどこかにキャッシュし、その状態をキャッシュから読み取り(どこにいても)、それを再利用することが原因です。アプリケーションクックブックを調べて永続性を確認し、そこで見つからない場合は、chef自体からデプロイリソースを調べます。

于 2012-09-24T16:29:24.257 に答える