From adb48a1a484f8010c8c3e4893adf28c090484a46 Mon Sep 17 00:00:00 2001 From: mattray Date: Fri, 22 Jun 2012 23:37:46 -0500 Subject: [PATCH] patched 1.4.1 rabbitmq for COOK-1386, will remove once upstream version is published --- cookbooks/rabbitmq/CHANGELOG.md | 11 + cookbooks/rabbitmq/CONTRIBUTING | 29 +++ cookbooks/rabbitmq/LICENSE | 201 ++++++++++++++++++ cookbooks/rabbitmq/README.md | 87 ++++++++ cookbooks/rabbitmq/attributes/default.rb | 32 +++ cookbooks/rabbitmq/metadata.rb | 65 ++++++ cookbooks/rabbitmq/providers/user.rb | 66 ++++++ cookbooks/rabbitmq/providers/vhost.rb | 34 +++ cookbooks/rabbitmq/recipes/default.rb | 89 ++++++++ cookbooks/rabbitmq/resources/user.rb | 25 +++ cookbooks/rabbitmq/resources/vhost.rb | 22 ++ .../templates/default/doterlang.cookie.erb | 1 + .../templates/default/rabbitmq-env.conf.erb | 10 + .../templates/default/rabbitmq.config.erb | 21 ++ 14 files changed, 693 insertions(+) create mode 100644 cookbooks/rabbitmq/CHANGELOG.md create mode 100644 cookbooks/rabbitmq/CONTRIBUTING create mode 100644 cookbooks/rabbitmq/LICENSE create mode 100644 cookbooks/rabbitmq/README.md create mode 100644 cookbooks/rabbitmq/attributes/default.rb create mode 100644 cookbooks/rabbitmq/metadata.rb create mode 100644 cookbooks/rabbitmq/providers/user.rb create mode 100644 cookbooks/rabbitmq/providers/vhost.rb create mode 100644 cookbooks/rabbitmq/recipes/default.rb create mode 100644 cookbooks/rabbitmq/resources/user.rb create mode 100644 cookbooks/rabbitmq/resources/vhost.rb create mode 100644 cookbooks/rabbitmq/templates/default/doterlang.cookie.erb create mode 100644 cookbooks/rabbitmq/templates/default/rabbitmq-env.conf.erb create mode 100644 cookbooks/rabbitmq/templates/default/rabbitmq.config.erb diff --git a/cookbooks/rabbitmq/CHANGELOG.md b/cookbooks/rabbitmq/CHANGELOG.md new file mode 100644 index 0000000..634cb3b --- /dev/null +++ b/cookbooks/rabbitmq/CHANGELOG.md @@ -0,0 +1,11 @@ +## v1.4.1: +* [COOK-1386] - Bumped version to 2.8.4 +* rabbitmq::default now includes erlang::default + +## v1.4.0: + +* [COOK-911] - Auto clustering support + +## v1.3.2: + +* [COOK-585] - manage rabbitmq-server service diff --git a/cookbooks/rabbitmq/CONTRIBUTING b/cookbooks/rabbitmq/CONTRIBUTING new file mode 100644 index 0000000..89ac873 --- /dev/null +++ b/cookbooks/rabbitmq/CONTRIBUTING @@ -0,0 +1,29 @@ +If you would like to contribute, please open a ticket in JIRA: + +* http://tickets.opscode.com + +Create the ticket in the COOK project and use the cookbook name as the +component. + +For all code contributions, we ask that contributors sign a +contributor license agreement (CLA). Instructions may be found here: + +* http://wiki.opscode.com/display/chef/How+to+Contribute + +When contributing changes to individual cookbooks, please do not +modify the version number in the metadata.rb. Also please do not +update the CHANGELOG.md for a new version. Not all changes to a +cookbook may be merged and released in the same versions. Opscode will +handle the version updates during the release process. You are welcome +to correct typos or otherwise make updates to documentation in the +README. + +If a contribution adds new platforms or platform versions, indicate +such in the body of the commit message(s), and update the relevant +COOK ticket. When writing commit messages, it is helpful for others if +you indicate the COOK ticket. For example: + + git commit -m '[COOK-1041] Updated pool resource to correctly delete.' + +In the ticket itself, it is also helpful if you include log output of +a successful Chef run, but this is not absolutely required. diff --git a/cookbooks/rabbitmq/LICENSE b/cookbooks/rabbitmq/LICENSE new file mode 100644 index 0000000..11069ed --- /dev/null +++ b/cookbooks/rabbitmq/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/cookbooks/rabbitmq/README.md b/cookbooks/rabbitmq/README.md new file mode 100644 index 0000000..43b7486 --- /dev/null +++ b/cookbooks/rabbitmq/README.md @@ -0,0 +1,87 @@ +Description +=========== +This is a cookbook for managing RabbitMQ with Chef. It uses the default settings, but can also be configured via attributes. + +Recipes +======= +default +------- +Installs `rabbitmq-server` from RabbitMQ.com's APT repository or the RPM directly (there is no yum repo). The distribution-provided versions were quite old and newer features were needed. + +Cluster recipe is now combined with default. Recipe will now auto-cluster. Set the :cluster attribute to true, :cluster_disk_nodes array of `node@host` strings that describe which you want to be disk nodes and then set an alphanumeric string for the :erlang_cookie. + +To enable SSL turn :ssl to true and set the paths to your cacert, cert and key files. + +Resources/Providers +=================== +There are 2 LWRPs for interacting with RabbitMQ. + +user +---- +Adds and deletes users, fairly simplistic permissions management. + +- `:add` adds a `user` with a `password` +- `:delete` deletes a `user` +- `:set_permissions` sets the `permissions` for a `user`, `vhost` is optional +- `:clear_permissions` clears the permissions for a `user` + +### Examples +``` ruby +rabbitmq_user "guest" do + action :delete +end + +rabbitmq_user "nova" do + password "sekret" + action :add +end + +rabbitmq_user "nova" do + vhost "/nova" + permissions "\".*\" \".*\" \".*\"" + action :set_permissions +end +``` + +vhost +----- +Adds and deletes vhosts. + +- `:add` adds a `vhost` +- `:delete` deletes a `vhost` + +### Example +``` ruby +rabbitmq_vhost "/nova" do + action :add +end +``` + +Limitations +=========== +For an already running cluster, these actions still require manual intervention: +- changing the :erlang_cookie +- turning :cluster from true to false + +The rabbitmq::chef recipe was only used for the chef-server cookbook and has been moved to chef-server::rabbitmq. + +License and Author +================== + +Author:: Benjamin Black +Author:: Daniel DeLeo +Author:: Matt Ray + +Copyright:: 2009-2011 Opscode, Inc + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/cookbooks/rabbitmq/attributes/default.rb b/cookbooks/rabbitmq/attributes/default.rb new file mode 100644 index 0000000..79fac2f --- /dev/null +++ b/cookbooks/rabbitmq/attributes/default.rb @@ -0,0 +1,32 @@ +# being nil, the rabbitmq defaults will be used +default[:rabbitmq][:nodename] = nil +default[:rabbitmq][:address] = nil +default[:rabbitmq][:port] = nil +default[:rabbitmq][:config] = nil +default[:rabbitmq][:logdir] = nil +default[:rabbitmq][:mnesiadir] = nil + +# RabbitMQ version to install for "redhat", "centos", "scientific", and "amazon". We default to +# 2.6.1, because that was what was installed in the previous version of the cookbook. +default[:rabbitmq][:version] = '2.8.4' + +# config file location +# http://www.rabbitmq.com/configure.html#define-environment-variables +# "The .config extension is automatically appended by the Erlang runtime." +default[:rabbitmq][:config] = "/etc/rabbitmq/rabbitmq" + +# rabbitmq.config defaults +default[:rabbitmq][:default_user] = 'guest' +default[:rabbitmq][:default_pass] = 'guest' + +#clustering +default[:rabbitmq][:cluster] = false +default[:rabbitmq][:cluster_disk_nodes] = [] +default[:rabbitmq][:erlang_cookie] = 'AnyAlphaNumericStringWillDo' + +#ssl +default[:rabbitmq][:ssl] = false +default[:rabbitmq][:ssl_port] = '5671' +default[:rabbitmq][:ssl_cacert] = '/path/to/cacert.pem' +default[:rabbitmq][:ssl_cert] = '/path/to/cert.pem' +default[:rabbitmq][:ssl_key] = '/path/to/key.pem' diff --git a/cookbooks/rabbitmq/metadata.rb b/cookbooks/rabbitmq/metadata.rb new file mode 100644 index 0000000..dbfa2f2 --- /dev/null +++ b/cookbooks/rabbitmq/metadata.rb @@ -0,0 +1,65 @@ +maintainer "Opscode, Inc." +maintainer_email "cookbooks@opscode.com" +license "Apache 2.0" +description "Installs and configures RabbitMQ server" +version "1.4.1" +recipe "rabbitmq", "Install and configure RabbitMQ" +recipe "rabbitmq::cluster", "Set up RabbitMQ clustering." +depends "apt", ">= 1.1" +depends "yum", ">= 0.5.0" +depends "erlang", ">= 0.9" + +%w{ubuntu debian redhat centos scientific}.each do |os| + supports os +end + +attribute "rabbitmq", + :display_name => "RabbitMQ", + :description => "Hash of RabbitMQ attributes", + :type => "hash" + +attribute "rabbitmq/nodename", + :display_name => "RabbitMQ Erlang node name", + :description => "The Erlang node name for this server.", + :default => "node[:hostname]" + +attribute "rabbitmq/address", + :display_name => "RabbitMQ server IP address", + :description => "IP address to bind." + +attribute "rabbitmq/port", + :display_name => "RabbitMQ server port", + :description => "TCP port to bind." + +attribute "rabbitmq/config", + :display_name => "RabbitMQ config file to load", + :description => "Path to the rabbitmq.config file, if any." + +attribute "rabbitmq/logdir", + :display_name => "RabbitMQ log directory", + :description => "Path to the directory for log files." + +attribute "rabbitmq/mnesiadir", + :display_name => "RabbitMQ Mnesia database directory", + :description => "Path to the directory for Mnesia database files." + +attribute "rabbitmq/cluster", + :display_name => "RabbitMQ clustering", + :description => "Whether to activate clustering.", + :default => "no" + +attribute "rabbitmq/cluster_config", + :display_name => "RabbitMQ clustering configuration file", + :description => "Path to the clustering configuration file, if cluster is yes.", + :default => "/etc/rabbitmq/rabbitmq_cluster.config" + +attribute "rabbitmq/cluster_disk_nodes", + :display_name => "RabbitMQ cluster disk nodes", + :description => "Array of member Erlang nodenames for the disk-based storage nodes in the cluster.", + :default => [], + :type => "array" + +attribute "rabbitmq/erlang_cookie", + :display_name => "RabbitMQ Erlang cookie", + :description => "Access cookie for clustering nodes. There is no default." + diff --git a/cookbooks/rabbitmq/providers/user.rb b/cookbooks/rabbitmq/providers/user.rb new file mode 100644 index 0000000..bb1b3ca --- /dev/null +++ b/cookbooks/rabbitmq/providers/user.rb @@ -0,0 +1,66 @@ +# +# Cookbook Name:: rabbitmq +# Provider:: user +# +# Copyright 2011, Opscode, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +action :add do + execute "rabbitmqctl add_user #{new_resource.user} #{new_resource.password}" do + not_if "rabbitmqctl list_users | grep #{new_resource.user}" + Chef::Log.info "Adding RabbitMQ user '#{new_resource.user}'." + new_resource.updated_by_last_action(true) + end +end + +action :delete do + execute "rabbitmqctl delete_user #{new_resource.user}" do + only_if "rabbitmqctl list_users | grep #{new_resource.user}" + Chef::Log.info "Deleting RabbitMQ user '#{new_resource.user}'." + new_resource.updated_by_last_action(true) + end +end + +action :set_permissions do + if new_resource.vhost + execute "rabbitmqctl set_permissions -p #{new_resource.vhost} #{new_resource.user} #{new_resource.permissions}" do + not_if "rabbitmqctl list_user_permissions | grep #{new_resource.user}" + Chef::Log.info "Setting RabbitMQ user permissions for '#{new_resource.user}' on vhost #{new_resource.vhost}." + new_resource.updated_by_last_action(true) + end + else + execute "rabbitmqctl set_permissions #{new_resource.user} #{new_resource.permissions}" do + not_if "rabbitmqctl list_user_permissions | grep #{new_resource.user}" + Chef::Log.info "Setting RabbitMQ user permissions for '#{new_resource.user}'." + new_resource.updated_by_last_action(true) + end + end +end + +action :clear_permissions do + if new_resource.vhost + execute "rabbitmqctl clear_permissions -p #{new_resource.vhost} #{new_resource.user}" do + only_if "rabbitmqctl list_user_permissions | grep #{new_resource.user}" + Chef::Log.info "Clearing RabbitMQ user permissions for '#{new_resource.user}' from vhost #{new_resource.vhost}." + new_resource.updated_by_last_action(true) + end + else + execute "rabbitmqctl clear_permissions #{new_resource.user}" do + only_if "rabbitmqctl list_user_permissions | grep #{new_resource.user}" + Chef::Log.info "Clearing RabbitMQ user permissions for '#{new_resource.user}'." + new_resource.updated_by_last_action(true) + end + end +end diff --git a/cookbooks/rabbitmq/providers/vhost.rb b/cookbooks/rabbitmq/providers/vhost.rb new file mode 100644 index 0000000..96f069a --- /dev/null +++ b/cookbooks/rabbitmq/providers/vhost.rb @@ -0,0 +1,34 @@ +# +# Cookbook Name:: rabbitmq +# Provider:: vhost +# +# Copyright 2011, Opscode, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +action :add do + execute "rabbitmqctl add_vhost #{new_resource.vhost}" do + not_if "rabbitmqctl list_vhosts | grep #{new_resource.vhost}" + Chef::Log.info "Adding RabbitMQ vhost '#{new_resource.vhost}'." + new_resource.updated_by_last_action(true) + end +end + +action :delete do + execute "rabbitmqctl delete_vhost #{new_resource.vhost}" do + only_if "rabbitmqctl list_vhosts | grep #{new_resource.vhost}" + Chef::Log.info "Deleting RabbitMQ vhost '#{new_resource.vhost}'." + new_resource.updated_by_last_action(true) + end +end diff --git a/cookbooks/rabbitmq/recipes/default.rb b/cookbooks/rabbitmq/recipes/default.rb new file mode 100644 index 0000000..44a5495 --- /dev/null +++ b/cookbooks/rabbitmq/recipes/default.rb @@ -0,0 +1,89 @@ +# +# Cookbook Name:: rabbitmq +# Recipe:: default +# +# Copyright 2009, Benjamin Black +# Copyright 2009-2011, Opscode, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# rabbitmq-server is not well-behaved as far as managed services goes +# we'll need to add a LWRP for calling rabbitmqctl stop +# while still using /etc/init.d/rabbitmq-server start +# because of this we just put the rabbitmq-env.conf in place and let it rip + +include_recipe "erlang::default" + +directory "/etc/rabbitmq/" do + owner "root" + group "root" + mode 0755 + action :create +end + +template "/etc/rabbitmq/rabbitmq-env.conf" do + source "rabbitmq-env.conf.erb" + owner "root" + group "root" + mode 0644 + notifies :restart, "service[rabbitmq-server]" +end + +case node[:platform] +when "debian", "ubuntu" + # use the RabbitMQ repository instead of Ubuntu or Debian's + # because there are very useful features in the newer versions + apt_repository "rabbitmq" do + uri "http://www.rabbitmq.com/debian/" + distribution "testing" + components ["main"] + key "http://www.rabbitmq.com/rabbitmq-signing-key-public.asc" + action :add + end + package "rabbitmq-server" +when "redhat", "centos", "scientific", "amazon" + remote_file "/tmp/rabbitmq-server-#{node[:rabbitmq][:version]}-1.noarch.rpm" do + source "https://www.rabbitmq.com/releases/rabbitmq-server/v#{node[:rabbitmq][:version]}/rabbitmq-server-#{node[:rabbitmq][:version]}-1.noarch.rpm" + action :create_if_missing + end + rpm_package "/tmp/rabbitmq-server-#{node[:rabbitmq][:version]}-1.noarch.rpm" do + action :install + end +end + +if node[:rabbitmq][:cluster] + # If this already exists, don't do anything + # Changing the cookie will stil have to be a manual process + template "/var/lib/rabbitmq/.erlang.cookie" do + source "doterlang.cookie.erb" + owner "rabbitmq" + group "rabbitmq" + mode 0400 + not_if { File.exists? "/var/lib/rabbitmq/.erlang.cookie" } + end +end + +template "/etc/rabbitmq/rabbitmq.config" do + source "rabbitmq.config.erb" + owner "root" + group "root" + mode 0644 + notifies :restart, "service[rabbitmq-server]", :immediately +end + +service "rabbitmq-server" do + stop_command "/usr/sbin/rabbitmqctl stop" + supports :status => true, :restart => true + action [ :enable, :start ] +end diff --git a/cookbooks/rabbitmq/resources/user.rb b/cookbooks/rabbitmq/resources/user.rb new file mode 100644 index 0000000..64fda96 --- /dev/null +++ b/cookbooks/rabbitmq/resources/user.rb @@ -0,0 +1,25 @@ +# +# Cookbook Name:: rabbitmq +# Resource:: user +# +# Copyright 2011, Opscode, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +actions :add, :delete, :set_permissions, :clear_permissions + +attribute :user, :kind_of => String, :name_attribute => true +attribute :password, :kind_of => String +attribute :vhost, :kind_of => String +attribute :permissions, :kind_of => String diff --git a/cookbooks/rabbitmq/resources/vhost.rb b/cookbooks/rabbitmq/resources/vhost.rb new file mode 100644 index 0000000..8acbb85 --- /dev/null +++ b/cookbooks/rabbitmq/resources/vhost.rb @@ -0,0 +1,22 @@ +# +# Cookbook Name:: rabbitmq +# Resource:: vhost +# +# Copyright 2011, Opscode, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +actions :add, :delete + +attribute :vhost, :kind_of => String, :name_attribute => true diff --git a/cookbooks/rabbitmq/templates/default/doterlang.cookie.erb b/cookbooks/rabbitmq/templates/default/doterlang.cookie.erb new file mode 100644 index 0000000..80be847 --- /dev/null +++ b/cookbooks/rabbitmq/templates/default/doterlang.cookie.erb @@ -0,0 +1 @@ +<%= node[:rabbitmq][:erlang_cookie] %> \ No newline at end of file diff --git a/cookbooks/rabbitmq/templates/default/rabbitmq-env.conf.erb b/cookbooks/rabbitmq/templates/default/rabbitmq-env.conf.erb new file mode 100644 index 0000000..cce6243 --- /dev/null +++ b/cookbooks/rabbitmq/templates/default/rabbitmq-env.conf.erb @@ -0,0 +1,10 @@ +### +# Generated by Chef +### + +<% if node[:rabbitmq][:nodename] -%>NODENAME=<%= node[:rabbitmq][:nodename] %><% end %> +<% if node[:rabbitmq][:address] -%>NODE_IP_ADDRESS=<%= node[:rabbitmq][:address] %><% end %> +<% if node[:rabbitmq][:port] -%>NODE_PORT=<%= node[:rabbitmq][:port] %><% end %> +<% if node[:rabbitmq][:config] -%>CONFIG_FILE=<%= node[:rabbitmq][:config] %><% end %> +<% if node[:rabbitmq][:logdir] -%>LOG_BASE=<%= node[:rabbitmq][:logdir] %><% end %> +<% if node[:rabbitmq][:mnesiadir] -%>MNESIA_BASE=<%= node[:rabbitmq][:mnesiadir] %><% end %> diff --git a/cookbooks/rabbitmq/templates/default/rabbitmq.config.erb b/cookbooks/rabbitmq/templates/default/rabbitmq.config.erb new file mode 100644 index 0000000..9619082 --- /dev/null +++ b/cookbooks/rabbitmq/templates/default/rabbitmq.config.erb @@ -0,0 +1,21 @@ +%%% +%% Generated by Chef +%%% + +[ + {rabbit, [ +<% if node[:rabbitmq][:cluster] && node[:rabbitmq][:cluster_disk_nodes] -%> + {cluster_nodes, [<%= node[:rabbitmq][:cluster_disk_nodes].map{|n| "\'#{n}\'"}.join(',') %>]}, +<% end %> +<% if node[:rabbitmq][:ssl] -%> + {ssl_listeners, [<%= node[:rabbitmq][:ssl_port] %>]}, + {ssl_options, [{cacertfile,"<%= node[:rabbitmq][:ssl_cacert] %>"}, + {certfile,"<%= node[:rabbitmq][:ssl_cert] %>"}, + {keyfile,"<%= node[:rabbitmq][:ssl_key] %>"}, + {verify,verify_none}, + {fail_if_no_peer_cert,false}]}, +<% end %> + {default_user, <<"<%= node[:rabbitmq][:default_user] %>">>}, + {default_pass, <<"<%= node[:rabbitmq][:default_pass] %>">>} + ]} +]. \ No newline at end of file