使用不相关的默认符号链接的Chef部署

时间:2012-09-24 16:04:56

标签: deployment chef

我正在尝试使用Chef部署我的应用程序代码,而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.ymltmp/system/pids个文件夹,所有这些都是Chef喜欢设置的默认值(请参阅{{3} })

问题1

这些符号链接是什么?如何知道我是否需要任何符号链接。符号化的是什么?我将使用迁移,因此如果它们对迁移有用,那么我将需要它们工作。

我已多次阅读文档,但这并不能解释这是简单的英语 - 至少不是我找到的。

问题2

如果我不需要它们,我怎样才能完全禁用符号链接?按照错误报告中的示例没有帮助。

3 个答案:

答案 0 :(得分:18)

清除所有符号链接属性。

deploy_revision("/var/www") do
  # ...
  symlink_before_migrate.clear
  create_dirs_before_symlink.clear
  purge_before_symlink.clear
  symlinks.clear
end

答案 1 :(得分:3)

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

您的应用程序食谱的配方应该有一系列目录名称(递归),以便您不会再次遇到此错误。

符号链接是存在的,这样当您的应用程序代码将继续发展时,您可以通过将共享/日志符号链接到当前/日志等来共享日志,pids和系统文件夹,依此类推......

答案 2 :(得分:1)

主厨碰巧缓存了目录结构 - 不知何故,我还没有挖掘它 - 使用这个troll应用程序cookbook。这是我认为的部署资源中的东西 - 我从不使用它 - 但您可以通过删除它在/var/derp或其他任何内容中创建的目录结构来修复它。还要确保设置tmp目录。

有几个原因可能是个问题:

  • 文件权限不正确
  • 当前正在运行的厨师用户无法访问该文件
  • 您正在使用导轨部署配置中的application食谱,而您的应用程序没有相同的目录结构。

这肯定是由Chef在某处缓存部署状态,然后从其缓存中读取该状态 - 无论在哪里 - 然后重用它。我会查看应用程序cookbook以查找任何持久性,如果您在那里找不到它,请查看chef本身的deploy资源。