poise / application_ruby

Development repository for Opscode Cookbook application_ruby
Apache License 2.0
124 stars 153 forks source link

application_unicorn resource's upstart template not generating a .conf file for service #88

Open SimonKaluza opened 7 years ago

SimonKaluza commented 7 years ago

During the convergence of our application block, Chef never winds up triggering the application_unicorn's Upstart LWRP provider's Upstart#create_service method that creates the Upstart conf file that governs the app.

Because this conf file never gets generated, Upstart does not recognize the service "my_app_web" and when Chef attempts to restart the service we get the exception output:

   ================================================================================
   Error executing action `restart` on resource 'application[my_app_web]'
   ================================================================================

   Mixlib::ShellOut::ShellCommandFailed
   ------------------------------------
   application_unicorn[my_app_web] (my_app-chef::app_server line 161) had an error: Mixlib::ShellOut::ShellCommandFailed: poise_service[my_app_web] (/var/chef/cache/cookbooks/my_app-chef/recipes/app_server.rb line 161) had an error: Mixlib::ShellOut::ShellCommandFailed: service[my_app_web_app] (/var/chef/cache/cookbooks/my_app-chef/recipes/app_server.rb line 161) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
   ---- Begin output of /sbin/start my_app_web_app ----
   STDOUT:
   STDERR: start: Unknown job: my_app_web_app
   ---- End output of /sbin/start my_app_web_app ----
   Ran /sbin/start my_app_web_app returned 1

   Cookbook Trace:
   ---------------
   /var/chef/cache/cookbooks/poise-service/files/halite_gem/poise_service/service_providers/base.rb:75:in `block in action_start'
   /var/chef/cache/cookbooks/poise-service/files/halite_gem/poise_service/service_providers/base.rb:135:in `notify_if_service'
   /var/chef/cache/cookbooks/poise-service/files/halite_gem/poise_service/service_providers/base.rb:74:in `action_start'
   /var/chef/cache/cookbooks/poise-service/files/halite_gem/poise_service/service_providers/upstart.rb:45:in `action_restart'
   /var/chef/cache/cookbooks/poise-service/files/halite_gem/poise_service/service_mixin.rb:125:in `block in action_restart'
   /var/chef/cache/cookbooks/poise-service/files/halite_gem/poise_service/service_mixin.rb:154:in `notify_if_service'
   /var/chef/cache/cookbooks/poise-service/files/halite_gem/poise_service/service_mixin.rb:124:in `action_restart'
   /var/chef/cache/cookbooks/application/files/halite_gem/poise_application/resources/application.rb:249:in `block in proxy_action'
   /var/chef/cache/cookbooks/application/files/halite_gem/poise_application/resources/application.rb:247:in `proxy_action'
   /var/chef/cache/cookbooks/application/files/halite_gem/poise_application/resources/application.rb:229:in `action_restart'

Here is our cookbook's full application block:

application 'my_app_web' do
  path "#{node['my_app']['app_deploy_root']}/latest"
  git 'git@github.com:myapp.git' do
    deploy_key deploy_key['rsa']
    revision node['my_app']['revision']
  end
  ruby_runtime 'my_app_ruby' do
    version '2.2'
    provider :ruby_build
  end

  bundle_install do
    path "#{node['my_app']['app_deploy_root']}/latest" # Have to respecify path?  Ghetto as fuck, thanks Poise cookbooks
    vendor true
  end

  rails do
    rails_env node['my_app']['environment_name']
    path "#{node['my_app']['app_deploy_root']}/latest"
    database({
                 adapter: 'postgresql',
                 database: node['my_app']['postgres']['database'],
                 timeout: 5000,
                 username: postgres_credentials['application_username'],
                 password: postgres_credentials['application_password'],
                 host: node['my_app']['master_db_ip'].nil? ? 'localhost' : node['my_app']['master_db_ip'],
                 pool: 100,
                 redis_url: "redis://#{node['my_app']['master_db_ip']}:6379"
             })
    precompile_assets true
    migrate true
  end

  unicorn do
    path "#{node['my_app']['app_deploy_root']}/latest"
    port '8080'
    service_name 'my_app_web_app'
    action :enable
  end
end
gaurish commented 7 years ago

i run into the same issue.

SimonKaluza commented 7 years ago

The core issue seems to be that the application_unicorn poise-service resource's "start" action is getting triggered before the enable action is run. Because the poise-service's action_enable method is what actually calls the create_service and generates the service's upstart template (and the start action is trying to use it before then), I think this calling order needs a restructuring.

coderanger commented 7 years ago

This almost always happens because Chef encounters an error and is trying to run queued notifications during shutdown. Look above that for another error message.

coderanger commented 7 years ago

Also you do not need to respecify the path property, it inherits from the application resource.