rubber-jcarnegie 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. data/CHANGELOG +477 -0
  2. data/COPYING +339 -0
  3. data/README +6 -0
  4. data/TODO +11 -0
  5. data/VERSION +1 -0
  6. data/bin/vulcanize +25 -0
  7. data/generators/vulcanize/USAGE +6 -0
  8. data/generators/vulcanize/templates/apache/config/rubber/deploy-apache.rb +51 -0
  9. data/generators/vulcanize/templates/apache/config/rubber/role/apache/deflate.conf +10 -0
  10. data/generators/vulcanize/templates/apache/config/rubber/role/apache/expires.conf +9 -0
  11. data/generators/vulcanize/templates/apache/config/rubber/role/apache/headers.conf +6 -0
  12. data/generators/vulcanize/templates/apache/config/rubber/role/apache/monit-apache.conf +8 -0
  13. data/generators/vulcanize/templates/apache/config/rubber/role/apache/ports.conf +8 -0
  14. data/generators/vulcanize/templates/apache/config/rubber/role/apache/setenvif.conf +52 -0
  15. data/generators/vulcanize/templates/apache/config/rubber/role/web_tools/tools-apache-vhost.conf +79 -0
  16. data/generators/vulcanize/templates/apache/config/rubber/role/web_tools/tools-apache.auth +7 -0
  17. data/generators/vulcanize/templates/apache/config/rubber/role/web_tools/tools-index.html +34 -0
  18. data/generators/vulcanize/templates/apache/config/rubber/rubber-apache.yml +6 -0
  19. data/generators/vulcanize/templates/apache/templates.yml +1 -0
  20. data/generators/vulcanize/templates/base/Capfile +14 -0
  21. data/generators/vulcanize/templates/base/Rakefile +23 -0
  22. data/generators/vulcanize/templates/base/config/deploy.rb +56 -0
  23. data/generators/vulcanize/templates/base/config/rubber/common/crontab +22 -0
  24. data/generators/vulcanize/templates/base/config/rubber/common/monit-postfix.conf +8 -0
  25. data/generators/vulcanize/templates/base/config/rubber/common/rubber.profile +13 -0
  26. data/generators/vulcanize/templates/base/config/rubber/deploy-setup.rb +92 -0
  27. data/generators/vulcanize/templates/base/config/rubber/deploy-util.rb +97 -0
  28. data/generators/vulcanize/templates/base/config/rubber/rubber-dns.yml +78 -0
  29. data/generators/vulcanize/templates/base/config/rubber/rubber-rvm.yml +33 -0
  30. data/generators/vulcanize/templates/base/config/rubber/rubber.yml +241 -0
  31. data/generators/vulcanize/templates/base/lib/tasks/rubber.rake +15 -0
  32. data/generators/vulcanize/templates/base/script/cron-rake +18 -0
  33. data/generators/vulcanize/templates/base/script/cron-runner +18 -0
  34. data/generators/vulcanize/templates/base/script/cron-sh +67 -0
  35. data/generators/vulcanize/templates/base/templates.rb +11 -0
  36. data/generators/vulcanize/templates/base/templates.yml +6 -0
  37. data/generators/vulcanize/templates/cassandra/config/rubber/deploy-cassandra.rb +88 -0
  38. data/generators/vulcanize/templates/cassandra/config/rubber/role/cassandra/cassandra.in.sh +60 -0
  39. data/generators/vulcanize/templates/cassandra/config/rubber/role/cassandra/cassandra.yaml +210 -0
  40. data/generators/vulcanize/templates/cassandra/config/rubber/role/cassandra/log4j-server.properties +45 -0
  41. data/generators/vulcanize/templates/cassandra/config/rubber/role/cassandra/monit-cassandra.conf +8 -0
  42. data/generators/vulcanize/templates/cassandra/config/rubber/rubber-cassandra.yml +18 -0
  43. data/generators/vulcanize/templates/cassandra/templates.yml +1 -0
  44. data/generators/vulcanize/templates/complete_mongrel_mysql/config/rubber/role/haproxy/haproxy-mongrel.conf +23 -0
  45. data/generators/vulcanize/templates/complete_mongrel_mysql/config/rubber/role/nginx/nginx-mongrel.conf +113 -0
  46. data/generators/vulcanize/templates/complete_mongrel_mysql/config/rubber/rubber-complete.yml +41 -0
  47. data/generators/vulcanize/templates/complete_mongrel_mysql/templates.yml +6 -0
  48. data/generators/vulcanize/templates/complete_passenger/config/rubber/role/haproxy/haproxy-passenger.conf +21 -0
  49. data/generators/vulcanize/templates/complete_passenger/config/rubber/rubber-complete.yml +40 -0
  50. data/generators/vulcanize/templates/complete_passenger/templates.rb +9 -0
  51. data/generators/vulcanize/templates/complete_passenger/templates.yml +9 -0
  52. data/generators/vulcanize/templates/complete_passenger_mysql/templates.yml +4 -0
  53. data/generators/vulcanize/templates/complete_passenger_postgresql/templates.yml +4 -0
  54. data/generators/vulcanize/templates/cruise/config/rubber/deploy-cruise.rb +72 -0
  55. data/generators/vulcanize/templates/cruise/config/rubber/role/cruise/cruise +40 -0
  56. data/generators/vulcanize/templates/cruise/config/rubber/role/cruise/my.cnf +165 -0
  57. data/generators/vulcanize/templates/cruise/config/rubber/role/cruise/production.rb +8 -0
  58. data/generators/vulcanize/templates/cruise/config/rubber/role/cruise/site_config.rb +76 -0
  59. data/generators/vulcanize/templates/cruise/config/rubber/role/web_tools/cruise-nginx.conf +11 -0
  60. data/generators/vulcanize/templates/cruise/config/rubber/rubber-cruise.yml +18 -0
  61. data/generators/vulcanize/templates/cruise/templates.yml +1 -0
  62. data/generators/vulcanize/templates/haproxy/config/rubber/deploy-haproxy.rb +45 -0
  63. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/haproxy-base.conf +26 -0
  64. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/haproxy-default.conf +8 -0
  65. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/monit-haproxy.conf +9 -0
  66. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/syslog-haproxy.conf +11 -0
  67. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/syslogd-default.conf +21 -0
  68. data/generators/vulcanize/templates/haproxy/config/rubber/role/web_tools/haproxy-nginx.conf +10 -0
  69. data/generators/vulcanize/templates/haproxy/config/rubber/rubber-haproxy.yml +7 -0
  70. data/generators/vulcanize/templates/haproxy/templates.yml +1 -0
  71. data/generators/vulcanize/templates/jetty/config/rubber/deploy-jetty.rb +59 -0
  72. data/generators/vulcanize/templates/jetty/config/rubber/role/jetty/jetty.sh +589 -0
  73. data/generators/vulcanize/templates/jetty/config/rubber/role/jetty/jetty.xml +199 -0
  74. data/generators/vulcanize/templates/jetty/config/rubber/role/jetty/monit-jetty.conf +9 -0
  75. data/generators/vulcanize/templates/jetty/config/rubber/rubber-jetty.yml +10 -0
  76. data/generators/vulcanize/templates/jetty/templates.yml +1 -0
  77. data/generators/vulcanize/templates/memcached/config/memcached.yml +28 -0
  78. data/generators/vulcanize/templates/memcached/config/rubber/common/memcached.yml +14 -0
  79. data/generators/vulcanize/templates/memcached/config/rubber/role/memcached/memcached.conf +52 -0
  80. data/generators/vulcanize/templates/memcached/config/rubber/role/memcached/memcached_munin_plugin +249 -0
  81. data/generators/vulcanize/templates/memcached/config/rubber/rubber-memcached.yml +7 -0
  82. data/generators/vulcanize/templates/memcached/templates.yml +1 -0
  83. data/generators/vulcanize/templates/minimal_mysql/templates.yml +7 -0
  84. data/generators/vulcanize/templates/minimal_nodb/templates.yml +6 -0
  85. data/generators/vulcanize/templates/mongrel/config/rubber/deploy-mongrel.rb +75 -0
  86. data/generators/vulcanize/templates/mongrel/config/rubber/role/mongrel/mongrel_cluster.yml +12 -0
  87. data/generators/vulcanize/templates/mongrel/config/rubber/role/mongrel/monit-mongrel.conf +20 -0
  88. data/generators/vulcanize/templates/mongrel/config/rubber/rubber-mongrel.yml +9 -0
  89. data/generators/vulcanize/templates/mongrel/templates.yml +1 -0
  90. data/generators/vulcanize/templates/monit/config/rubber/common/monit-default.conf +15 -0
  91. data/generators/vulcanize/templates/monit/config/rubber/common/monit.conf +252 -0
  92. data/generators/vulcanize/templates/monit/config/rubber/deploy-monit.rb +33 -0
  93. data/generators/vulcanize/templates/monit/config/rubber/role/web_tools/monit-admin-nginx.conf +10 -0
  94. data/generators/vulcanize/templates/monit/config/rubber/rubber-monit.yml +6 -0
  95. data/generators/vulcanize/templates/monit/templates.yml +1 -0
  96. data/generators/vulcanize/templates/munin/config/rubber/common/monit-munin.conf +8 -0
  97. data/generators/vulcanize/templates/munin/config/rubber/common/munin-node.conf +48 -0
  98. data/generators/vulcanize/templates/munin/config/rubber/common/munin-plugins.conf +11 -0
  99. data/generators/vulcanize/templates/munin/config/rubber/deploy-munin.rb +46 -0
  100. data/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin-nginx.conf +8 -0
  101. data/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin-plugins.conf +31 -0
  102. data/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin.conf +115 -0
  103. data/generators/vulcanize/templates/munin/config/rubber/rubber-munin.yml +8 -0
  104. data/generators/vulcanize/templates/munin/script/munin/example_mysql_query.rb +55 -0
  105. data/generators/vulcanize/templates/munin/script/munin/example_simple.rb +24 -0
  106. data/generators/vulcanize/templates/munin/templates.yml +1 -0
  107. data/generators/vulcanize/templates/mysql/config/rubber/common/database.yml +12 -0
  108. data/generators/vulcanize/templates/mysql/config/rubber/deploy-mysql.rb +169 -0
  109. data/generators/vulcanize/templates/mysql/config/rubber/role/db/apparmor-mysql.conf +46 -0
  110. data/generators/vulcanize/templates/mysql/config/rubber/role/db/crontab +14 -0
  111. data/generators/vulcanize/templates/mysql/config/rubber/role/db/monit-mysql.cnf +10 -0
  112. data/generators/vulcanize/templates/mysql/config/rubber/role/db/my.cnf +163 -0
  113. data/generators/vulcanize/templates/mysql/config/rubber/role/mysql_slave/mysql_slave_munin_plugin +51 -0
  114. data/generators/vulcanize/templates/mysql/config/rubber/rubber-mysql.yml +47 -0
  115. data/generators/vulcanize/templates/mysql/templates.yml +1 -0
  116. data/generators/vulcanize/templates/mysql_cluster/config/rubber/common/mysql_cluster_migrations.rb +13 -0
  117. data/generators/vulcanize/templates/mysql_cluster/config/rubber/deploy-mysql_cluster.rb +177 -0
  118. data/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_data/my.cnf +15 -0
  119. data/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_mgm/ndb_mgmd.cnf +39 -0
  120. data/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_sql/monit-mysql_cluster_sql.cnf +10 -0
  121. data/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_sql/my.cnf +23 -0
  122. data/generators/vulcanize/templates/mysql_cluster/config/rubber/rubber-mysql_cluster.yml +32 -0
  123. data/generators/vulcanize/templates/mysql_cluster/templates.yml +1 -0
  124. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/database.yml +16 -0
  125. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/monit-mysql_proxy.cnf +10 -0
  126. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/mysql-proxy +153 -0
  127. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/mysql-proxy.conf +10 -0
  128. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/mysql-proxy.lua +5 -0
  129. data/generators/vulcanize/templates/mysql_proxy/config/rubber/deploy-mysql_proxy.rb +52 -0
  130. data/generators/vulcanize/templates/mysql_proxy/config/rubber/rubber-mysql_proxy.yml +11 -0
  131. data/generators/vulcanize/templates/mysql_proxy/templates.yml +1 -0
  132. data/generators/vulcanize/templates/nginx/config/rubber/deploy-nginx.rb +45 -0
  133. data/generators/vulcanize/templates/nginx/config/rubber/role/nginx/crontab +9 -0
  134. data/generators/vulcanize/templates/nginx/config/rubber/role/nginx/monit-nginx.conf +8 -0
  135. data/generators/vulcanize/templates/nginx/config/rubber/role/nginx/nginx.conf +42 -0
  136. data/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/nginx-tools.conf +55 -0
  137. data/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/tools-index.html +30 -0
  138. data/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/tools-nginx.auth +7 -0
  139. data/generators/vulcanize/templates/nginx/config/rubber/rubber-nginx.yml +10 -0
  140. data/generators/vulcanize/templates/nginx/templates.yml +1 -0
  141. data/generators/vulcanize/templates/node/INSTALL_NOTES +20 -0
  142. data/generators/vulcanize/templates/node/config/rubber/deploy-node.rb +33 -0
  143. data/generators/vulcanize/templates/node/config/rubber/rubber-node.yml +1 -0
  144. data/generators/vulcanize/templates/passenger/config/rubber/deploy-passenger.rb +45 -0
  145. data/generators/vulcanize/templates/passenger/config/rubber/role/passenger/munin-passenger-memory.conf +34 -0
  146. data/generators/vulcanize/templates/passenger/config/rubber/role/passenger/munin-passenger-sudoers.conf +8 -0
  147. data/generators/vulcanize/templates/passenger/config/rubber/role/passenger/munin-passenger.conf +47 -0
  148. data/generators/vulcanize/templates/passenger/config/rubber/role/passenger/passenger-apache-vhost.conf +48 -0
  149. data/generators/vulcanize/templates/passenger/config/rubber/role/passenger/passenger.conf +41 -0
  150. data/generators/vulcanize/templates/passenger/config/rubber/rubber-passenger.yml +15 -0
  151. data/generators/vulcanize/templates/passenger/templates.yml +3 -0
  152. data/generators/vulcanize/templates/postgresql/config/rubber/common/database.yml +12 -0
  153. data/generators/vulcanize/templates/postgresql/config/rubber/deploy-postgresql.rb +158 -0
  154. data/generators/vulcanize/templates/postgresql/config/rubber/role/db/crontab +14 -0
  155. data/generators/vulcanize/templates/postgresql/config/rubber/role/db/monit-postgresql.conf +10 -0
  156. data/generators/vulcanize/templates/postgresql/config/rubber/role/db/munin-postgresql.conf +7 -0
  157. data/generators/vulcanize/templates/postgresql/config/rubber/role/db/pg_hba.conf +89 -0
  158. data/generators/vulcanize/templates/postgresql/config/rubber/role/db/postgresql-sysctl.conf +6 -0
  159. data/generators/vulcanize/templates/postgresql/config/rubber/role/db/postgresql.conf +531 -0
  160. data/generators/vulcanize/templates/postgresql/config/rubber/rubber-postgresql.yml +45 -0
  161. data/generators/vulcanize/templates/postgresql/templates.yml +1 -0
  162. data/generators/vulcanize/templates/redis/config/rubber/deploy-redis.rb +76 -0
  163. data/generators/vulcanize/templates/redis/config/rubber/role/redis/crontab +8 -0
  164. data/generators/vulcanize/templates/redis/config/rubber/role/redis/monit-redis.conf +9 -0
  165. data/generators/vulcanize/templates/redis/config/rubber/role/redis/redis.conf +320 -0
  166. data/generators/vulcanize/templates/redis/config/rubber/rubber-redis.yml +9 -0
  167. data/generators/vulcanize/templates/redis/templates.yml +1 -0
  168. data/generators/vulcanize/templates/resque/config/initializers/resque.rb +15 -0
  169. data/generators/vulcanize/templates/resque/config/rubber/common/resque.yml +5 -0
  170. data/generators/vulcanize/templates/resque/config/rubber/deploy-resque.rb +58 -0
  171. data/generators/vulcanize/templates/resque/config/rubber/role/resque_web/monit-resque_web.conf +14 -0
  172. data/generators/vulcanize/templates/resque/config/rubber/role/resque_worker/monit-resque_worker.conf +19 -0
  173. data/generators/vulcanize/templates/resque/config/rubber/rubber-resque.yml +18 -0
  174. data/generators/vulcanize/templates/resque/script/resque_worker_management.rb +144 -0
  175. data/generators/vulcanize/templates/resque/templates.rb +1 -0
  176. data/generators/vulcanize/templates/resque/templates.yml +3 -0
  177. data/generators/vulcanize/templates/sphinx/config/rubber/common/sphinx.yml +46 -0
  178. data/generators/vulcanize/templates/sphinx/config/rubber/deploy-sphinx.rb +112 -0
  179. data/generators/vulcanize/templates/sphinx/config/rubber/role/sphinx/crontab +11 -0
  180. data/generators/vulcanize/templates/sphinx/config/rubber/role/sphinx/monit-sphinx.conf +13 -0
  181. data/generators/vulcanize/templates/sphinx/config/rubber/rubber-sphinx.yml +6 -0
  182. data/generators/vulcanize/templates/sphinx/templates.yml +1 -0
  183. data/generators/vulcanize/vulcanize_generator.rb +184 -0
  184. data/lib/capistrano/hostcmd.rb +12 -0
  185. data/lib/generators/vulcanize/USAGE +6 -0
  186. data/lib/generators/vulcanize/templates/apache/config/rubber/deploy-apache.rb +51 -0
  187. data/lib/generators/vulcanize/templates/apache/config/rubber/role/apache/deflate.conf +10 -0
  188. data/lib/generators/vulcanize/templates/apache/config/rubber/role/apache/expires.conf +9 -0
  189. data/lib/generators/vulcanize/templates/apache/config/rubber/role/apache/headers.conf +6 -0
  190. data/lib/generators/vulcanize/templates/apache/config/rubber/role/apache/monit-apache.conf +8 -0
  191. data/lib/generators/vulcanize/templates/apache/config/rubber/role/apache/ports.conf +8 -0
  192. data/lib/generators/vulcanize/templates/apache/config/rubber/role/apache/setenvif.conf +52 -0
  193. data/lib/generators/vulcanize/templates/apache/config/rubber/role/web_tools/tools-apache-vhost.conf +79 -0
  194. data/lib/generators/vulcanize/templates/apache/config/rubber/role/web_tools/tools-apache.auth +7 -0
  195. data/lib/generators/vulcanize/templates/apache/config/rubber/role/web_tools/tools-index.html +34 -0
  196. data/lib/generators/vulcanize/templates/apache/config/rubber/rubber-apache.yml +6 -0
  197. data/lib/generators/vulcanize/templates/apache/templates.yml +1 -0
  198. data/lib/generators/vulcanize/templates/base/Capfile +14 -0
  199. data/lib/generators/vulcanize/templates/base/Rakefile +23 -0
  200. data/lib/generators/vulcanize/templates/base/config/deploy.rb +56 -0
  201. data/lib/generators/vulcanize/templates/base/config/rubber/common/crontab +22 -0
  202. data/lib/generators/vulcanize/templates/base/config/rubber/common/monit-postfix.conf +8 -0
  203. data/lib/generators/vulcanize/templates/base/config/rubber/common/rubber.profile +13 -0
  204. data/lib/generators/vulcanize/templates/base/config/rubber/deploy-setup.rb +92 -0
  205. data/lib/generators/vulcanize/templates/base/config/rubber/deploy-util.rb +97 -0
  206. data/lib/generators/vulcanize/templates/base/config/rubber/rubber-dns.yml +78 -0
  207. data/lib/generators/vulcanize/templates/base/config/rubber/rubber-rvm.yml +33 -0
  208. data/lib/generators/vulcanize/templates/base/config/rubber/rubber.yml +241 -0
  209. data/lib/generators/vulcanize/templates/base/lib/tasks/rubber.rake +15 -0
  210. data/lib/generators/vulcanize/templates/base/script/cron-rake +18 -0
  211. data/lib/generators/vulcanize/templates/base/script/cron-runner +18 -0
  212. data/lib/generators/vulcanize/templates/base/script/cron-sh +67 -0
  213. data/lib/generators/vulcanize/templates/base/templates.rb +11 -0
  214. data/lib/generators/vulcanize/templates/base/templates.yml +6 -0
  215. data/lib/generators/vulcanize/templates/cassandra/config/rubber/deploy-cassandra.rb +88 -0
  216. data/lib/generators/vulcanize/templates/cassandra/config/rubber/role/cassandra/cassandra.in.sh +60 -0
  217. data/lib/generators/vulcanize/templates/cassandra/config/rubber/role/cassandra/cassandra.yaml +210 -0
  218. data/lib/generators/vulcanize/templates/cassandra/config/rubber/role/cassandra/log4j-server.properties +45 -0
  219. data/lib/generators/vulcanize/templates/cassandra/config/rubber/role/cassandra/monit-cassandra.conf +8 -0
  220. data/lib/generators/vulcanize/templates/cassandra/config/rubber/rubber-cassandra.yml +18 -0
  221. data/lib/generators/vulcanize/templates/cassandra/templates.yml +1 -0
  222. data/lib/generators/vulcanize/templates/complete_mongrel_mysql/config/rubber/role/haproxy/haproxy-mongrel.conf +23 -0
  223. data/lib/generators/vulcanize/templates/complete_mongrel_mysql/config/rubber/role/nginx/nginx-mongrel.conf +113 -0
  224. data/lib/generators/vulcanize/templates/complete_mongrel_mysql/config/rubber/rubber-complete.yml +41 -0
  225. data/lib/generators/vulcanize/templates/complete_mongrel_mysql/templates.yml +6 -0
  226. data/lib/generators/vulcanize/templates/complete_passenger/config/rubber/role/haproxy/haproxy-passenger.conf +21 -0
  227. data/lib/generators/vulcanize/templates/complete_passenger/config/rubber/rubber-complete.yml +40 -0
  228. data/lib/generators/vulcanize/templates/complete_passenger/templates.rb +9 -0
  229. data/lib/generators/vulcanize/templates/complete_passenger/templates.yml +9 -0
  230. data/lib/generators/vulcanize/templates/complete_passenger_mysql/templates.yml +4 -0
  231. data/lib/generators/vulcanize/templates/complete_passenger_postgresql/templates.yml +4 -0
  232. data/lib/generators/vulcanize/templates/cruise/config/rubber/deploy-cruise.rb +72 -0
  233. data/lib/generators/vulcanize/templates/cruise/config/rubber/role/cruise/cruise +40 -0
  234. data/lib/generators/vulcanize/templates/cruise/config/rubber/role/cruise/my.cnf +165 -0
  235. data/lib/generators/vulcanize/templates/cruise/config/rubber/role/cruise/production.rb +8 -0
  236. data/lib/generators/vulcanize/templates/cruise/config/rubber/role/cruise/site_config.rb +76 -0
  237. data/lib/generators/vulcanize/templates/cruise/config/rubber/role/web_tools/cruise-nginx.conf +11 -0
  238. data/lib/generators/vulcanize/templates/cruise/config/rubber/rubber-cruise.yml +18 -0
  239. data/lib/generators/vulcanize/templates/cruise/templates.yml +1 -0
  240. data/lib/generators/vulcanize/templates/haproxy/config/rubber/deploy-haproxy.rb +45 -0
  241. data/lib/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/haproxy-base.conf +26 -0
  242. data/lib/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/haproxy-default.conf +8 -0
  243. data/lib/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/monit-haproxy.conf +9 -0
  244. data/lib/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/syslog-haproxy.conf +11 -0
  245. data/lib/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/syslogd-default.conf +21 -0
  246. data/lib/generators/vulcanize/templates/haproxy/config/rubber/role/web_tools/haproxy-nginx.conf +10 -0
  247. data/lib/generators/vulcanize/templates/haproxy/config/rubber/rubber-haproxy.yml +7 -0
  248. data/lib/generators/vulcanize/templates/haproxy/templates.yml +1 -0
  249. data/lib/generators/vulcanize/templates/jetty/config/rubber/deploy-jetty.rb +59 -0
  250. data/lib/generators/vulcanize/templates/jetty/config/rubber/role/jetty/jetty.sh +589 -0
  251. data/lib/generators/vulcanize/templates/jetty/config/rubber/role/jetty/jetty.xml +199 -0
  252. data/lib/generators/vulcanize/templates/jetty/config/rubber/role/jetty/monit-jetty.conf +9 -0
  253. data/lib/generators/vulcanize/templates/jetty/config/rubber/rubber-jetty.yml +10 -0
  254. data/lib/generators/vulcanize/templates/jetty/templates.yml +1 -0
  255. data/lib/generators/vulcanize/templates/memcached/config/memcached.yml +28 -0
  256. data/lib/generators/vulcanize/templates/memcached/config/rubber/common/memcached.yml +14 -0
  257. data/lib/generators/vulcanize/templates/memcached/config/rubber/role/memcached/memcached.conf +52 -0
  258. data/lib/generators/vulcanize/templates/memcached/config/rubber/role/memcached/memcached_munin_plugin +249 -0
  259. data/lib/generators/vulcanize/templates/memcached/config/rubber/rubber-memcached.yml +7 -0
  260. data/lib/generators/vulcanize/templates/memcached/templates.yml +1 -0
  261. data/lib/generators/vulcanize/templates/minimal_mysql/templates.yml +7 -0
  262. data/lib/generators/vulcanize/templates/minimal_nodb/templates.yml +6 -0
  263. data/lib/generators/vulcanize/templates/mongrel/config/rubber/deploy-mongrel.rb +75 -0
  264. data/lib/generators/vulcanize/templates/mongrel/config/rubber/role/mongrel/mongrel_cluster.yml +12 -0
  265. data/lib/generators/vulcanize/templates/mongrel/config/rubber/role/mongrel/monit-mongrel.conf +20 -0
  266. data/lib/generators/vulcanize/templates/mongrel/config/rubber/rubber-mongrel.yml +9 -0
  267. data/lib/generators/vulcanize/templates/mongrel/templates.yml +1 -0
  268. data/lib/generators/vulcanize/templates/monit/config/rubber/common/monit-default.conf +15 -0
  269. data/lib/generators/vulcanize/templates/monit/config/rubber/common/monit.conf +252 -0
  270. data/lib/generators/vulcanize/templates/monit/config/rubber/deploy-monit.rb +33 -0
  271. data/lib/generators/vulcanize/templates/monit/config/rubber/role/web_tools/monit-admin-nginx.conf +10 -0
  272. data/lib/generators/vulcanize/templates/monit/config/rubber/rubber-monit.yml +6 -0
  273. data/lib/generators/vulcanize/templates/monit/templates.yml +1 -0
  274. data/lib/generators/vulcanize/templates/munin/config/rubber/common/monit-munin.conf +8 -0
  275. data/lib/generators/vulcanize/templates/munin/config/rubber/common/munin-node.conf +48 -0
  276. data/lib/generators/vulcanize/templates/munin/config/rubber/common/munin-plugins.conf +11 -0
  277. data/lib/generators/vulcanize/templates/munin/config/rubber/deploy-munin.rb +46 -0
  278. data/lib/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin-nginx.conf +8 -0
  279. data/lib/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin-plugins.conf +31 -0
  280. data/lib/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin.conf +115 -0
  281. data/lib/generators/vulcanize/templates/munin/config/rubber/rubber-munin.yml +8 -0
  282. data/lib/generators/vulcanize/templates/munin/script/munin/example_mysql_query.rb +55 -0
  283. data/lib/generators/vulcanize/templates/munin/script/munin/example_simple.rb +24 -0
  284. data/lib/generators/vulcanize/templates/munin/templates.yml +1 -0
  285. data/lib/generators/vulcanize/templates/mysql/config/rubber/common/database.yml +12 -0
  286. data/lib/generators/vulcanize/templates/mysql/config/rubber/deploy-mysql.rb +169 -0
  287. data/lib/generators/vulcanize/templates/mysql/config/rubber/role/db/apparmor-mysql.conf +46 -0
  288. data/lib/generators/vulcanize/templates/mysql/config/rubber/role/db/crontab +14 -0
  289. data/lib/generators/vulcanize/templates/mysql/config/rubber/role/db/monit-mysql.cnf +10 -0
  290. data/lib/generators/vulcanize/templates/mysql/config/rubber/role/db/my.cnf +163 -0
  291. data/lib/generators/vulcanize/templates/mysql/config/rubber/role/mysql_slave/mysql_slave_munin_plugin +51 -0
  292. data/lib/generators/vulcanize/templates/mysql/config/rubber/rubber-mysql.yml +47 -0
  293. data/lib/generators/vulcanize/templates/mysql/templates.yml +1 -0
  294. data/lib/generators/vulcanize/templates/mysql_cluster/config/rubber/common/mysql_cluster_migrations.rb +13 -0
  295. data/lib/generators/vulcanize/templates/mysql_cluster/config/rubber/deploy-mysql_cluster.rb +177 -0
  296. data/lib/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_data/my.cnf +15 -0
  297. data/lib/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_mgm/ndb_mgmd.cnf +39 -0
  298. data/lib/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_sql/monit-mysql_cluster_sql.cnf +10 -0
  299. data/lib/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_sql/my.cnf +23 -0
  300. data/lib/generators/vulcanize/templates/mysql_cluster/config/rubber/rubber-mysql_cluster.yml +32 -0
  301. data/lib/generators/vulcanize/templates/mysql_cluster/templates.yml +1 -0
  302. data/lib/generators/vulcanize/templates/mysql_proxy/config/rubber/common/database.yml +16 -0
  303. data/lib/generators/vulcanize/templates/mysql_proxy/config/rubber/common/monit-mysql_proxy.cnf +10 -0
  304. data/lib/generators/vulcanize/templates/mysql_proxy/config/rubber/common/mysql-proxy +153 -0
  305. data/lib/generators/vulcanize/templates/mysql_proxy/config/rubber/common/mysql-proxy.conf +10 -0
  306. data/lib/generators/vulcanize/templates/mysql_proxy/config/rubber/common/mysql-proxy.lua +5 -0
  307. data/lib/generators/vulcanize/templates/mysql_proxy/config/rubber/deploy-mysql_proxy.rb +52 -0
  308. data/lib/generators/vulcanize/templates/mysql_proxy/config/rubber/rubber-mysql_proxy.yml +11 -0
  309. data/lib/generators/vulcanize/templates/mysql_proxy/templates.yml +1 -0
  310. data/lib/generators/vulcanize/templates/nginx/config/rubber/deploy-nginx.rb +45 -0
  311. data/lib/generators/vulcanize/templates/nginx/config/rubber/role/nginx/crontab +9 -0
  312. data/lib/generators/vulcanize/templates/nginx/config/rubber/role/nginx/monit-nginx.conf +8 -0
  313. data/lib/generators/vulcanize/templates/nginx/config/rubber/role/nginx/nginx.conf +42 -0
  314. data/lib/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/nginx-tools.conf +55 -0
  315. data/lib/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/tools-index.html +30 -0
  316. data/lib/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/tools-nginx.auth +7 -0
  317. data/lib/generators/vulcanize/templates/nginx/config/rubber/rubber-nginx.yml +10 -0
  318. data/lib/generators/vulcanize/templates/nginx/templates.yml +1 -0
  319. data/lib/generators/vulcanize/templates/passenger/config/rubber/deploy-passenger.rb +45 -0
  320. data/lib/generators/vulcanize/templates/passenger/config/rubber/role/passenger/munin-passenger-memory.conf +34 -0
  321. data/lib/generators/vulcanize/templates/passenger/config/rubber/role/passenger/munin-passenger-sudoers.conf +8 -0
  322. data/lib/generators/vulcanize/templates/passenger/config/rubber/role/passenger/munin-passenger.conf +47 -0
  323. data/lib/generators/vulcanize/templates/passenger/config/rubber/role/passenger/passenger-apache-vhost.conf +48 -0
  324. data/lib/generators/vulcanize/templates/passenger/config/rubber/role/passenger/passenger.conf +41 -0
  325. data/lib/generators/vulcanize/templates/passenger/config/rubber/rubber-passenger.yml +15 -0
  326. data/lib/generators/vulcanize/templates/passenger/templates.yml +3 -0
  327. data/lib/generators/vulcanize/templates/postgresql/config/rubber/common/database.yml +12 -0
  328. data/lib/generators/vulcanize/templates/postgresql/config/rubber/deploy-postgresql.rb +158 -0
  329. data/lib/generators/vulcanize/templates/postgresql/config/rubber/role/db/crontab +14 -0
  330. data/lib/generators/vulcanize/templates/postgresql/config/rubber/role/db/monit-postgresql.conf +10 -0
  331. data/lib/generators/vulcanize/templates/postgresql/config/rubber/role/db/munin-postgresql.conf +7 -0
  332. data/lib/generators/vulcanize/templates/postgresql/config/rubber/role/db/pg_hba.conf +89 -0
  333. data/lib/generators/vulcanize/templates/postgresql/config/rubber/role/db/postgresql-sysctl.conf +6 -0
  334. data/lib/generators/vulcanize/templates/postgresql/config/rubber/role/db/postgresql.conf +531 -0
  335. data/lib/generators/vulcanize/templates/postgresql/config/rubber/rubber-postgresql.yml +45 -0
  336. data/lib/generators/vulcanize/templates/postgresql/templates.yml +1 -0
  337. data/lib/generators/vulcanize/templates/redis/config/rubber/deploy-redis.rb +76 -0
  338. data/lib/generators/vulcanize/templates/redis/config/rubber/role/redis/crontab +8 -0
  339. data/lib/generators/vulcanize/templates/redis/config/rubber/role/redis/monit-redis.conf +9 -0
  340. data/lib/generators/vulcanize/templates/redis/config/rubber/role/redis/redis.conf +320 -0
  341. data/lib/generators/vulcanize/templates/redis/config/rubber/rubber-redis.yml +9 -0
  342. data/lib/generators/vulcanize/templates/redis/templates.yml +1 -0
  343. data/lib/generators/vulcanize/templates/resque/config/initializers/resque.rb +15 -0
  344. data/lib/generators/vulcanize/templates/resque/config/rubber/common/resque.yml +5 -0
  345. data/lib/generators/vulcanize/templates/resque/config/rubber/deploy-resque.rb +58 -0
  346. data/lib/generators/vulcanize/templates/resque/config/rubber/role/resque_web/monit-resque_web.conf +14 -0
  347. data/lib/generators/vulcanize/templates/resque/config/rubber/role/resque_worker/monit-resque_worker.conf +19 -0
  348. data/lib/generators/vulcanize/templates/resque/config/rubber/rubber-resque.yml +18 -0
  349. data/lib/generators/vulcanize/templates/resque/script/resque_worker_management.rb +144 -0
  350. data/lib/generators/vulcanize/templates/resque/templates.rb +1 -0
  351. data/lib/generators/vulcanize/templates/resque/templates.yml +3 -0
  352. data/lib/generators/vulcanize/templates/sphinx/config/rubber/common/sphinx.yml +46 -0
  353. data/lib/generators/vulcanize/templates/sphinx/config/rubber/deploy-sphinx.rb +112 -0
  354. data/lib/generators/vulcanize/templates/sphinx/config/rubber/role/sphinx/crontab +11 -0
  355. data/lib/generators/vulcanize/templates/sphinx/config/rubber/role/sphinx/monit-sphinx.conf +13 -0
  356. data/lib/generators/vulcanize/templates/sphinx/config/rubber/rubber-sphinx.yml +6 -0
  357. data/lib/generators/vulcanize/templates/sphinx/templates.yml +1 -0
  358. data/lib/generators/vulcanize/vulcanize_generator.rb +184 -0
  359. data/lib/rubber.rb +76 -0
  360. data/lib/rubber/capistrano.rb +1 -0
  361. data/lib/rubber/cloud.rb +13 -0
  362. data/lib/rubber/cloud/aws.rb +362 -0
  363. data/lib/rubber/cloud/base.rb +16 -0
  364. data/lib/rubber/configuration.rb +47 -0
  365. data/lib/rubber/dns.rb +13 -0
  366. data/lib/rubber/dns/base.rb +84 -0
  367. data/lib/rubber/dns/dyndns.rb +77 -0
  368. data/lib/rubber/dns/nettica.rb +117 -0
  369. data/lib/rubber/dns/zerigo.rb +115 -0
  370. data/lib/rubber/environment.rb +177 -0
  371. data/lib/rubber/generator.rb +209 -0
  372. data/lib/rubber/instance.rb +176 -0
  373. data/lib/rubber/railtie.rb +14 -0
  374. data/lib/rubber/recipes/rubber.rb +96 -0
  375. data/lib/rubber/recipes/rubber/bundles.rb +30 -0
  376. data/lib/rubber/recipes/rubber/deploy.rb +90 -0
  377. data/lib/rubber/recipes/rubber/instances.rb +453 -0
  378. data/lib/rubber/recipes/rubber/load_balancers.rb +44 -0
  379. data/lib/rubber/recipes/rubber/security_groups.rb +189 -0
  380. data/lib/rubber/recipes/rubber/setup.rb +534 -0
  381. data/lib/rubber/recipes/rubber/spot_requests.rb +23 -0
  382. data/lib/rubber/recipes/rubber/static_ips.rb +190 -0
  383. data/lib/rubber/recipes/rubber/tags.rb +12 -0
  384. data/lib/rubber/recipes/rubber/utils.rb +226 -0
  385. data/lib/rubber/recipes/rubber/volumes.rb +265 -0
  386. data/lib/rubber/tag.rb +16 -0
  387. data/lib/rubber/tasks/rubber.rb +279 -0
  388. data/lib/rubber/util.rb +72 -0
  389. data/rails/init.rb +6 -0
  390. data/test/environment_test.rb +144 -0
  391. data/test/generator_test.rb +370 -0
  392. data/test/instance_test.rb +96 -0
  393. data/test/test_helper.rb +14 -0
  394. data/test/util_test.rb +19 -0
  395. data/test/zerigo_test.rb +88 -0
  396. metadata +540 -0
