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?
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