UPDATE: As of 08/06/2015 the following role can be found here on Ansible Galaxy. The below information was updated based on this new role available at the above link and verified to work..However, this information below may be out of date so please grab the latest role from the Ansible Galaxy link above.

In this post I will be setting up a clustered RabbitMQ environment for logstash message queuing. Again I will be keeping this short and sweet. This might come in use for someone else as well. This setup will join each node to the cluster, setup a logstash exchange and logstash queue and then also configure the binding between our logstash exchange and logstash queue. It will also configure the ha-policy to spread the queue across all nodes and sync them automatically.

We will be starting with the following group_vars/app to setup our variables..Make sure to adjust to fit the needs of your environment…

config_rabbitmq_ha : true enable_rabbitmq_clustering : true erlang_cookie : LSKNKBELKPSTDBBCHETL rabbitmq_config : - queue_name : logstash durable : true exchange_name : logstash type : fanout routing_key : logstash tags : ' ha-mode=all,ha-sync-mode=automatic' rabbitmq_master : ans-test-1

Within our roles tree for rabbitmq it looks like below

Below will be the contents of each file within the tree from the screenshot above.

handlers/main.yml :

--- - name : restart rabbitmq-server service : name=rabbitmq-server state=restarted

tasks/main.yml :

--- - include : debian.yml when : ansible_os_family == "Debian" - name : checking to see if already clustered stat : path=/etc/rabbitmq/clustered register : clustered - include : rabbitmq_clustering.yml when : enable_rabbitmq_clustering and (clustered.stat.exists != True) - include : rabbitmq_ha_config.yml when : config_rabbitmq_ha and enable_rabbitmq_clustering

tasks/debian.yml :

--- - name : debian | adding RabbitMQ public GPG key to the apt repo apt_key : url=http://www.rabbitmq.com/rabbitmq-signing-key-public.asc state=present - name : debian | adding RabbitMQ repo apt_repository : repo='deb http://www.rabbitmq.com/debian/ testing main' update_cache=no state=present - name : debian | installing RabbitMQ server apt : name= state=present with_items : - rabbitmq-server - name : debian | enabling the RabbitMQ Management Console rabbitmq_plugin : names=rabbitmq_management state=enabled notify : restart rabbitmq-server - name : debian | ensuring that the RabbitMQ service is running service : name=rabbitmq-server state=started enabled=yes

tasks/rabbitmq_clustering.yml :

--- - name : rabbitmq_clustering | stopping rabbitmq app command : rabbitmqctl stop_app - name : rabbitmq_clustering | resetting rabbitmq app command : rabbitmqctl reset - name : rabbitmq_clustering | stopping rabbitmq-server service : name=rabbitmq-server state=stopped - name : rabbitmq_clustering | copy erlang cookie template : src=erlang.cookie.j2 dest=/var/lib/rabbitmq/.erlang.cookie owner=rabbitmq group=rabbitmq mode=0400 backup=yes - name : rabbitmq_clustering | restarting rabbitmq-server on master service : name=rabbitmq-server state=restarted when : inventory_hostname == "{{ rabbitmq_master }}" - name : rabbitmq_clustering | starting rabbitmq app on master command : rabbitmqctl start_app register : cluster_master when : inventory_hostname == "{{ rabbitmq_master }}" - name : rabbitmq_clustering | sending sigterm to any running rabbitmq processes shell : pkill -u rabbitmq || true when : inventory_hostname != "{{ rabbitmq_master }}" - name : rabbitmq_clustering | restarting rabbitmq-server service : name=rabbitmq-server state=restarted when : inventory_hostname != "{{ rabbitmq_master }}" - name : rabbitmq_clustering | stopping rabbitmq app command : rabbitmqctl stop_app when : inventory_hostname != "{{ rabbitmq_master }}" - name : rabbitmq_clustering | resetting rabbitmq app command : rabbitmqctl reset when : inventory_hostname != "{{ rabbitmq_master }}" - name : rabbitmq_clustering | joining rabbitmq cluster command : rabbitmqctl join_cluster ' [email protected] {{ rabbitmq_master }}' register : cluster_joined when : inventory_hostname != "{{ rabbitmq_master }}" - name : rabbitmq_clustering | starting rabbitmq app command : rabbitmqctl start_app when : inventory_hostname != "{{ rabbitmq_master }}" - name : rabbitmq_clustering | marking as clustered file : path=/etc/rabbitmq/clustered state=touch when : cluster_master.changed or cluster_joined.changed

tasks/rabbitmq_ha_config.yml :

--- - name : rabbitmq_ha_config | install rabbitMQ admin shell : wget http://guest: [email protected] :55672/cli/rabbitmqadmin - name : rabbitmq_ha_config | moving the rabbitMQ Admin shell : mv rabbitmqadmin /usr/sbin - name : rabbitmq_ha_config | making executable rabbitMQ Admin shell : chmod +x /usr/sbin/rabbitmqadmin notify : restart rabbitmq-server - name : rabbitmq_ha_config | creating queue(s) command : rabbitmqadmin declare queue name={{ item.queue_name }} durable={{ item.durable|lower }} run_once : true with_items : rabbitmq_config - name : rabbitmq_ha_config | setting up ha on queue(s) rabbitmq_policy : name='ha-all' pattern='{{ item.queue_name }}' tags="{{ item.tags }}" state=present run_once : true with_items : rabbitmq_config - name : rabbitmq_ha_config | creating exchange(s) command : rabbitmqadmin declare exchange name={{ item.exchange_name }} type={{ item.type }} run_once : true with_items : rabbitmq_config - name : rabbitmq_ha_config | creating binding(s) command : rabbitmqadmin declare binding source={{ item.exchange_name }} destination_type="queue" destination={{ item.queue_name }} routing_key={{ item.routing_key }} run_once : true with_items : rabbitmq_config

templates/erlang.cookie.j2 :

{{ erlang_cookie }}

When you are all done this is what you should see in your RabbitMQ web management UI.

And there you have it. You now have a highly available RabbitMQ cluster all setup by Ansible.

Enjoy!