Развертывание шеф-повара с нерелевантными символическими ссылками

Я пытаюсь развернуть код приложения с шеф-поваром, который работает для одного node и не работает по другому. Я не могу определить, почему он работает для одного node, а не другого, когда у них есть тот же самый конфиг, но я могу хотя бы попытаться отладить проблему на node, которая терпит неудачу.

  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:[email protected]/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 "[email protected]: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, все из которых являются по умолчанию, которые нравится шеф-повару (см. связанная ошибка)

Вопрос 1

Для чего нужны эти символические ссылки и как я знаю, даже если они мне нужны. Какие вещи я символизирую? Я буду использовать миграции, поэтому, если они будут полезны для миграции, тогда мне понадобятся они.

Я читал документацию много раз, и это просто не объясняет, что это простой английский - по крайней мере, не тот, который я нашел.

Вопрос 2

Если я их не требую, как я могу полностью отключить symlinking? После примеров в этом отчете об ошибках не помогли.

Ответ 1

Очистите все атрибуты символической ссылки.

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

Ответ 2

Убедитесь, что каталог развертывания в папке общего доступа имеет правильную структуру каталогов (/var/www/shared/[log, pids, system, config]) и что все файлы конфигурации, необходимые для вашего приложения, находятся в каталоге конфигурации.

В вашем рецепте вашей куковой книги приложения должен быть массив имен каталогов для создания (рекурсивно), чтобы вы больше не столкнулись с этой ошибкой.

Символьные ссылки существуют, так что, пока код приложения будет продолжать развиваться, вы можете совместно использовать журнал, pids и системную папку, символизируя общий/журнал в текущий/журнал и т.д. и т.д.

Ответ 3

Шеф-повар, похоже, кэширует структуру каталогов - так или иначе, я не вникнул в это - с помощью этой поваренной книги приложения троллей. Я думаю, что это что-то в ресурсе развертывания, я никогда не использую этого, но вы можете исправить его, удалив структуру каталогов, которую он создает, в /var/derp или что-то еще. Также убедитесь, что ваш каталог tmp настроен.

Пара причин этого может быть проблемой:

  • Разрешения файла неверны
  • В настоящее время работающий пользователь chef не может получить доступ к файлу
  • Вы используете кучную книгу application в конфигурации для развертывания rails и ваше приложение не имеет той же структуры каталогов.

Это определенно вызвано тем, что Chef кэширует состояние развертывания где-то, а затем считывает это состояние из кэша - где бы это ни было - и затем повторно использует это. Я бы посмотрел на кулинарную книгу приложения, чтобы увидеть какое-либо сопротивление, и если вы не нашли его там, загляните в ресурс развертывания от самого шеф-повара.