@@ -0,0 +1,14 @@
1
+ require 'rubber'
2
+ require 'rails'
3
+
4
+ module Rubber
5
+
6
+ class Railtie < Rails::Railtie
7
+
8
+ initializer "rubber.configure_rails_initialization" do
9
+ Rubber::initialize(Rails.root, Rails.env)
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,96 @@
1
+ # add this plugins lib dir to load path for capistrano
2
+ $:.unshift "#{File.dirname(__FILE__)}/../lib"
3
+ require 'rubygems'
4
+ require "socket"
5
+ require 'resolv'
6
+ require 'enumerator'
7
+ require 'capistrano/hostcmd'
8
+ require 'pp'
9
+ require 'rubber'
10
+
11
+ namespace :rubber do
12
+
13
+ # Disable connecting to any Windows instance.
14
+ alias :original_task :task
15
+ def task(name, options={}, &block)
16
+ original_task(name, options.merge(:except => { :platform => 'windows' }), &block)
17
+ end
18
+
19
+ # advise capistrano's task method so that tasks for non-existent roles don't
20
+ # fail when roles isn't defined due to using a FILTER for load_roles
21
+ # If you have a task you need to execute even when there are no
22
+ # roles, you have to use required_task instead of task - see rubber:create
23
+ # as an example of this role bootstrapping problem.
24
+ def allow_optional_tasks(ns)
25
+ class << ns
26
+ alias :required_task :task
27
+ def task(name, options={}, &block)
28
+ # Disable connecting to any Windows instance.
29
+ required_task(name, options.merge(:except => { :platform => 'windows' })) do
30
+ # define empty roles for the case when a task has a role that we don't define anywhere
31
+ [*options[:roles]].each do |r|
32
+ roles[r] ||= []
33
+ end
34
+
35
+ if find_servers_for_task(current_task).empty?
36
+ logger.info "No servers for task #{name}, skipping"
37
+ next
38
+ end
39
+ block.call
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ allow_optional_tasks(self)
46
+ on :load, "rubber:init"
47
+
48
+ required_task :init do
49
+ set :rubber_cfg, Rubber::Configuration.get_configuration(RUBBER_ENV)
50
+ set :rubber_env, rubber_cfg.environment.bind()
51
+ set :rubber_instances, rubber_cfg.instance
52
+
53
+ # Disable connecting to any Windows instance.
54
+ # pass -l to bash in :shell to that run also gets full env
55
+ # use a pty so we don't get "stdin: is not a tty" error output
56
+ set :default_run_options, :pty => true, :shell => "/bin/bash -l", :except => { :platform => 'windows' }
57
+
58
+ set :cloud, Rubber::Cloud::get_provider(rubber_env.cloud_provider || "aws", rubber_env, self)
59
+
60
+ load_roles() unless rubber_env.disable_auto_roles
61
+ # NOTE: for some reason Capistrano requires you to have both the public and
62
+ # the private key in the same folder, the public key should have the
63
+ # extension ".pub".
64
+ ssh_options[:keys] = rubber_env.cloud_providers[rubber_env.cloud_provider].key_file
65
+ ssh_options[:timeout] = fetch(:ssh_timeout, 5)
66
+ end
67
+
68
+
69
+ # Automatically load and define capistrano roles from instance config
70
+ def load_roles
71
+ top.roles.clear
72
+
73
+ # define empty roles for all known ones so tasks don't fail if a role
74
+ # doesn't exist due to a filter
75
+ all_roles = rubber_instances.all_roles
76
+ all_roles += rubber_cfg.environment.known_roles
77
+ all_roles.uniq!
78
+ all_roles.each {|name| top.roles[name.to_sym] = []}
79
+
80
+ # define capistrano host => role mapping for all instances
81
+ rubber_instances.filtered.each do |ic|
82
+ ic.roles.each do |role|
83
+ opts = Rubber::Util::symbolize_keys(role.options).merge(:platform => ic.platform)
84
+ msg = "Auto role: #{role.name.to_sym} => #{ic.full_name}"
85
+ msg << ", #{opts.inspect}" if opts.inspect.size > 0
86
+ logger.info msg
87
+ top.role role.name.to_sym, ic.full_name, opts
88
+ end
89
+ end
90
+ end
91
+
92
+ end
93
+
94
+ Dir[File.join(File.dirname(__FILE__), 'rubber/*.rb')].each do |rubber_part|
95
+ load(rubber_part)
96
+ end
@@ -0,0 +1,30 @@
1
+ namespace :rubber do
2
+
3
+ desc "Back up and register an image of the running instance"
4
+ task :bundle do
5
+ if find_servers_for_task(current_task).size > 1
6
+ fatal "Can only bundle a single instance at a time, use FILTER to limit the scope"
7
+ end
8
+ image_name = get_env('IMAGE', "The image name for the bundle", true, Time.now.strftime("%Y%m%d_%H%M"))
9
+ image_id = cloud.create_image(image_name)
10
+ logger.info "Newly registered image is: #{image_id}"
11
+ end
12
+
13
+ desc "De-register and Destroy the image for the given name"
14
+ required_task :destroy_bundle do
15
+ image_id = get_env('IMAGE_ID', 'The id of the image to be destroyed', true)
16
+ cloud.destroy_image(image_id)
17
+ end
18
+
19
+ desc "Describes all your own image bundles"
20
+ required_task :describe_bundles do
21
+ images = cloud.describe_images()
22
+ images.each do |image|
23
+ logger.info "======================"
24
+ logger.info "ID: #{image[:id]}"
25
+ logger.info "Location: #{image[:location]}"
26
+ logger.info "Root device type: #{image[:root_device_type]}"
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,90 @@
1
+ namespace :rubber do
2
+
3
+ # Add in some hooks so that we can insert our own hooks at head/tail of
4
+ # hook chain - this is needed for making monit stop before everyone else.
5
+ before "deploy:start", "rubber:pre_start"
6
+ before "deploy:restart", "rubber:pre_restart"
7
+ before "deploy:stop", "rubber:pre_stop"
8
+ on :load do
9
+ after "deploy:start", "rubber:post_start"
10
+ after "deploy:restart", "rubber:post_restart"
11
+ after "deploy:stop", "rubber:post_stop"
12
+ end
13
+
14
+ task :pre_start do
15
+ end
16
+ task :pre_restart do
17
+ end
18
+ task :pre_stop do
19
+ end
20
+ task :post_start do
21
+ end
22
+ task :post_restart do
23
+ end
24
+ task :post_stop do
25
+ end
26
+
27
+ # Don't want to do rubber:config for update_code as that tree isn't official
28
+ # until it is 'committed' by the symlink task (and doing so causes it to run
29
+ # for bootstrap_db which should only config the db config file). However,
30
+ # deploy:migrations doesn't call update, so we need an additional trigger for
31
+ # it
32
+ after "deploy:update", "rubber:config"
33
+ after "deploy:rollback_code", "rubber:config"
34
+ before "deploy:migrate", "rubber:config"
35
+
36
+ desc <<-DESC
37
+ Configures the deployed rails application by running the rubber configuration process
38
+ DESC
39
+ task :config do
40
+ opts = {}
41
+ opts['NO_POST'] = true if ENV['NO_POST']
42
+ opts['FILE'] = ENV['FILE'] if ENV['FILE']
43
+ opts['RUBBER_ENV'] = RUBBER_ENV
44
+ # we need to set rails env as well because when running rake
45
+ # in a rails project, rails gets loaded before the rubber hook gets run
46
+ opts['RAILS_ENV'] = RUBBER_ENV
47
+
48
+ # when running deploy:migrations, we need to run config against release_path
49
+ opts[:deploy_path] = current_release if fetch(:migrate_target, :current).to_sym == :latest
50
+
51
+ run_config(opts)
52
+ end
53
+
54
+ # because we start server as appserver user, but migrate as root, server needs to be able to write logs, etc.
55
+ before "rubber:pre_start", "rubber:setup_app_permissions"
56
+ before "rubber:pre_restart", "rubber:setup_app_permissions"
57
+
58
+ desc <<-DESC
59
+ Sets permissions of files in application directory to be owned by app_user.
60
+ DESC
61
+ task :setup_app_permissions do
62
+ rsudo "find #{shared_path} -name cached-copy -prune -o -name bundle -prune -o -print0 | xargs -0 chown #{rubber_env.app_user}:#{rubber_env.app_user}"
63
+ rsudo "chown -R #{rubber_env.app_user}:#{rubber_env.app_user} #{current_path}/tmp"
64
+ end
65
+
66
+ def run_config(options={})
67
+ path = options.delete(:deploy_path) || current_path
68
+ extra_env = options.keys.inject("") {|all, k| "#{all} #{k}=\"#{options[k]}\""}
69
+
70
+ # Need to do this so we can work with staging instances without having to
71
+ # checkin instance file between create and bootstrap, as well as during a deploy
72
+ if fetch(:push_instance_config, false)
73
+ push_files = [rubber_instances.file] + rubber_cfg.environment.config_files
74
+ push_files.each do |file|
75
+ dest_file = file.sub(/^#{RUBBER_ROOT}\/?/, '')
76
+ put(File.read(file), File.join(path, dest_file), :mode => "+r")
77
+ end
78
+ end
79
+
80
+ # if the user has defined a secret config file, then push it into RUBBER_ROOT/config/rubber
81
+ secret = rubber_cfg.environment.config_secret
82
+ if secret && File.exist?(secret)
83
+ base = rubber_cfg.environment.config_root.sub(/^#{RUBBER_ROOT}\/?/, '')
84
+ put(File.read(secret), File.join(path, base, File.basename(secret)), :mode => "+r")
85
+ end
86
+
87
+ rsudo "cd #{path} && #{extra_env} rake rubber:config"
88
+ end
89
+
90
+ end
@@ -0,0 +1,453 @@
1
+ namespace :rubber do
2
+
3
+ desc <<-DESC
4
+ Create a new EC2 instance with the given ALIAS and ROLES
5
+ DESC
6
+ required_task :create do
7
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
8
+
9
+ env = rubber_cfg.environment.bind(nil, instance_alias)
10
+ default_roles = env.instance_roles
11
+ r = get_env("ROLES", "Instance roles (e.g. web,app,db:primary=true)", true, default_roles)
12
+
13
+ create_spot_instance = ENV.delete("SPOT_INSTANCE") || env.cloud_providers[env.cloud_provider].spot_instance
14
+
15
+ if r == '*'
16
+ instance_roles = rubber_cfg.environment.known_roles
17
+ instance_roles = instance_roles.collect {|role| role == "db" ? "db:primary=true" : role }
18
+ else
19
+ instance_roles = r.split(",")
20
+ end
21
+
22
+ ir = []
23
+ instance_roles.each do |r|
24
+ role = Rubber::Configuration::RoleItem.parse(r)
25
+
26
+ # If user doesn't setup a primary db, then be nice and do it
27
+ if role.name == "db" && role.options["primary"] == nil && rubber_instances.for_role("db").size == 0
28
+ value = Capistrano::CLI.ui.ask("You do not have a primary db role, should #{instance_alias} be it [y/n]?: ")
29
+ role.options["primary"] = true if value =~ /^y/
30
+ end
31
+
32
+ ir << role
33
+ end
34
+
35
+ # Add in roles that the given set of roles depends on
36
+ ir = Rubber::Configuration::RoleItem.expand_role_dependencies(ir, get_role_dependencies)
37
+
38
+ create_instance(instance_alias, ir, create_spot_instance)
39
+ end
40
+
41
+ desc <<-DESC
42
+ Refresh the host data for a EC2 instance with the given ALIAS.
43
+ This is useful to run when rubber:create fails after instance creation
44
+ DESC
45
+ required_task :refresh do
46
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
47
+ ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
48
+ refresh_instance(instance_alias)
49
+ end
50
+
51
+ desc <<-DESC
52
+ Destroy the EC2 instance for the given ALIAS
53
+ DESC
54
+ required_task :destroy do
55
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
56
+ ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
57
+ destroy_instance(instance_alias)
58
+ end
59
+
60
+ desc <<-DESC
61
+ Destroy ALL the EC2 instances for the current env
62
+ DESC
63
+ required_task :destroy_all do
64
+ rubber_instances.each do |ic|
65
+ destroy_instance(ic.name)
66
+ end
67
+ end
68
+
69
+ desc <<-DESC
70
+ Reboot the EC2 instance for the give ALIAS
71
+ DESC
72
+ required_task :reboot do
73
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
74
+ ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
75
+ reboot_instance(instance_alias)
76
+ end
77
+
78
+ desc <<-DESC
79
+ Stop the EC2 instance for the give ALIAS
80
+ DESC
81
+ required_task :stop do
82
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
83
+ ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
84
+ stop_instance(instance_alias)
85
+ end
86
+
87
+ desc <<-DESC
88
+ Start the EC2 instance for the give ALIAS
89
+ DESC
90
+ required_task :start do
91
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
92
+ ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
93
+ start_instance(instance_alias)
94
+ end
95
+
96
+ desc <<-DESC
97
+ Adds the given ROLES to the instance named ALIAS
98
+ DESC
99
+ required_task :add_role do
100
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
101
+ r = get_env('ROLES', "Instance roles (e.g. web,app,db:primary=true)", true)
102
+
103
+ instance_roles = r.split(",")
104
+
105
+ ir = []
106
+ instance_roles.each do |r|
107
+ role = Rubber::Configuration::RoleItem.parse(r)
108
+ ir << role
109
+ end
110
+
111
+ # Add in roles that the given set of roles depends on
112
+ ir = Rubber::Configuration::RoleItem.expand_role_dependencies(ir, get_role_dependencies)
113
+
114
+ instance = rubber_instances[instance_alias]
115
+ fatal "Instance does not exist: #{instance_alias}" unless instance
116
+
117
+ instance.roles = (instance.roles + ir).uniq
118
+ rubber_instances.save()
119
+ logger.info "Roles for #{instance_alias} are now:"
120
+ logger.info instance.role_names.sort.join("\n")
121
+ logger.info ''
122
+ logger.info "Run 'cap rubber:bootstrap' if done adding roles"
123
+ end
124
+
125
+ desc <<-DESC
126
+ Removes the given ROLES from the instance named ALIAS
127
+ DESC
128
+ required_task :remove_role do
129
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
130
+ r = get_env('ROLES', "Instance roles (e.g. web,app,db:primary=true)", true)
131
+
132
+ instance_roles = r.split(",")
133
+
134
+ ir = []
135
+ instance_roles.each do |r|
136
+ role = Rubber::Configuration::RoleItem.parse(r)
137
+ ir << role
138
+ end
139
+
140
+ instance = rubber_instances[instance_alias]
141
+ fatal "Instance does not exist: #{instance_alias}" unless instance
142
+
143
+ instance.roles = (instance.roles - ir).uniq
144
+ rubber_instances.save()
145
+ logger.info "Roles for #{instance_alias} are now:"
146
+ logger.info instance.role_names.sort.join("\n")
147
+ end
148
+
149
+ desc <<-DESC
150
+ List all your EC2 instances
151
+ DESC
152
+ required_task :describe do
153
+ results = []
154
+ format = "%-10s %-10s %-10s %-15s %-30s"
155
+ results << format % %w[InstanceID State Zone IP Alias\ (*=unknown)]
156
+
157
+ instances = cloud.describe_instances()
158
+ instances.each do |instance|
159
+ local_alias = find_alias(instance[:external_ip], instance[:id], instance[:state] == 'running')
160
+ results << format % [instance[:id], instance[:state], instance[:zone], instance[:external_ip] || "NoIP", local_alias || "Unknown"]
161
+ end
162
+ results.each {|r| logger.info r}
163
+ end
164
+
165
+ desc <<-DESC
166
+ Describes the availability zones
167
+ DESC
168
+ required_task :describe_zones do
169
+ results = []
170
+ format = "%-20s %-15s"
171
+ results << format % %w[Name State]
172
+
173
+ zones = cloud.describe_availability_zones()
174
+ zones.each do |zone|
175
+ results << format % [zone[:name], zone[:state]]
176
+ end
177
+
178
+ results.each {|r| logger.info r}
179
+ end
180
+
181
+
182
+ set :print_ip_command, "ifconfig eth0 | awk 'NR==2 {print $2}' | awk -F: '{print $2}'"
183
+
184
+ # Creates a new ec2 instance with the given alias and roles
185
+ # Configures aliases (/etc/hosts) on local and remote machines
186
+ def create_instance(instance_alias, instance_roles, create_spot_instance=false)
187
+ fatal "Instance already exists: #{instance_alias}" if rubber_instances[instance_alias]
188
+
189
+ role_names = instance_roles.collect{|x| x.name}
190
+ env = rubber_cfg.environment.bind(role_names, instance_alias)
191
+
192
+ # We need to use security_groups during create, so create them up front
193
+ setup_security_groups(instance_alias, role_names)
194
+ security_groups = get_assigned_security_groups(instance_alias, role_names)
195
+
196
+ ami = env.cloud_providers[env.cloud_provider].image_id
197
+ ami_type = env.cloud_providers[env.cloud_provider].image_type
198
+ availability_zone = env.availability_zone
199
+
200
+ if create_spot_instance
201
+ spot_price = env.cloud_providers[env.cloud_provider].spot_price.to_s
202
+
203
+ logger.info "Creating spot instance request for instance #{ami}/#{ami_type}/#{security_groups.join(',') rescue 'Default'}/#{availability_zone || 'Default'}"
204
+ request_id = cloud.create_spot_instance_request(spot_price, ami, ami_type, security_groups, availability_zone)
205
+
206
+ print "Waiting for spot instance request to be fulfilled"
207
+ max_wait_time = env.cloud_providers[env.cloud_provider].spot_instance_request_timeout || (1.0 / 0) # Use the specified timeout value or default to infinite.
208
+ instance_id = nil
209
+ while instance_id.nil? do
210
+ print "."
211
+ sleep 2
212
+ max_wait_time -= 2
213
+
214
+ request = cloud.describe_spot_instance_requests(request_id).first
215
+ instance_id = request[:instance_id]
216
+
217
+ if max_wait_time < 0 && instance_id.nil?
218
+ cloud.destroy_spot_instance_request(request[:id])
219
+
220
+ print "\n"
221
+ print "Failed to fulfill spot instance in the time specified. Falling back to on-demand instance creation."
222
+ break
223
+ end
224
+ end
225
+
226
+ print "\n"
227
+ end
228
+
229
+ if !create_spot_instance || (create_spot_instance && max_wait_time < 0)
230
+ logger.info "Creating instance #{ami}/#{ami_type}/#{security_groups.join(',') rescue 'Default'}/#{availability_zone || 'Default'}"
231
+ instance_id = cloud.create_instance(ami, ami_type, security_groups, availability_zone)
232
+ end
233
+
234
+ logger.info "Instance #{instance_id} created"
235
+
236
+ instance_item = Rubber::Configuration::InstanceItem.new(instance_alias, env.domain, instance_roles, instance_id, security_groups)
237
+ instance_item.spot_instance_request_id = request_id if create_spot_instance
238
+ rubber_instances.add(instance_item)
239
+ rubber_instances.save()
240
+
241
+ # Sometimes tag creation will fail, indicating that the instance doesn't exist yet even though it does. It seems to
242
+ # be a propagation delay on Amazon's end, so the best we can do is wait and try again.
243
+ begin
244
+ Rubber::Tag::update_instance_tags(instance_alias)
245
+ rescue Exception
246
+ sleep 0.5
247
+ retry
248
+ end
249
+
250
+ print "Waiting for instance to start"
251
+ while true do
252
+ print "."
253
+ sleep 2
254
+
255
+ break if refresh_instance(instance_alias)
256
+ end
257
+ end
258
+
259
+ # Refreshes a ec2 instance with the given alias
260
+ # Configures aliases (/etc/hosts) on local and remote machines
261
+ def refresh_instance(instance_alias)
262
+ instance_item = rubber_instances[instance_alias]
263
+
264
+ fatal "Instance does not exist: #{instance_alias}" if ! instance_item
265
+
266
+ env = rubber_cfg.environment.bind(instance_item.role_names, instance_alias)
267
+
268
+ instance = cloud.describe_instances(instance_item.instance_id).first rescue {}
269
+
270
+ if instance[:state] == "running"
271
+ print "\n"
272
+ logger.info "Instance running, fetching hostname/ip data"
273
+ instance_item.external_host = instance[:external_host]
274
+ instance_item.external_ip = instance[:external_ip]
275
+ instance_item.internal_host = instance[:internal_host]
276
+ instance_item.internal_ip = instance[:internal_ip]
277
+ instance_item.zone = instance[:zone]
278
+ instance_item.platform = instance[:platform]
279
+ instance_item.root_device_type = instance[:root_device_type]
280
+ rubber_instances.save()
281
+
282
+ unless instance_item.windows?
283
+ # weird cap/netssh bug, sometimes just hangs forever on initial connect, so force a timeout
284
+ begin
285
+ Timeout::timeout(30) do
286
+ # turn back on root ssh access if we are using root as the capistrano user for connecting
287
+ enable_root_ssh(instance_item.external_ip, fetch(:initial_ssh_user, 'ubuntu')) if user == 'root'
288
+ # force a connection so if above isn't enabled we still timeout if initial connection hangs
289
+ direct_connection(instance_item.external_ip) do
290
+ run "echo"
291
+ end
292
+ end
293
+ rescue Timeout::Error
294
+ logger.info "timeout in initial connect, retrying"
295
+ retry
296
+ end
297
+ end
298
+
299
+ # setup amazon elastic ips if configured to do so
300
+ setup_static_ips
301
+
302
+ # Need to setup aliases so ssh doesn't give us errors when we
303
+ # later try to connect to same ip but using alias
304
+ setup_local_aliases
305
+
306
+ # re-load the roles since we may have just defined new ones
307
+ load_roles() unless env.disable_auto_roles
308
+
309
+ rubber_instances.save()
310
+
311
+ # Add the aliases for this instance to all other hosts
312
+ setup_remote_aliases
313
+ setup_dns_aliases
314
+
315
+ return true
316
+ end
317
+ return false
318
+ end
319
+
320
+
321
+ # Destroys the given ec2 instance
322
+ def destroy_instance(instance_alias)
323
+ instance_item = rubber_instances[instance_alias]
324
+ fatal "Instance does not exist: #{instance_alias}" if ! instance_item
325
+
326
+ env = rubber_cfg.environment.bind(instance_item.role_names, instance_item.name)
327
+
328
+ value = Capistrano::CLI.ui.ask("About to DESTROY #{instance_alias} (#{instance_item.instance_id}) in mode #{RUBBER_ENV}. Are you SURE [yes/NO]?: ")
329
+ fatal("Exiting", 0) if value != "yes"
330
+
331
+ if instance_item.static_ip
332
+ value = Capistrano::CLI.ui.ask("Instance has a static ip, do you want to release it? [y/N]?: ")
333
+ destroy_static_ip(instance_item.static_ip) if value =~ /^y/
334
+ end
335
+
336
+ if instance_item.volumes
337
+ value = Capistrano::CLI.ui.ask("Instance has persistent volumes, do you want to destroy them? [y/N]?: ")
338
+ if value =~ /^y/
339
+ instance_item.volumes.clone.each do |volume_id|
340
+ destroy_volume(volume_id)
341
+ end
342
+ end
343
+ end
344
+
345
+ logger.info "Destroying instance alias=#{instance_alias}, instance_id=#{instance_item.instance_id}"
346
+
347
+ cloud.destroy_instance(instance_item.instance_id)
348
+
349
+ rubber_instances.remove(instance_alias)
350
+ rubber_instances.save()
351
+
352
+ # re-load the roles since we just removed some and setup_remote_aliases
353
+ # shouldn't hit removed ones
354
+ load_roles() unless env.disable_auto_roles
355
+
356
+ setup_aliases
357
+ destroy_dyndns(instance_item)
358
+ cleanup_known_hosts(instance_item) unless env.disable_known_hosts_cleanup
359
+ end
360
+
361
+ # Reboots the given ec2 instance
362
+ def reboot_instance(instance_alias)
363
+ instance_item = rubber_instances[instance_alias]
364
+ fatal "Instance does not exist: #{instance_alias}" if ! instance_item
365
+
366
+ env = rubber_cfg.environment.bind(instance_item.role_names, instance_item.name)
367
+
368
+ value = Capistrano::CLI.ui.ask("About to REBOOT #{instance_alias} (#{instance_item.instance_id}) in mode #{RUBBER_ENV}. Are you SURE [yes/NO]?: ")
369
+ fatal("Exiting", 0) if value != "yes"
370
+
371
+ logger.info "Rebooting instance alias=#{instance_alias}, instance_id=#{instance_item.instance_id}"
372
+
373
+ cloud.reboot_instance(instance_item.instance_id)
374
+ end
375
+
376
+ # Stops the given ec2 instance. Note that this operation only works for instances that use an EBS volume for the root
377
+ # device and that are not spot instances.
378
+ def stop_instance(instance_alias)
379
+ instance_item = rubber_instances[instance_alias]
380
+ fatal "Instance does not exist: #{instance_alias}" if ! instance_item
381
+ fatal "Cannot stop spot instances!" if ! instance_item.spot_instance_request_id.nil?
382
+ fatal "Cannot stop instances with instance-store root device!" if (instance_item.root_device_type != 'ebs')
383
+
384
+ env = rubber_cfg.environment.bind(instance_item.role_names, instance_item.name)
385
+
386
+ value = Capistrano::CLI.ui.ask("About to STOP #{instance_alias} (#{instance_item.instance_id}) in mode #{RUBBER_ENV}. Are you SURE [yes/NO]?: ")
387
+ fatal("Exiting", 0) if value != "yes"
388
+
389
+ logger.info "Stopping instance alias=#{instance_alias}, instance_id=#{instance_item.instance_id}"
390
+
391
+ cloud.stop_instance(instance_item.instance_id)
392
+ end
393
+
394
+ # Starts the given ec2 instance. Note that this operation only works for instances that use an EBS volume for the root
395
+ # device, that are not spot instances, and that are already stopped.
396
+ def start_instance(instance_alias)
397
+ instance_item = rubber_instances[instance_alias]
398
+ fatal "Instance does not exist: #{instance_alias}" if ! instance_item
399
+ fatal "Cannot start spot instances!" if ! instance_item.spot_instance_request_id.nil?
400
+ fatal "Cannot start instances with instance-store root device!" if (instance_item.root_device_type != 'ebs')
401
+
402
+ env = rubber_cfg.environment.bind(instance_item.role_names, instance_item.name)
403
+
404
+ value = Capistrano::CLI.ui.ask("About to START #{instance_alias} (#{instance_item.instance_id}) in mode #{RUBBER_ENV}. Are you SURE [yes/NO]?: ")
405
+ fatal("Exiting", 0) if value != "yes"
406
+
407
+ logger.info "Starting instance alias=#{instance_alias}, instance_id=#{instance_item.instance_id}"
408
+
409
+ cloud.start_instance(instance_item.instance_id)
410
+
411
+ # Re-starting an instance will almost certainly give it a new set of IPs and DNS entries, so refresh the values.
412
+ print "Waiting for instance to start"
413
+ while true do
414
+ print "."
415
+ sleep 2
416
+
417
+ break if refresh_instance(instance_alias)
418
+ end
419
+ end
420
+
421
+ # delete from ~/.ssh/known_hosts all lines that begin with ec2- or instance_alias
422
+ def cleanup_known_hosts(instance_item)
423
+ logger.info "Cleaning ~/.ssh/known_hosts"
424
+ File.open(File.expand_path('~/.ssh/known_hosts'), 'r+') do |f|
425
+ out = ""
426
+ f.each do |line|
427
+ line = case line
428
+ when /^ec2-/; ''
429
+ when /#{instance_item.full_name}/; ''
430
+ when /#{instance_item.external_host}/; ''
431
+ when /#{instance_item.external_ip}/; ''
432
+ else line;
433
+ end
434
+ out << line
435
+ end
436
+ f.pos = 0
437
+ f.print out
438
+ f.truncate(f.pos)
439
+ end
440
+ end
441
+
442
+ def get_role_dependencies
443
+ # convert string format of role_dependencies from rubber.yml into
444
+ # objects for use by expand_role_dependencies
445
+ deps = {}
446
+ rubber_env.role_dependencies.each do |k, v|
447
+ rhs = Array(v).collect {|r| Rubber::Configuration::RoleItem.parse(r)}
448
+ deps[Rubber::Configuration::RoleItem.parse(k)] = rhs
449
+ end if rubber_env.role_dependencies
450
+ return deps
451
+ end
452
+
453
+ end