Skip to content

Commit

Permalink
Add application cookbook with updated documentation.
Browse files Browse the repository at this point in the history
  • Loading branch information
jtimberman committed Apr 29, 2010
1 parent 4bea009 commit 79913f9
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 3 deletions.
12 changes: 9 additions & 3 deletions application/README.txt
@@ -1,5 +1,3 @@
This is an unreleased cookbook, posted here for example purposes and will be released to the cookbooks.opscode.com when it is really ready.

Application cookbook
====================

Expand All @@ -9,6 +7,8 @@ This cookbook is initially designed to be able to describe and deploy web applic

Other application stacks (PHP, DJango, JBoss, etc) will be supported as new recipes at a later date.

This cookbook aims to provide primitives to install/deploy any kind of application driven entirely by data defined in an abstract way through a data bag.

---
Recipes
=======
Expand All @@ -18,7 +18,9 @@ The application cookbook contains the following recipes.
default
-------

Searches the `apps` data bag and checks that a server role in the app exists on this node, adds the app to the run state and uses the role for the app to locate the recipes that need to be used. See below regarding the application data bag structure.
Searches the `apps` data bag and checks that a server role in the app exists on this node, adds the app to the run state and uses the role for the app to locate the recipes that need to be used. The recipes listed in the "type" part of the data bag are included by this recipe, so only the "application" recipe needs to be in the node or role `run_list`.

See below regarding the application data bag structure.

rails
-----
Expand Down Expand Up @@ -60,6 +62,8 @@ The applications data bag expects certain values in order to configure parts of

The application used in examples is named `my_app` and the environment is `production`. Most top-level keys are Arrays, and each top-level key has an entry that describes what it is for, followed by the example entries. Entries that are hashes themselves will have the description in the value.

Note about "type": the recipes listed in the "type" will be included in the run list via `include_recipe` in the application default recipe.

Note about `databases`, the data specified will be rendered as the `database.yml` file.

Note about gems and packages, the version is optional. If specified, the version will be passed as a parameter to the resource. Otherwise it will use the latest available version per the default `:install` action for the package provider.
Expand Down Expand Up @@ -152,6 +156,8 @@ To use the application cookbook, we recommend creating a role named after the ap
"recipe[application]"
)

The idea with this recipe is that the additional recipes you need for the application are handled by specifying them in the application data bag's "type".

If you need other recipes, such as `mysql::client` add those as well. Then upload the role to the Chef Server.

