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

这是我部署代码的秘诀。请注意,我已尝试完全禁用符号链接,因为 Chef 总是将其自己的默认值插入其中。即使这样,我也会收到错误消息:

================================================================================
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

确保 shared 中的部署目录具有正确的目录结构(/var/www/shared/[log,pids,system,config]),并且应用程序所需的所有配置文件都在 config 目录中。

您的应用程序说明书的配方应该有一个要创建的目录名称数组(递归),这样您就不会再次遇到此错误。

符号链接在那里,因此当您的应用程序代码将继续发展时,您可以通过将 shared/log 符号链接到 current/log 等等来共享日志、pid 和系统文件夹。

于 2012-09-24T16:33:04.663 回答
1

Chef 碰巧缓存了目录结构 - 不知何故,我还没有深入研究过 - 使用这个巨魔应用程序说明书。我相信这是部署资源中的一些东西-我从不使用它-但是您可以通过删除它在其中创建的目录结构/var/derp或其他方式来修复它。还要确保您的 tmp 目录已设置。

这可能是一个问题的几个原因:

  • 文件权限不正确
  • 当前运行的 chef 用户无法访问该文件
  • application在 Rails 部署的配置中使用说明书,并且您的应用程序没有相同的目录结构。

这肯定是由于 Chef 在某处缓存了部署的状态,然后从缓存中读取该状态——无论它在哪里——然后重用它。我会查看应用程序说明书以查看任何持久性,如果您无法在那里找到它,请查看厨师本身的部署资源。

于 2012-09-24T16:29:24.257 回答