我正在尝试使用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.yml
,tmp/
,system/
和pids
个文件夹,所有这些都是Chef喜欢设置的默认值(请参阅{{3} })
问题1
这些符号链接是什么?如何知道我是否需要任何符号链接。符号化的是什么?我将使用迁移,因此如果它们对迁移有用,那么我将需要它们工作。
我已多次阅读文档,但这并不能解释这是简单的英语 - 至少不是我找到的。
问题2
如果我不需要它们,我怎样才能完全禁用符号链接?按照错误报告中的示例没有帮助。
答案 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资源。