metadata.json 17 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. {
  2. "name": "application",
  3. "description": "Deploys and configures a variety of applications defined from databag 'apps'",
  4. "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* Java\n\nOther application stacks (PHP, DJango, 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---\nRequirements\n============\n\nChef 0.8 or higher required.\n\nThe following Opscode cookbooks are dependencies:\n\n* runit\n* unicorn\n* apache2\n* tomcat\n\nThe following are also dependencies, though the recipes are considered deprecated, may be useful for future development.\n\n* `ruby_enterprise`\n* `passenger_enterprise`\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\n`java_webapp`\n-----------\n\nUsing the node's `run_state` that contains the current application in the search, this recipe will install required packages, set up the deployment scaffolding, create the context configuration for the servlet container and then performs a `remote_file` deploy.\n\nThe servlet container context configuration (`context.xml`) exposes the following JNDI resources which can be referenced by the webapp's deployment descriptor (web.xml):\n\n* A JDBC datasource for all databases in the node's current `app_environment`. The datasource uses the information (including JDBC driver) specified in the data bag item for the application.\n* An Environment entry that matches the node's current `app_environment` attribute value. This is useful for loading environment specific properties files in the web application. \n\nThis recipe assumes some sort of build process, such as Maven or a Continuous Integration server like Hudson, will create a deployable artifact and make it available for download via HTTP (such as S3).\n\n`passenger_apache2`\n-------------------\n\nRequires `apache2` and `passenger_apache2` cookbooks. The `recipe[apache2]` entry should come before `recipe[application]` in the run list.\n\n \"run_list\": [\n \"recipe[apache2]\",\n \"recipe[application]\"\n ],\n\nSets up a passenger vhost template for the application using the `apache2` cookbook's `web_app` definition. Use this with the `rails` recipe, in the list of recipes for a specific application type. See data bag example below.\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\nFor Gem Bundler: include `bundler` or `bundler08` in the gems list. `bundle install` or `gem bundle` will be run before migrations.\n\nFor config.gem in environment: `rake gems:install RAILS_ENV=<node environment>` will be run when a Gem Bundler command is not.\n\nIn order to manage running database migrations (rake db:migrate), you can use a role that sets the `run_migrations` attribute for the application (`my_app`, below) in the correct environment (production, below). Note the data bag item needs to have migrate set to true. See the data bag example below.\n\n {\n \"name\": \"my_app_run_migrations\",\n \"description\": \"Run db:migrate on demand for my_app\",\n \"json_class\": \"Chef::Role\",\n \"default_attributes\": {\n },\n \"override_attributes\": {\n \"apps\": {\n \"my_app\": {\n \"production\": {\n \"run_migrations\": true\n }\n }\n }\n },\n \"chef_type\": \"role\",\n \"run_list\": [\n ]\n }\n\nSimply apply this role to the node's run list when it is time to run migrations, and the recipe will remove the role when done.\n\ntomcat\n-------\n\nRequires `tomcat` cookbook.\n\nTomcat is installed, default attributes are set for the node and the app specific context.xml is symlinked over to Tomcat's context directory as the root context (ROOT.xml).\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 and have been removed from the cookbook. To retrieve an older version, reference commit 4396ce6.\n\n`passenger-nginx`\n`rails_nginx_ree_passenger`\n\n---\nApplication Data Bag (Rail's version)\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 based on the type matching one of the `server_roles` values.\n\nNote about `databases`, the data specified will be rendered as the `database.yml` file. In the `database` cookbook, this information is also used to set up privileges for the application user, and create the databases.\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 \"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\n---\nApplication Data Bag (Java webapp version)\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 based on the type matching one of the `server_roles` values.\n\nNote about `databases`, the data specified will be rendered as JNDI Datasource `Resources` in the servlet container context confiruation (`context.xml`) file. In the `database` cookbook, this information is also used to set up privileges for the application user, and create the databases.\n\nNote about 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 \"java_webapp\",\n \"tomcat\"\n ]\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 \"wars\": {\n \"production\": {\n \"source\": \"source url of WAR file to deploy\",\n \"checksum\": \"SHA256 (or portion thereof) of the WAR file to deploy\"\n }\n },\n \"databases\": {\n \"production\": {\n \"max_active\": \"100\",\n \"max_idle\": \"30\",\n \"max_wait\": \"10000\",\n \"username\": \"db_user\",\n \"adapter\": \"mysql\",\n \"driver\": \"com.mysql.jdbc.Driver\",\n \"port\": \"3306\",\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_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 }\n\n\n---\nUsage\n=====\n\nTo use the application cookbook, we recommend creating a role named after the application, e.g. `my_app`. This role should match one of the `server_roles` entries, that will correspond to a `type` entry, in the databag. Create a Ruby DSL role in your chef-repo, or create the role directly with knife.\n\n % knife role show my_app\n {\n \"name\": \"my_app\",\n \"chef_type\": \"role\",\n \"json_class\": \"Chef::Role\",\n \"default_attributes\": {\n },\n \"description\": \"\",\n \"run_list\": [\n \"recipe[application]\"\n ],\n \"override_attributes\": {\n }\n }\n\nAlso recommended is a cookbook named after the application, e.g. `my_app`, for additional application specific setup such as other config files for queues, search engines and other components of your application. The `my_app` recipe can be used in the run list of the role, if it includes the `application` recipe.\n\nYou should also have a role for the environment(s) you wish to use this cookbook. Similar to the role above, create the Ruby DSL file in chef-repo, or create with knife directly.\n\n % knife role show production\n {\n \"name\": \"production\",\n \"chef_type\": \"role\",\n \"json_class\": \"Chef::Role\",\n \"default_attributes\": {\n \"app_environment\": \"production\"\n },\n \"description\": \"production environment role\",\n \"run_list\": [\n\n ],\n \"override_attributes\": {\n }\n }\n\nThis role uses a default attribute so nodes can be moved into other environments on the fly simply by modifying their node object directly on the Chef Server.\n\n---\nLicense and Author\n==================\n\nAuthor:: Adam Jacob (<adam@opscode.com>)\nAuthor:: Joshua Timberman (<joshua@opscode.com>)\nAuthor:: Seth Chisamore (<schisamo@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",
  5. "maintainer": "Opscode, Inc.",
  6. "maintainer_email": "cookbooks@opscode.com",
  7. "license": "Apache 2.0",
  8. "platforms": {
  9. },
  10. "dependencies": {
  11. "runit": [
  12. ],
  13. "unicorn": [
  14. ],
  15. "apache2": [
  16. ],
  17. "passenger_apache2": [
  18. ],
  19. "tomcat": [
  20. ]
  21. },
  22. "recommendations": {
  23. },
  24. "suggestions": {
  25. },
  26. "conflicting": {
  27. },
  28. "providing": {
  29. },
  30. "replacing": {
  31. },
  32. "attributes": {
  33. },
  34. "groupings": {
  35. },
  36. "recipes": {
  37. "application": "Loads application databags and selects recipes to use",
  38. "application::java_webapp": "Deploys a Java web application WAR specified in a data bag with the remote_file resource",
  39. "application::passenger_apache2": "Sets up a deployed Rails application as a Passenger virtual host in Apache2",
  40. "application::rails": "Deploys a Rails application specified in a data bag with the deploy_revision resource",
  41. "application::tomcat": "Sets up the deployed Java application with Tomcat as the servlet container",
  42. "application::unicorn": "Sets up the deployed Rails application with Unicorn as the web server"
  43. },
  44. "version": "0.99.2"
  45. }