Search code examples
chef-infrachef-recipe

Extending application_php chef cookbook returns RecipeNotFound error


I've been playing with chef lately to deploy an application. I'm trying to build on top of the application and application_php cookbooks provided by opscode. But I'm a bit new to chef and I don't really understand how I'm suppose to do it.

I created a cookbook for my app. And the recipe looks something like this currently:

app = node.run_state[:current_app]

secrets = Chef::EncryptedDataBagItem.load("secrets", "my_app")

application "my_app" do
  path "/var/www/sites/my_app/current"
  owner node['my_app']['owner']
  group node['my_app']['group']
  repository "some repository here"
  if secrets["deploy_key"]
    ruby_block "write_key" do
      block do
        f = ::File.open("#{app['deploy_to']}/id_deploy", "w")
        f.print(secrets["deploy_key"])
        f.close
      end
      not_if do ::File.exists?("#{app['deploy_to']}/id_deploy"); end
    end

    file "#{app['deploy_to']}/id_deploy" do
      owner node['my_app']['owner']
      group node['my_app']['group']
      mode '0600'
    end

    template "#{app['deploy_to']}/deploy-ssh-wrapper" do
      source "deploy-ssh-wrapper.erb"
      owner node['my_app']['owner']
      group node['my_app']['group']
      mode "0755"
      variables app.to_hash
    end
  end
end

Role: my_app.json

{
    "name": "my_app",
    "chef_type": "role",
    "json_class": "Chef::Role",
    "default_attributes": {
    },
    "description": "Install my_app Web Server",
    "run_list": [
        "recipe[apache2]",
        "recipe[php]",
        "recipe[application]",
        "recipe[my_app]"
    ],
    "override_attributes": {
    }
}

But when I run knife bootstrap example.com -r role[my_app] ... I get the following error:

================================================================================
Recipe Compile Error
================================================================================

Chef::Exceptions::RecipeNotFound
--------------------------------
could not find recipe my_app for cookbook application

[2012-11-12T15:22:10+00:00] ERROR: Running exception handlers
[2012-11-12T15:22:10+00:00] FATAL: Saving node information to /var/chef/cache/failed-run-data.json
[2012-11-12T15:22:10+00:00] ERROR: Exception handlers complete
[2012-11-12T15:22:10+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2012-11-12T15:22:10+00:00] FATAL: Chef::Exceptions::RecipeNotFound: could not find recipe my_app for cookbook application

Seems like doing something right. Does anyone know how I should be extending application and application_php cookbooks?


Solution

  • I realized I was doing it all wrong hehe. Seems like most of the tutorials I found online were using the deprecated method of doing things.

    The application stack takes care of everything for you. No need to make the deploy code.

    To make it work you need to remove application for the run list. To make use of application and application_php you need to define the dependency in metadata.rb.

    Then you can just create the recipe like so:

    secrets = Chef::EncryptedDataBagItem.load("secrets", "my_app")
    
    application "my_app" do
      path "/var/www/my_app"
      repository "repository url"
      revision "master"
      deploy_key secrets["deploy_key"]
    end