% knife role from file roles/my_app.rb
Expand Down
41 changes: 41 additions & 0 deletions application/metadata.json
@@ -0,0 +1,41 @@
{
"recipes": {
},
"attributes": {
},
"providing": {
},
"platforms": {
},
"dependencies": {
"unicorn": [

],
"runit": [

],
"passenger_enterprise": [

],
"ruby_enterprise": [

]
},
"replacing": {
},
"version": "0.3.0",
"name": "application",
"groupings": {
},
"long_description": "Application cookbook\n====================\n\nThis cookbook is initially designed to be able to describe and deploy web applications. Currently supported:\n\n* Rails\n\nOther application stacks (PHP, DJango, JBoss, etc) will be supported as new recipes at a later date.\n\nThis cookbook aims to provide primitives to install/deploy any kind of application driven entirely by data defined in an abstract way through a data bag.\n\n---\nRecipes\n=======\n\nThe application cookbook contains the following recipes.\n\ndefault\n-------\n\nSearches the `apps` data bag and checks that a server role in the app exists on this node, adds the app to the run state and uses the role for the app to locate the recipes that need to be used. The recipes listed in the \"type\" part of the data bag are included by this recipe, so only the \"application\" recipe needs to be in the node or role `run_list`.\n\nSee below regarding the application data bag structure.\n\nrails\n-----\n\nUsing the node's `run_state` that contains the current application in the search, this recipe will install required packages and gems, set up the deployment scaffolding, creates database and memcached configurations if required and then performs a revision-based deploy.\n\nThis recipe can be used on nodes that are going to run the application, or on nodes that need to have the application code checkout available such as supporting utility nodes or a configured load balancer that needs static assets stored in the application repository.\n\nunicorn\n-------\n\nRequires `unicorn` cookbook.\n\nUnicorn is installed, default attributes are set for the node and an app specific unicorn config and runit service are created.\n\n---\nDeprecated Recipes\n==================\n\nThe following recipes are deprecated in favor of rails+unicorn, as that is performant enough for many Rails applications, and takes less time to provision new instances. Using these recipes may require additional work to the rest of the stack that wouldn't be required with rails+unicorn because they were early-phase development of this cookbook.\n\npassenger-nginx\n---------------\n\nBuilds passenger as an nginx module, drops off the configuration file and sets up the site to run the application under nginx with passenger. Does not deploy the code automatically.\n\nrails_nginx_ree_passenger\n-------------------------\n\nSets up the application stack with Ruby Enterprise Edition, Nginx and Passenger.\n\nThe recipe searches the apps data bag and then installs packages and gems, creates the nginx vhost config and enables the site, sets up the deployment scaffolding, and uses a revision-based deploy for the code. Database and memcached yaml files are written out as well, if required.\n\n---\nApplication Data Bag\n====================\n\nThe applications data bag expects certain values in order to configure parts of the recipe. Below is a paste of the JSON, where the value is a description of the key. Use your own values, as required. Note that this data bag is also used by the `database` cookbook, so it will contain database information as well. Items that may be ambiguous have an example.\n\nThe application used in examples is named `my_app` and the environment is `production`. Most top-level keys are Arrays, and each top-level key has an entry that describes what it is for, followed by the example entries. Entries that are hashes themselves will have the description in the value.\n\nNote about \"type\": the recipes listed in the \"type\" will be included in the run list via `include_recipe` in the application default recipe.\n\nNote about `databases`, the data specified will be rendered as the `database.yml` file.\n\nNote about gems and packages, the version is optional. If specified, the version will be passed as a parameter to the resource. Otherwise it will use the latest available version per the default `:install` action for the package provider.\n\n {\n \"id\": \"my_app\",\n \"server_roles\": [\n \"application specific role(s), typically the name of the app, e.g., my_app\",\n \"my_app\"\n ],\n \"type\": {\n \"my_app\": [\n \"recipes in this application cookbook to run for this role\",\n \"rails\",\n \"unicorn\"\n ]\n },\n \"memcached_role\": [\n \"name of the role used for the app-specific memcached server\",\n \"my_app_memcached\"\n ],\n \"database_slave_role\": [\n \"name of the role used by database slaves, typically named after the app, 'my_app_database_slave'\",\n \"my_app_database_slave\"\n ],\n \"database_master_role\": [\n \"name of the role used by database master, typically named after the app 'my_app_database_master'\",\n \"my_app_database_master\"\n ],\n \"repository\": \"git@github.com:company/my_app.git\",\n \"revision\": {\n \"production\": \"commit hash, branch or tag to deploy\"\n },\n \"force\": {\n \"production\": \"true or false w/o quotes to force deployment, see the rails.rb recipe\"\n },\n \"migrate\": {\n \"production\": \"true or false boolean to force migration, see rails.rb recipe\"\n },\n \"databases\": {\n \"db_name_production\": {\n \"reconnect\": \"true\",\n \"encoding\": \"utf8\",\n \"username\": \"db_user\",\n \"adapter\": \"mysql\",\n \"password\": \"awesome_password\",\n \"database\": \"db_name_production\"\n }\n },\n \"mysql_root_password\": {\n \"production\": \"password for the root user in mysql\"\n },\n \"mysql_debian_password\": {\n \"production\": \"password for the debian-sys-maint user on ubuntu/debian\"\n },\n \"mysql_repl_password\": {\n \"production\": \"password for the 'repl' user for replication.\"\n },\n \"snapshots_to_keep\": {\n \"production\": \"if using EBS, integer of the number of snapshots we're going to keep for this environment.\"\n },\n \"deploy_key\": \"SSH private key used to deploy from a private git repository\",\n \"deploy_to\": \"path to deploy, e.g. /srv/my_app\",\n \"owner\": \"owner for the application files when deployed\",\n \"group\": \"group for the application files when deployed\",\n \"packages\": {\n \"package_name\": \"specific packages required for installation at the OS level to run the app like libraries and specific version, e.g.\",\n \"curl\": \"7.19.5-1ubuntu2\"\n },\n \"gems\": {\n \"gem_name\": \"specific gems required for installation to run the application, and if a specific version is required, e.g.\",\n \"rails\": \"2.3.5\"\n },\n \"memcached\": {\n \"production\": {\n \"namespace\": \"specify the memcache namespace, ie my_app_environment\"\n }\n }\n }\n\n---\nUsage\n=====\n\nTo use the application cookbook, we recommend creating a role named after the application, e.g. `my_app`. In your chef-repo, create `roles/my_app.rb`. Also recommended is a site-cookbook named after the application, e.g. `my_app`, for additional application specific setup.\n\n name \"my_app\"\n description \"My application front end server.\"\n run_list(\n \"recipe[application]\"\n )\n\nThe idea with this recipe is that the additional recipes you need for the application are handled by specifying them in the application data bag's \"type\".\n\nIf you need other recipes, such as `mysql::client` add those as well. Then upload the role to the Chef Server.\n\n % knife role from file roles/my_app.rb\n\nAdd the role to a node. Create the data bag per the guidelines above, and run Chef to watch it deploy the application!\n\n---\nLicense and Author\n==================\n\nAuthor:: Adam Jacob (<adam@opscode.com>)\nAuthor:: Joshua Timberman (<joshua@opscode.com>)\n\nCopyright 2009-2010, Opscode, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
"recommendations": {
},
"license": "Apache 2.0",
"maintainer": "Opscode, Inc.",
"suggestions": {
},
"maintainer_email": "cookbooks@opscode.com",
"conflicting": {
},
"description": "Deploys and configures a Rails application from databag 'apps'"
}

0 comments on commit 79913f9

Please sign in to comment.