From 109c6b750751d1c5cd216ad2f09258cf512c4c9e Mon Sep 17 00:00:00 2001 From: Larry Smith Jr Date: Sat, 3 Dec 2016 17:51:25 -0500 Subject: Addressed issue #6 Signed-off-by: Larry Smith Jr --- README.md | 118 +++++++++++ Vagrant/Vagrantfile | 228 +++++++++++++++++++++ Vagrant/bootstrap.sh | 23 +++ Vagrant/bootstrap.yml | 180 ++++++++++++++++ Vagrant/cleanup.sh | 8 + Vagrant/playbook.yml | 1 + Vagrant/requirements.yml | 1 + Vagrant/roles/ansible-rabbitmq/README.md | 118 +++++++++++ Vagrant/roles/ansible-rabbitmq/Vagrantfile | 63 ++++++ Vagrant/roles/ansible-rabbitmq/ansible.cfg | 3 + Vagrant/roles/ansible-rabbitmq/bootstrap.sh | 14 ++ Vagrant/roles/ansible-rabbitmq/bootstrap.yml | 152 ++++++++++++++ Vagrant/roles/ansible-rabbitmq/cleanup.sh | 8 + Vagrant/roles/ansible-rabbitmq/defaults/main.yml | 28 +++ Vagrant/roles/ansible-rabbitmq/handlers/main.yml | 6 + Vagrant/roles/ansible-rabbitmq/meta/main.yml | 137 +++++++++++++ Vagrant/roles/ansible-rabbitmq/playbook.yml | 25 +++ Vagrant/roles/ansible-rabbitmq/requirements.yml | 2 + Vagrant/roles/ansible-rabbitmq/tasks/debian.yml | 35 ++++ Vagrant/roles/ansible-rabbitmq/tasks/fedora.yml | 39 ++++ Vagrant/roles/ansible-rabbitmq/tasks/main.yml | 21 ++ .../ansible-rabbitmq/tasks/rabbitmq_clustering.yml | 70 +++++++ .../ansible-rabbitmq/tasks/rabbitmq_ha_config.yml | 44 ++++ .../ansible-rabbitmq/tasks/rabbitmq_users.yml | 27 +++ Vagrant/roles/ansible-rabbitmq/tasks/redhat.yml | 40 ++++ .../ansible-rabbitmq/templates/erlang.cookie.j2 | 1 + Vagrant/roles/ansible-rabbitmq/vars/main.yml | 2 + ansible.cfg | 3 + defaults/main.yml | 28 +++ handlers/main.yml | 6 + meta/main.yml | 137 +++++++++++++ playbook.yml | 25 +++ requirements.yml | 2 + tasks/debian.yml | 35 ++++ tasks/fedora.yml | 39 ++++ tasks/main.yml | 21 ++ tasks/rabbitmq_clustering.yml | 70 +++++++ tasks/rabbitmq_ha_config.yml | 44 ++++ tasks/rabbitmq_users.yml | 27 +++ tasks/redhat.yml | 40 ++++ templates/erlang.cookie.j2 | 1 + vars/main.yml | 2 + 42 files changed, 1874 insertions(+) create mode 100644 README.md create mode 100644 Vagrant/Vagrantfile create mode 100755 Vagrant/bootstrap.sh create mode 100644 Vagrant/bootstrap.yml create mode 100755 Vagrant/cleanup.sh create mode 120000 Vagrant/playbook.yml create mode 120000 Vagrant/requirements.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/README.md create mode 100644 Vagrant/roles/ansible-rabbitmq/Vagrantfile create mode 100644 Vagrant/roles/ansible-rabbitmq/ansible.cfg create mode 100755 Vagrant/roles/ansible-rabbitmq/bootstrap.sh create mode 100644 Vagrant/roles/ansible-rabbitmq/bootstrap.yml create mode 100755 Vagrant/roles/ansible-rabbitmq/cleanup.sh create mode 100644 Vagrant/roles/ansible-rabbitmq/defaults/main.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/handlers/main.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/meta/main.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/playbook.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/requirements.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/tasks/debian.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/tasks/fedora.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/tasks/main.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_clustering.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_ha_config.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_users.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/tasks/redhat.yml create mode 100644 Vagrant/roles/ansible-rabbitmq/templates/erlang.cookie.j2 create mode 100644 Vagrant/roles/ansible-rabbitmq/vars/main.yml create mode 100644 ansible.cfg create mode 100644 defaults/main.yml create mode 100644 handlers/main.yml create mode 100644 meta/main.yml create mode 100644 playbook.yml create mode 100644 requirements.yml create mode 100644 tasks/debian.yml create mode 100644 tasks/fedora.yml create mode 100644 tasks/main.yml create mode 100644 tasks/rabbitmq_clustering.yml create mode 100644 tasks/rabbitmq_ha_config.yml create mode 100644 tasks/rabbitmq_users.yml create mode 100644 tasks/redhat.yml create mode 100644 templates/erlang.cookie.j2 create mode 100644 vars/main.yml diff --git a/README.md b/README.md new file mode 100644 index 0000000..03cd1aa --- /dev/null +++ b/README.md @@ -0,0 +1,118 @@ +Role Name +========= + +Installs rabbitmq https://www.rabbitmq.com/ (Configurable...HA and Clustering ready) + +Requirements +------------ + +Ensure hostnames are resolvable prior to clustering...either update /etc/hosts or ensure DNS is working. + +Vagrant +------- + +Spin up a 3 node HA Cluster for testing... +Install Ansible role on your host: +```` +sudo ansible-galaxy install -r requirements.yml -f +```` +Now spin up your environment... +```` +vagrant up +```` +When you are done testing, tear it all down... +```` +./cleanup.sh +```` + +Role Variables +-------------- + +```` +--- +# defaults file for ansible-rabbitmq +rabbitmq_config_ha: false #defines if rabbitmq ha should be configured...define here or in group_vars/group +rabbitmq_enable_clustering: false #defines if setting up a rabbitmq cluster...define here or in group_vars/group +rabbitmq_erlang_cookie: 'LSKNKBELKPSTDBBCHETL' #define erlang cookie for cluster...define here or in group_vars/group +rabbitmq_erlang_cookie_file: '/var/lib/rabbitmq/.erlang.cookie' +rabbitmq_config: + - queue_name: logstash + durable: true + exchange_name: logstash + type: direct + routing_key: logstash + tags: 'ha-mode=all,ha-sync-mode=automatic' +rabbitmq_debian_repo: 'deb http://www.rabbitmq.com/debian/ testing main' +rabbitmq_debian_repo_key: 'http://www.rabbitmq.com/rabbitmq-signing-key-public.asc' +rabbitmq_master: [] #defines the inventory host that should be considered master...define here or in group_vars/group +rabbitmq_redhat_repo_key: 'https://www.rabbitmq.com/rabbitmq-signing-key-public.asc' +rabbitmq_redhat_package: 'rabbitmq-server-{{ rabbitmq_redhat_version }}-1.noarch.rpm' +rabbitmq_redhat_url: 'http://www.rabbitmq.com/releases/rabbitmq-server/v{{ rabbitmq_redhat_version }}' +rabbitmq_redhat_version: '3.6.1' +rabbitmq_users: #define admin user to create in order to login to WebUI + - name: rabbitmqadmin + password: rabbitmqadmin + vhost: / + configure_priv: '.*' + read_priv: '.*' + write_priv: '.*' + tags: 'administrator' #define comma separated list of tags to assign to user....management,policymaker,monitoring,administrator...required for management plugin. https://www.rabbitmq.com/management.html +```` + +example... +group_vars/rabbitmq-cluster-nodes +```` +--- +rabbitmq_enable_clustering: true +rabbitmq_config_ha: false +rabbitmq_master: ans-test-1 +```` + +Dependencies +------------ + +None + +Example Playbook +---------------- + +```` +--- +- hosts: all + become: true + vars: + - pri_domain_name: 'test.vagrant.local' + roles: + tasks: + - name: updating /etc/hosts + lineinfile: + dest: /etc/hosts + regexp: "^{{ hostvars[item].ansible_ssh_host }} {{ item }} {{ item }}.{{ pri_domain_name }}" + line: "{{ hostvars[item].ansible_ssh_host }} {{ item }} {{ item }}.{{ pri_domain_name }}" + state: present + with_items: groups['all'] + +- hosts: all + become: true + vars: + - rabbitmq_config_ha: true + - rabbitmq_enable_clustering: true + - pri_domain_name: 'test.vagrant.local' + - rabbitmq_master: 'node0' + roles: + - role: ansible-rabbitmq + tasks: +```` + +License +------- + +BSD + +Author Information +------------------ + +Larry Smith Jr. +- @mrlesmithjr +- http://everythingshouldbevirtual.com +- mrlesmithjr [at] gmail.com diff --git a/Vagrant/Vagrantfile b/Vagrant/Vagrantfile new file mode 100644 index 0000000..bca5718 --- /dev/null +++ b/Vagrant/Vagrantfile @@ -0,0 +1,228 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. + +# ---- Define number of nodes to spin up ---- +N = 3 + +# ---- Define any custom memory/cpu requirement ---- +# if custom requirements are desired...ensure to set +# custom_cpu_mem == true otherwise set to false +# By default if custom requirements are defined and set below +# any node not defined will be configured as the default... +# which is 1vCPU/512mb...So if setting custom requirements +# only define any node which requires more than the defaults. +nodes = [ + { + :node => "node0", + :box => "mrlesmithjr/trusty64", + :cpu => 1, + :mem => 1024 + } +] + +# ---- Define variables below ---- +#Define if additional disks should be added (true|false) +additional_disks = false +additional_disks_controller = "SATA Controller" +#Define the number of additional disks to add +additional_disks_num = 1 +#Define disk size in GB +additional_disks_size = 10 +#Define if additional network adapters should be created (true|false) +additional_nics = true +#Define if add'l network adapters are auto configured addresses (true|false) +additional_nics_auto_config = true +#Define if additional network adapters should be DHCP assigned (true|false) +additional_nics_dhcp = false +#Define the number of additional nics to add +additional_nics_num = 1 +ansible_groups = { + "test-nodes" => ["node[0:#{N-1}]"] +} +#Define Vagrant box to load +box = "ubuntu/trusty64" +#Define if custom cpu and memory requirements are needed (true|false) + #defined within nodes variable above +custom_cpu_mem = false +#Define if running desktop OS (true|false) +desktop = false +#Define if custom boxes should be used...defined in nodes var.. +enable_custom_boxes = false +#Define if port forwards should be enabled (true|false) +enable_port_forwards = false +#Defines if nodes should be linked from master VM (true|false) +linked_clones = false +port_forwards = [ + { + :node => "node0", + :guest => 3306, + :host => 3306 + }, + { + :node => "node0", + :guest => 80, + :host => 8080 + }, + { + :node => "node0", + :guest => 8000, + :host => 8000 + } +] +#Define if provisioners should run (true|false) +provision_nodes = true +#Define if IP's are random assigned if not DHCP (true|false) +random_ips = false +#Define number of CPU cores + #will be ignored if custom_cpu_mem == true +server_cpus = 1 +#Define amount of memory to assign to node(s) + #will be ignored if custom_cpu_mem == true +server_memory = 512 +#Define subnet for private_network (If not using DHCP) +subnet = "192.168.202." +#Define starting last octet of the subnet range to begin addresses for node(s) +subnet_ip_start = 200 + +Vagrant.configure(2) do |config| + + #Iterate over nodes + (1..N).each do |node_id| + nid = (node_id - 1) + + config.vm.define "node#{nid}" do |node| + if enable_custom_boxes + #Initially no so it can be set to yes if found in custom box defined + box_set = "no" + nodes.each do |cust_box| + if cust_box[:node] == "node#{nid}" + node.vm.box = cust_box[:box] + box_set = "yes" + end + end + if box_set == "no" + node.vm.box = box + end + end + if not enable_custom_boxes + node.vm.box = box + end + node.vm.provider "virtualbox" do |vb| + if linked_clones + vb.linked_clone = true + end + if not custom_cpu_mem + vb.customize ["modifyvm", :id, "--cpus", server_cpus] + vb.customize ["modifyvm", :id, "--memory", server_memory] + end + if custom_cpu_mem + nodes.each do |cust_node| + if cust_node[:node] == "node#{nid}" + vb.customize ["modifyvm", :id, "--cpus", cust_node[:cpu]] + vb.customize ["modifyvm", :id, "--memory", cust_node[:mem]] + end + end + end + + # Setup desktop environment + if desktop + vb.gui = true + vb.customize ["modifyvm", :id, "--graphicscontroller", "vboxvga"] + vb.customize ["modifyvm", :id, "--accelerate3d", "on"] + vb.customize ["modifyvm", :id, "--ioapic", "on"] + vb.customize ["modifyvm", :id, "--vram", "128"] + vb.customize ["modifyvm", :id, "--hwvirtex", "on"] + end + + # Add additional disks + if additional_disks + (1..additional_disks_num).each do |disk_num| + dnum = (disk_num + 1) + ddev = ("node#{nid}_Disk#{dnum}.vdi") + unless File.exist?("#{ddev}") + vb.customize ['createhd', '--filename', ("#{ddev}"), \ + '--variant', 'Fixed', '--size', additional_disks_size * 1024] + end + vb.customize ['storageattach', :id, '--storagectl', \ + "#{additional_disks_controller}", '--port', dnum, '--device', 0, \ + '--type', 'hdd', '--medium', "node#{nid}_Disk#{dnum}.vdi"] + end + end + end + node.vm.hostname = "node#{nid}" + + # Define additional network adapters below + if additional_nics + if not additional_nics_dhcp + (1..additional_nics_num).each do |nic_num| + if random_ips + nnum = Random.rand(0..50) + if additional_nics_auto_config + node.vm.network :private_network, \ + ip: subnet+"#{subnet_ip_start + nid + nnum}" + end + if not additional_nics_auto_config + node.vm.network :private_network, \ + ip: subnet+"#{subnet_ip_start + nid + nnum}", + auto_config: false + end + end + if not random_ips + if additional_nics_auto_config + node.vm.network :private_network, \ + ip: subnet+"#{subnet_ip_start + nid}" + end + if not additional_nics_auto_config + node.vm.network :private_network, \ + ip: subnet+"#{subnet_ip_start + nid}", + auto_config: false + end + end + end + end + if additional_nics_dhcp + (1..additional_nics_num).each do |nic_num| + node.vm.network :private_network, type: "dhcp" + end + end + end + + # Define port forwards below + if enable_port_forwards + port_forwards.each do |pf| + if pf[:node] == "node#{nid}" + node.vm.network :forwarded_port, guest: pf[:guest], \ + host: pf[:host] + end + end + end + + # Provisioners + if provision_nodes + if node_id == N + node.vm.provision "ansible" do |ansible| + ansible.limit = "all" + #runs bootstrap Ansible playbook + ansible.playbook = "bootstrap.yml" + end + node.vm.provision "ansible" do |ansible| + ansible.limit = "all" + #runs Ansible playbook for installing roles/executing tasks + ansible.playbook = "playbook.yml" + ansible.groups = ansible_groups + end + end + end + + end + end + if provision_nodes + #runs initial shell script + config.vm.provision :shell, path: "bootstrap.sh", keep_color: "true" + end +end diff --git a/Vagrant/bootstrap.sh b/Vagrant/bootstrap.sh new file mode 100755 index 0000000..5f1620e --- /dev/null +++ b/Vagrant/bootstrap.sh @@ -0,0 +1,23 @@ +#!/bin/bash +if [ -f /etc/debian_version ]; then + codename="$(lsb_release -c | awk {'print $2}')" + if [[ $codename == "vivid" ]]; then + sudo apt-get update && \ + sudo apt-get -y install python-simplejson + fi + if [[ $codename == "wily" ]]; then + sudo apt-get update && \ + sudo apt-get -y install python-simplejson + fi + if [[ $codename == "xenial" ]]; then + sudo apt-get update && \ + sudo apt-get -y install python-simplejson + fi +fi +if [ -f /etc/redhat-release ]; then + codename="$(gawk -F= '/^NAME/{print $2}' /etc/os-release)" + if [[ $codename == "Fedora" ]]; then + sudo dnf -y install python-devel python-dnf && \ + sudo dnf -y group install "C Development Tools and Libraries" + fi +fi diff --git a/Vagrant/bootstrap.yml b/Vagrant/bootstrap.yml new file mode 100644 index 0000000..fbd17cb --- /dev/null +++ b/Vagrant/bootstrap.yml @@ -0,0 +1,180 @@ +--- +- hosts: all + remote_user: vagrant + become: true + vars: + - host_vars_directory: './host_vars' + - host_vars_file: '{{ host_vars_directory }}/{{ inventory_hostname }}.yml' + - pri_domain_name: 'vagrant.local' + - ssh_key_path: '.vagrant/machines/{{ inventory_hostname }}/virtualbox/private_key' + - update_host_vars: true + roles: + tasks: + - name: updating apt cache (Debian) + apt: + update_cache: yes + cache_valid_time: 3600 + when: ansible_os_family == "Debian" + + - name: installing ansible pre-reqs (Debian) + apt: + name: "{{ item }}" + state: present + with_items: + - libffi-dev + - libssl-dev + - python-dev + - python-setuptools + when: > + ansible_os_family == "Debian" + + - name: installing epel repo (RedHat) + yum: + name: "epel-release" + state: present + when: > + ansible_os_family == "RedHat" and + ansible_distribution != "Fedora" + + - name: installing ansible pre-reqs (RedHat) + yum: + name: "{{ item }}" + state: present + with_items: + - libffi-devel + - openssl-devel + - python-crypto + - python-devel + - python-setuptools + when: > + ansible_os_family == "RedHat" and + ansible_distribution != "Fedora" + + - name: installing ansible pre-reqs (Fedora) + dnf: + name: "{{ item }}" + state: present + with_items: + - gmp-devel + - libffi-devel + - openssl-devel + - python-crypto + - python-devel + - python-dnf + - python-setuptools + - redhat-rpm-config + when: > + ansible_os_family == "RedHat" and + ansible_distribution == "Fedora" + + - name: installing ansible pre-reqs (openSUSE) + zypper: + name: "{{ item }}" + state: present + with_items: + - gmp-devel + - libffi-devel + - openssl-devel + - python-crypto + - python-devel + - python-setuptools + when: > + ansible_os_family == "openSUSE Leap" + + - name: installing python pip + easy_install: + name: "pip" + state: present + + - name: installing ansible + pip: + name: "ansible" + state: present + version: 1.9.6 + + - name: ensuring host_vars directory exists + file: + path: "./host_vars" + state: directory + delegate_to: localhost + run_once: true + become: false + when: update_host_vars is defined and update_host_vars + + - name: ensuring host file exists in host_vars + stat: + path: "{{ host_vars_file }}" + delegate_to: localhost + register: host_var + become: false + when: > + update_host_vars is defined and + update_host_vars + + - name: creating missing host_vars + file: + path: "{{ host_vars_file }}" + state: touch + delegate_to: localhost + become: false + when: not host_var.stat.exists + + - name: updating ansible_ssh_port + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "^ansible_ssh_port{{ ':' }}" + line: "ansible_ssh_port{{ ':' }} 22" + delegate_to: localhost + become: false + when: > + (update_host_vars is defined and + update_host_vars) and + (ansible_eth1 is defined or + ansible_enp0s8 is defined) + + - name: updating ansible_ssh_host + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "^ansible_ssh_host{{ ':' }}" + line: "ansible_ssh_host{{ ':' }} {{ ansible_eth1.ipv4.address }}" + delegate_to: localhost + become: false + when: > + (update_host_vars is defined and + update_host_vars) and + ansible_eth1 is defined + + - name: updating ansible_ssh_host + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "^ansible_ssh_host{{ ':' }}" + line: "ansible_ssh_host{{ ':' }} {{ ansible_enp0s8.ipv4.address }}" + delegate_to: localhost + become: false + when: > + (update_host_vars is defined and + update_host_vars) and + ansible_enp0s8 is defined + + - name: updating ansible_ssh_key + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "^ansible_ssh_private_key_file{{ ':' }}" + line: "ansible_ssh_private_key_file{{ ':' }} {{ ssh_key_path }}" + delegate_to: localhost + become: false + when: > + update_host_vars is defined and + update_host_vars + + - name: ensuring host_vars is yaml formatted + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "---" + line: "---" + insertbefore: BOF + delegate_to: localhost + become: false + when: > + update_host_vars is defined and + update_host_vars diff --git a/Vagrant/cleanup.sh b/Vagrant/cleanup.sh new file mode 100755 index 0000000..a049429 --- /dev/null +++ b/Vagrant/cleanup.sh @@ -0,0 +1,8 @@ +#!/bin/bash +vagrant destroy -f +if [ -d host_vars ]; then + rm -rf host_vars +fi +if [ -d .vagrant ]; then + rm -rf .vagrant +fi diff --git a/Vagrant/playbook.yml b/Vagrant/playbook.yml new file mode 120000 index 0000000..7622583 --- /dev/null +++ b/Vagrant/playbook.yml @@ -0,0 +1 @@ +../playbook.yml \ No newline at end of file diff --git a/Vagrant/requirements.yml b/Vagrant/requirements.yml new file mode 120000 index 0000000..6e76d52 --- /dev/null +++ b/Vagrant/requirements.yml @@ -0,0 +1 @@ +../requirements.yml \ No newline at end of file diff --git a/Vagrant/roles/ansible-rabbitmq/README.md b/Vagrant/roles/ansible-rabbitmq/README.md new file mode 100644 index 0000000..03cd1aa --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/README.md @@ -0,0 +1,118 @@ +Role Name +========= + +Installs rabbitmq https://www.rabbitmq.com/ (Configurable...HA and Clustering ready) + +Requirements +------------ + +Ensure hostnames are resolvable prior to clustering...either update /etc/hosts or ensure DNS is working. + +Vagrant +------- + +Spin up a 3 node HA Cluster for testing... +Install Ansible role on your host: +```` +sudo ansible-galaxy install -r requirements.yml -f +```` +Now spin up your environment... +```` +vagrant up +```` +When you are done testing, tear it all down... +```` +./cleanup.sh +```` + +Role Variables +-------------- + +```` +--- +# defaults file for ansible-rabbitmq +rabbitmq_config_ha: false #defines if rabbitmq ha should be configured...define here or in group_vars/group +rabbitmq_enable_clustering: false #defines if setting up a rabbitmq cluster...define here or in group_vars/group +rabbitmq_erlang_cookie: 'LSKNKBELKPSTDBBCHETL' #define erlang cookie for cluster...define here or in group_vars/group +rabbitmq_erlang_cookie_file: '/var/lib/rabbitmq/.erlang.cookie' +rabbitmq_config: + - queue_name: logstash + durable: true + exchange_name: logstash + type: direct + routing_key: logstash + tags: 'ha-mode=all,ha-sync-mode=automatic' +rabbitmq_debian_repo: 'deb http://www.rabbitmq.com/debian/ testing main' +rabbitmq_debian_repo_key: 'http://www.rabbitmq.com/rabbitmq-signing-key-public.asc' +rabbitmq_master: [] #defines the inventory host that should be considered master...define here or in group_vars/group +rabbitmq_redhat_repo_key: 'https://www.rabbitmq.com/rabbitmq-signing-key-public.asc' +rabbitmq_redhat_package: 'rabbitmq-server-{{ rabbitmq_redhat_version }}-1.noarch.rpm' +rabbitmq_redhat_url: 'http://www.rabbitmq.com/releases/rabbitmq-server/v{{ rabbitmq_redhat_version }}' +rabbitmq_redhat_version: '3.6.1' +rabbitmq_users: #define admin user to create in order to login to WebUI + - name: rabbitmqadmin + password: rabbitmqadmin + vhost: / + configure_priv: '.*' + read_priv: '.*' + write_priv: '.*' + tags: 'administrator' #define comma separated list of tags to assign to user....management,policymaker,monitoring,administrator...required for management plugin. https://www.rabbitmq.com/management.html +```` + +example... +group_vars/rabbitmq-cluster-nodes +```` +--- +rabbitmq_enable_clustering: true +rabbitmq_config_ha: false +rabbitmq_master: ans-test-1 +```` + +Dependencies +------------ + +None + +Example Playbook +---------------- + +```` +--- +- hosts: all + become: true + vars: + - pri_domain_name: 'test.vagrant.local' + roles: + tasks: + - name: updating /etc/hosts + lineinfile: + dest: /etc/hosts + regexp: "^{{ hostvars[item].ansible_ssh_host }} {{ item }} {{ item }}.{{ pri_domain_name }}" + line: "{{ hostvars[item].ansible_ssh_host }} {{ item }} {{ item }}.{{ pri_domain_name }}" + state: present + with_items: groups['all'] + +- hosts: all + become: true + vars: + - rabbitmq_config_ha: true + - rabbitmq_enable_clustering: true + - pri_domain_name: 'test.vagrant.local' + - rabbitmq_master: 'node0' + roles: + - role: ansible-rabbitmq + tasks: +```` + +License +------- + +BSD + +Author Information +------------------ + +Larry Smith Jr. +- @mrlesmithjr +- http://everythingshouldbevirtual.com +- mrlesmithjr [at] gmail.com diff --git a/Vagrant/roles/ansible-rabbitmq/Vagrantfile b/Vagrant/roles/ansible-rabbitmq/Vagrantfile new file mode 100644 index 0000000..9c68a3d --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/Vagrantfile @@ -0,0 +1,63 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure(2) do |config| + #Define if running desktop OS to yes otherwise no + Desktop = "no" + #Define the number of nodes to spin up + N = 3 + + #Iterate over nodes + (1..N).each do |node_id| + nid = (node_id - 1) + + config.vm.define "node#{nid}" do |node| + node.vm.box = "mrlesmithjr/centos-7" + node.vm.provider "virtualbox" do |vb| + vb.memory = "1024" + vb.cpus = "1" + if Desktop == "yes" + vb.gui = true + vb.customize ["modifyvm", :id, "--graphicscontroller", "vboxvga"] + vb.customize ["modifyvm", :id, "--accelerate3d", "on"] + vb.customize ["modifyvm", :id, "--ioapic", "on"] + vb.customize ["modifyvm", :id, "--vram", "128"] + vb.customize ["modifyvm", :id, "--hwvirtex", "on"] + end + end + node.vm.hostname = "node#{nid}" + ### Define additional network adapters below + node.vm.network :private_network, ip: "192.168.202.#{200 + nid}" + + ### Define port forwards below +# node.vm.network "forwarded_port", guest: 80, host: "#{8080 + nid}" +# node.vm.network "forwarded_port", guest: 3000, host: "#{3000 + nid}" + + if node_id == N + node.vm.provision :shell, path: "bootstrap.sh", keep_color: "true" #runs initial shell script + node.vm.provision "ansible" do |ansible| #runs bootstrap Ansible playbook + ansible.limit = "all" + ansible.playbook = "bootstrap.yml" + end + node.vm.provision "ansible" do |ansible| #runs Ansible playbook for installing roles/executing tasks + ansible.limit = "all" + ansible.playbook = "playbook.yml" + ansible.groups = { + "test-nodes" => [ + "node0", + "node1" + ], + "prod-nodes" => [ + "node2" + ] + } + end + end + + end + end +end diff --git a/Vagrant/roles/ansible-rabbitmq/ansible.cfg b/Vagrant/roles/ansible-rabbitmq/ansible.cfg new file mode 100644 index 0000000..5a1e589 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/ansible.cfg @@ -0,0 +1,3 @@ +[defaults] +host_key_checking = False +#roles_path = ../ diff --git a/Vagrant/roles/ansible-rabbitmq/bootstrap.sh b/Vagrant/roles/ansible-rabbitmq/bootstrap.sh new file mode 100755 index 0000000..7bcf8b0 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/bootstrap.sh @@ -0,0 +1,14 @@ +#!/bin/bash +if [ -f /etc/debian_version ]; then + codename="$(lsb_release -c | awk {'print $2}')" + if [ $codename == "vivid" ]; then + sudo apt-get update && sudo apt-get -y install python-simplejson + fi +fi +if [ -f /etc/redhat-release ]; then + codename="$(gawk -F= '/^NAME/{print $2}' /etc/os-release)" + if [ $codename == "Fedora" ]; then + sudo dnf -y install python-devel python-dnf python-pip && \ + sudo dnf -y group install "C Development Tools and Libraries" + fi +fi diff --git a/Vagrant/roles/ansible-rabbitmq/bootstrap.yml b/Vagrant/roles/ansible-rabbitmq/bootstrap.yml new file mode 100644 index 0000000..702b540 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/bootstrap.yml @@ -0,0 +1,152 @@ +--- +- hosts: all + remote_user: vagrant + become: true + vars: + - host_vars_directory: './host_vars' + - host_vars_file: '{{ host_vars_directory }}/{{ inventory_hostname }}.yml' + - pri_domain_name: 'vagrant.local' + - ssh_key_path: '.vagrant/machines/{{ inventory_hostname }}/virtualbox/private_key' + - update_host_vars: true + roles: + tasks: + - name: updating apt cache (Debian) + apt: + update_cache: yes + cache_valid_time: 3600 + when: ansible_os_family == "Debian" + + - name: installing ansible pre-reqs (Debian) + apt: + name: "{{ item }}" + state: present + with_items: + - python-dev + - python-pip + when: ansible_os_family == "Debian" + + - name: installing epel repo (RedHat) + yum: + name: "epel-release" + state: present + when: > + ansible_os_family == "RedHat" and + ansible_distribution != "Fedora" + + - name: installing ansible pre-reqs (RedHat) + yum: + name: "{{ item }}" + state: present + with_items: + - python-devel + - python-dnf + - python-pip + when: > + ansible_os_family == "RedHat" and + ansible_distribution != "Fedora" + + - name: installing ansible pre-reqs (Fedora) + dnf: + name: "{{ item }}" + state: present + with_items: + - gmp-devel + - python-crypto + - python-devel + - python-dnf + - python-pip + when: > + ansible_os_family == "RedHat" and + ansible_distribution == "Fedora" + + - name: installing ansible + pip: + name: "ansible" + state: present + + - name: ensuring host_vars directory exists + file: + path: "./host_vars" + state: directory + delegate_to: localhost + run_once: true + become: false + when: update_host_vars is defined and update_host_vars + + - name: ensuring host file exists in host_vars + stat: + path: "{{ host_vars_file }}" + delegate_to: localhost + register: host_var + become: false + when: > + update_host_vars is defined and + update_host_vars + + - name: creating missing host_vars + file: + path: "{{ host_vars_file }}" + state: touch + delegate_to: localhost + become: false + when: not host_var.stat.exists + + - name: updating ansible_ssh_port + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "^ansible_ssh_port{{ ':' }}" + line: "ansible_ssh_port{{ ':' }} 22" + delegate_to: localhost + become: false + when: > + (update_host_vars is defined and + update_host_vars) and + (ansible_eth1 is defined or + ansible_enp0s8 is defined) + + - name: updating ansible_ssh_host + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "^ansible_ssh_host{{ ':' }}" + line: "ansible_ssh_host{{ ':' }} {{ ansible_eth1.ipv4.address }}" + delegate_to: localhost + become: false + when: > + (update_host_vars is defined and + update_host_vars) and + ansible_eth1 is defined + + - name: updating ansible_ssh_host + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "^ansible_ssh_host{{ ':' }}" + line: "ansible_ssh_host{{ ':' }} {{ ansible_enp0s8.ipv4.address }}" + delegate_to: localhost + become: false + when: > + (update_host_vars is defined and + update_host_vars) and + ansible_enp0s8 is defined + + - name: updating ansible_ssh_key + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "^ansible_ssh_private_key_file{{ ':' }}" + line: "ansible_ssh_private_key_file{{ ':' }} {{ ssh_key_path }}" + delegate_to: localhost + become: false + when: > + update_host_vars is defined and + update_host_vars + + - name: ensuring host_vars is yaml formatted + lineinfile: + dest: "{{ host_vars_file }}" + regexp: "---" + line: "---" + insertbefore: BOF + delegate_to: localhost + become: false + when: > + update_host_vars is defined and + update_host_vars diff --git a/Vagrant/roles/ansible-rabbitmq/cleanup.sh b/Vagrant/roles/ansible-rabbitmq/cleanup.sh new file mode 100755 index 0000000..a049429 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/cleanup.sh @@ -0,0 +1,8 @@ +#!/bin/bash +vagrant destroy -f +if [ -d host_vars ]; then + rm -rf host_vars +fi +if [ -d .vagrant ]; then + rm -rf .vagrant +fi diff --git a/Vagrant/roles/ansible-rabbitmq/defaults/main.yml b/Vagrant/roles/ansible-rabbitmq/defaults/main.yml new file mode 100644 index 0000000..ad22ead --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/defaults/main.yml @@ -0,0 +1,28 @@ +--- +# defaults file for ansible-rabbitmq +rabbitmq_config: + - queue_name: 'logstash' + durable: true + exchange_name: logstash + type: 'direct' + routing_key: 'logstash' + tags: 'ha-mode=all,ha-sync-mode=automatic' +rabbitmq_config_ha: false #defines if rabbitmq ha should be configured...define here or in group_vars/group +rabbitmq_debian_repo: 'deb http://www.rabbitmq.com/debian/ testing main' +rabbitmq_debian_repo_key: 'https://www.rabbitmq.com/rabbitmq-release-signing-key.asc' +rabbitmq_enable_clustering: false #defines if setting up a rabbitmq cluster...define here or in group_vars/group +rabbitmq_erlang_cookie: 'LSKNKBELKPSTDBBCHETL' #define erlang cookie for cluster...define here or in group_vars/group +rabbitmq_erlang_cookie_file: '/var/lib/rabbitmq/.erlang.cookie' +rabbitmq_master: [] #defines the inventory host that should be considered master...define here or in group_vars/group +rabbitmq_redhat_repo_key: 'https://www.rabbitmq.com/rabbitmq-signing-key-public.asc' +rabbitmq_redhat_package: 'rabbitmq-server-{{ rabbitmq_redhat_version }}-1.noarch.rpm' +rabbitmq_redhat_url: 'http://www.rabbitmq.com/releases/rabbitmq-server/v{{ rabbitmq_redhat_version }}' +rabbitmq_redhat_version: '3.6.1' +rabbitmq_users: #define admin user to create in order to login to WebUI + - name: 'rabbitmqadmin' + password: 'rabbitmqadmin' + vhost: '/' + configure_priv: '.*' + read_priv: '.*' + write_priv: '.*' + tags: 'administrator' #define comma separated list of tags to assign to user....management,policymaker,monitoring,administrator...required for management plugin. https://www.rabbitmq.com/management.html diff --git a/Vagrant/roles/ansible-rabbitmq/handlers/main.yml b/Vagrant/roles/ansible-rabbitmq/handlers/main.yml new file mode 100644 index 0000000..259ce1c --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/handlers/main.yml @@ -0,0 +1,6 @@ +--- +# handlers file for ansible-rabbitmq +- name: restart rabbitmq-server + service: + name: "rabbitmq-server" + state: restarted diff --git a/Vagrant/roles/ansible-rabbitmq/meta/main.yml b/Vagrant/roles/ansible-rabbitmq/meta/main.yml new file mode 100644 index 0000000..b25c818 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/meta/main.yml @@ -0,0 +1,137 @@ +--- +galaxy_info: + author: Larry Smith Jr. + description: Installs rabbitmq https://www.rabbitmq.com/ (Configurable...HA and Clustering ready) + #company: your company (optional) + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + platforms: + - name: EL + versions: + # - all + # - 5 + # - 6 + - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + - name: Fedora + versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + - 22 + - 23 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + - name: Ubuntu + versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + - clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + - system + #- web +dependencies: [] + # List your role dependencies here, one per line. Only + # dependencies available via galaxy should be listed here. + # Be sure to remove the '[]' above if you add dependencies + # to this list. diff --git a/Vagrant/roles/ansible-rabbitmq/playbook.yml b/Vagrant/roles/ansible-rabbitmq/playbook.yml new file mode 100644 index 0000000..498c829 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/playbook.yml @@ -0,0 +1,25 @@ +--- +- hosts: all + become: true + vars: + - pri_domain_name: 'test.vagrant.local' + roles: + tasks: + - name: updating /etc/hosts + lineinfile: + dest: /etc/hosts + regexp: "^{{ hostvars[item].ansible_ssh_host }} {{ item }} {{ item }}.{{ pri_domain_name }}" + line: "{{ hostvars[item].ansible_ssh_host }} {{ item }} {{ item }}.{{ pri_domain_name }}" + state: present + with_items: groups['all'] + +- hosts: all + become: true + vars: + - rabbitmq_config_ha: true + - rabbitmq_enable_clustering: true + - pri_domain_name: 'test.vagrant.local' + - rabbitmq_master: 'node0' + roles: + - role: ansible-rabbitmq + tasks: diff --git a/Vagrant/roles/ansible-rabbitmq/requirements.yml b/Vagrant/roles/ansible-rabbitmq/requirements.yml new file mode 100644 index 0000000..a1f51cb --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/requirements.yml @@ -0,0 +1,2 @@ +--- +- src: https://github.com/mrlesmithjr/ansible-rabbitmq.git diff --git a/Vagrant/roles/ansible-rabbitmq/tasks/debian.yml b/Vagrant/roles/ansible-rabbitmq/tasks/debian.yml new file mode 100644 index 0000000..a031ead --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/tasks/debian.yml @@ -0,0 +1,35 @@ +--- +- name: debian | adding RabbitMQ public GPG key to the apt repo + apt_key: + url: "{{ rabbitmq_debian_repo_key }}" + state: present + +- name: debian | adding RabbitMQ repo + apt_repository: + repo: "{{ rabbitmq_debian_repo }}" + state: present + register: "rabbitmq_repo_added" + +- name: debian | updating apt cache + apt: + update_cache: yes + when: rabbitmq_repo_added.changed + +- name: debian | installing RabbitMQ server + apt: + name: "{{ item }}" + 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 diff --git a/Vagrant/roles/ansible-rabbitmq/tasks/fedora.yml b/Vagrant/roles/ansible-rabbitmq/tasks/fedora.yml new file mode 100644 index 0000000..3d92963 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/tasks/fedora.yml @@ -0,0 +1,39 @@ +--- +- name: fedora | installing pre-reqs + dnf: + name: "{{ item }}" + state: present + with_items: + - wget + +- name: fedora | installing erlang + dnf: + name: "erlang" + state: present + +- name: fedora | adding RabbitMQ public GPG key + rpm_key: + key: "{{ rabbitmq_redhat_repo_key }}" + state: present + +- name: fedora | downloading RabbitMQ + get_url: + url: "{{ rabbitmq_redhat_url }}/{{ rabbitmq_redhat_package }}" + dest: "/opt/{{ rabbitmq_redhat_package }}" + +- name: fedora | installing RabbitMQ + dnf: + name: "/opt/{{ rabbitmq_redhat_package }}" + state: present + +- name: fedora | starting and enabling RabbitMQ service + service: + name: "rabbitmq-server" + state: started + enabled: yes + +- name: fedora | enabling the RabbitMQ Management Console + rabbitmq_plugin: + names: rabbitmq_management + state: enabled + notify: restart rabbitmq-server diff --git a/Vagrant/roles/ansible-rabbitmq/tasks/main.yml b/Vagrant/roles/ansible-rabbitmq/tasks/main.yml new file mode 100644 index 0000000..bd82f93 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/tasks/main.yml @@ -0,0 +1,21 @@ +# tasks file for ansible-rabbitmq +- include: debian.yml + when: ansible_os_family == "Debian" + +- include: redhat.yml + when: ansible_distribution == "CentOS" or ansible_distribution == "Red Hat Enterprise Linux" + +- include: fedora.yml + when: ansible_distribution == "Fedora" + +- name: checking to see if already clustered + stat: path=/etc/rabbitmq/clustered + register: clustered + +- include: rabbitmq_clustering.yml + when: rabbitmq_enable_clustering and (clustered.stat.exists != True) + +- include: rabbitmq_ha_config.yml + when: rabbitmq_config_ha and rabbitmq_enable_clustering + +- include: rabbitmq_users.yml diff --git a/Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_clustering.yml b/Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_clustering.yml new file mode 100644 index 0000000..9dece46 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_clustering.yml @@ -0,0 +1,70 @@ +--- +- 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: grabbing erlang cookie +# shell: cat /var/lib/rabbitmq/.erlang.cookie +# register: rabbitmq_erlang_cookie +# when: inventory_hostname == "{{ rabbitmq_master }}" + +- name: rabbitmq_clustering | copy erlang cookie + template: + src: erlang.cookie.j2 + dest: "{{ rabbitmq_erlang_cookie_file }}" + owner: rabbitmq + group: rabbitmq + mode: 0400 + backup: yes #backing up in case the need to recover +# when: inventory_hostname != "{{ rabbitmq_master }}" + +- 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 'rabbit@{{ 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 diff --git a/Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_ha_config.yml b/Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_ha_config.yml new file mode 100644 index 0000000..8811b6d --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_ha_config.yml @@ -0,0 +1,44 @@ +--- +- name: rabbitmq_ha_config | checking if rabbitmqadmin is installed + stat: + path: /usr/sbin/rabbitmqadmin + register: rabbitmqadmin_check + +- name: rabbitmq_ha_config | install rabbitMQ admin + shell: wget http://guest:guest@localhost:15672/cli/rabbitmqadmin + when: not rabbitmqadmin_check.stat.exists + +- name: rabbitmq_ha_config | moving the rabbitMQ Admin + shell: mv rabbitmqadmin /usr/sbin + when: not rabbitmqadmin_check.stat.exists + +- name: rabbitmq_ha_config | making executable rabbitMQ Admin + shell: chmod +x /usr/sbin/rabbitmqadmin + notify: restart rabbitmq-server + when: not rabbitmqadmin_check.stat.exists + +- 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 }}" + when: item.exchange_name is defined + +- 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 }}" + when: item.exchange_name is defined diff --git a/Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_users.yml b/Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_users.yml new file mode 100644 index 0000000..8bce8b2 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/tasks/rabbitmq_users.yml @@ -0,0 +1,27 @@ +--- +- name: rabbitmq_users | creating rabbitmq users + rabbitmq_user: + name: "{{ item.name }}" + password: "{{ item.password }}" + vhost: "{{ item.vhost }}" + configure_priv: "{{ item.configure_priv }}" + read_priv: "{{ item.read_priv }}" + write_priv: "{{ item.write_priv }}" + tags: "{{ item.tags }}" + state: present + with_items: "{{ rabbitmq_users }}" + when: (rabbitmq_enable_clustering is defined and not rabbitmq_enable_clustering) or rabbitmq_enable_clustering is not defined + +- name: rabbitmq_users | creating rabbitmq users + rabbitmq_user: + name: "{{ item.name }}" + password: "{{ item.password }}" + vhost: "{{ item.vhost }}" + configure_priv: "{{ item.configure_priv }}" + read_priv: "{{ item.read_priv }}" + write_priv: "{{ item.write_priv }}" + tags: "{{ item.tags }}" + state: present + run_once: yes + with_items: "{{ rabbitmq_users }}" + when: (rabbitmq_enable_clustering is defined and rabbitmq_enable_clustering) diff --git a/Vagrant/roles/ansible-rabbitmq/tasks/redhat.yml b/Vagrant/roles/ansible-rabbitmq/tasks/redhat.yml new file mode 100644 index 0000000..484597d --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/tasks/redhat.yml @@ -0,0 +1,40 @@ +--- +- name: redhat | installing pre-reqs + yum: + name: "{{ item }}" + state: present + with_items: + - epel-release + - wget + +- name: redhat | installing erlang + yum: + name: "erlang" + state: present + +- name: redhat | adding RabbitMQ public GPG key + rpm_key: + key: "{{ rabbitmq_redhat_repo_key }}" + state: present + +- name: redhat | downloading RabbitMQ + get_url: + url: "{{ rabbitmq_redhat_url }}/{{ rabbitmq_redhat_package }}" + dest: "/opt/{{ rabbitmq_redhat_package }}" + +- name: redhat | installing RabbitMQ + yum: + name: "/opt/{{ rabbitmq_redhat_package }}" + state: present + +- name: redhat | starting and enabling RabbitMQ service + service: + name: "rabbitmq-server" + state: started + enabled: yes + +- name: redhat | enabling the RabbitMQ Management Console + rabbitmq_plugin: + names: rabbitmq_management + state: enabled + notify: restart rabbitmq-server diff --git a/Vagrant/roles/ansible-rabbitmq/templates/erlang.cookie.j2 b/Vagrant/roles/ansible-rabbitmq/templates/erlang.cookie.j2 new file mode 100644 index 0000000..edd141f --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/templates/erlang.cookie.j2 @@ -0,0 +1 @@ +{{ rabbitmq_erlang_cookie }} diff --git a/Vagrant/roles/ansible-rabbitmq/vars/main.yml b/Vagrant/roles/ansible-rabbitmq/vars/main.yml new file mode 100644 index 0000000..5977bc8 --- /dev/null +++ b/Vagrant/roles/ansible-rabbitmq/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for ansible-rabbitmq diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..5a1e589 --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,3 @@ +[defaults] +host_key_checking = False +#roles_path = ../ diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..ad22ead --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,28 @@ +--- +# defaults file for ansible-rabbitmq +rabbitmq_config: + - queue_name: 'logstash' + durable: true + exchange_name: logstash + type: 'direct' + routing_key: 'logstash' + tags: 'ha-mode=all,ha-sync-mode=automatic' +rabbitmq_config_ha: false #defines if rabbitmq ha should be configured...define here or in group_vars/group +rabbitmq_debian_repo: 'deb http://www.rabbitmq.com/debian/ testing main' +rabbitmq_debian_repo_key: 'https://www.rabbitmq.com/rabbitmq-release-signing-key.asc' +rabbitmq_enable_clustering: false #defines if setting up a rabbitmq cluster...define here or in group_vars/group +rabbitmq_erlang_cookie: 'LSKNKBELKPSTDBBCHETL' #define erlang cookie for cluster...define here or in group_vars/group +rabbitmq_erlang_cookie_file: '/var/lib/rabbitmq/.erlang.cookie' +rabbitmq_master: [] #defines the inventory host that should be considered master...define here or in group_vars/group +rabbitmq_redhat_repo_key: 'https://www.rabbitmq.com/rabbitmq-signing-key-public.asc' +rabbitmq_redhat_package: 'rabbitmq-server-{{ rabbitmq_redhat_version }}-1.noarch.rpm' +rabbitmq_redhat_url: 'http://www.rabbitmq.com/releases/rabbitmq-server/v{{ rabbitmq_redhat_version }}' +rabbitmq_redhat_version: '3.6.1' +rabbitmq_users: #define admin user to create in order to login to WebUI + - name: 'rabbitmqadmin' + password: 'rabbitmqadmin' + vhost: '/' + configure_priv: '.*' + read_priv: '.*' + write_priv: '.*' + tags: 'administrator' #define comma separated list of tags to assign to user....management,policymaker,monitoring,administrator...required for management plugin. https://www.rabbitmq.com/management.html diff --git a/handlers/main.yml b/handlers/main.yml new file mode 100644 index 0000000..259ce1c --- /dev/null +++ b/handlers/main.yml @@ -0,0 +1,6 @@ +--- +# handlers file for ansible-rabbitmq +- name: restart rabbitmq-server + service: + name: "rabbitmq-server" + state: restarted diff --git a/meta/main.yml b/meta/main.yml new file mode 100644 index 0000000..b25c818 --- /dev/null +++ b/meta/main.yml @@ -0,0 +1,137 @@ +--- +galaxy_info: + author: Larry Smith Jr. + description: Installs rabbitmq https://www.rabbitmq.com/ (Configurable...HA and Clustering ready) + #company: your company (optional) + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + platforms: + - name: EL + versions: + # - all + # - 5 + # - 6 + - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + - name: Fedora + versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + - 22 + - 23 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + - name: Ubuntu + versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + - clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + - system + #- web +dependencies: [] + # List your role dependencies here, one per line. Only + # dependencies available via galaxy should be listed here. + # Be sure to remove the '[]' above if you add dependencies + # to this list. diff --git a/playbook.yml b/playbook.yml new file mode 100644 index 0000000..33cf1ab --- /dev/null +++ b/playbook.yml @@ -0,0 +1,25 @@ +--- +- hosts: all + become: true + vars: + pri_domain_name: 'test.vagrant.local' + roles: + tasks: + - name: updating /etc/hosts + lineinfile: + dest: /etc/hosts + regexp: "^{{ hostvars[item].ansible_ssh_host }} {{ item }} {{ item }}.{{ pri_domain_name }}" + line: "{{ hostvars[item].ansible_ssh_host }} {{ item }} {{ item }}.{{ pri_domain_name }}" + state: present + with_items: groups['all'] + +- hosts: all + become: true + vars: + pri_domain_name: 'test.vagrant.local' + rabbitmq_config_ha: true + rabbitmq_enable_clustering: true + rabbitmq_master: 'node0' + roles: + - role: ansible-rabbitmq + tasks: diff --git a/requirements.yml b/requirements.yml new file mode 100644 index 0000000..a1f51cb --- /dev/null +++ b/requirements.yml @@ -0,0 +1,2 @@ +--- +- src: https://github.com/mrlesmithjr/ansible-rabbitmq.git diff --git a/tasks/debian.yml b/tasks/debian.yml new file mode 100644 index 0000000..a031ead --- /dev/null +++ b/tasks/debian.yml @@ -0,0 +1,35 @@ +--- +- name: debian | adding RabbitMQ public GPG key to the apt repo + apt_key: + url: "{{ rabbitmq_debian_repo_key }}" + state: present + +- name: debian | adding RabbitMQ repo + apt_repository: + repo: "{{ rabbitmq_debian_repo }}" + state: present + register: "rabbitmq_repo_added" + +- name: debian | updating apt cache + apt: + update_cache: yes + when: rabbitmq_repo_added.changed + +- name: debian | installing RabbitMQ server + apt: + name: "{{ item }}" + 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 diff --git a/tasks/fedora.yml b/tasks/fedora.yml new file mode 100644 index 0000000..3d92963 --- /dev/null +++ b/tasks/fedora.yml @@ -0,0 +1,39 @@ +--- +- name: fedora | installing pre-reqs + dnf: + name: "{{ item }}" + state: present + with_items: + - wget + +- name: fedora | installing erlang + dnf: + name: "erlang" + state: present + +- name: fedora | adding RabbitMQ public GPG key + rpm_key: + key: "{{ rabbitmq_redhat_repo_key }}" + state: present + +- name: fedora | downloading RabbitMQ + get_url: + url: "{{ rabbitmq_redhat_url }}/{{ rabbitmq_redhat_package }}" + dest: "/opt/{{ rabbitmq_redhat_package }}" + +- name: fedora | installing RabbitMQ + dnf: + name: "/opt/{{ rabbitmq_redhat_package }}" + state: present + +- name: fedora | starting and enabling RabbitMQ service + service: + name: "rabbitmq-server" + state: started + enabled: yes + +- name: fedora | enabling the RabbitMQ Management Console + rabbitmq_plugin: + names: rabbitmq_management + state: enabled + notify: restart rabbitmq-server diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..bd82f93 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,21 @@ +# tasks file for ansible-rabbitmq +- include: debian.yml + when: ansible_os_family == "Debian" + +- include: redhat.yml + when: ansible_distribution == "CentOS" or ansible_distribution == "Red Hat Enterprise Linux" + +- include: fedora.yml + when: ansible_distribution == "Fedora" + +- name: checking to see if already clustered + stat: path=/etc/rabbitmq/clustered + register: clustered + +- include: rabbitmq_clustering.yml + when: rabbitmq_enable_clustering and (clustered.stat.exists != True) + +- include: rabbitmq_ha_config.yml + when: rabbitmq_config_ha and rabbitmq_enable_clustering + +- include: rabbitmq_users.yml diff --git a/tasks/rabbitmq_clustering.yml b/tasks/rabbitmq_clustering.yml new file mode 100644 index 0000000..9dece46 --- /dev/null +++ b/tasks/rabbitmq_clustering.yml @@ -0,0 +1,70 @@ +--- +- 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: grabbing erlang cookie +# shell: cat /var/lib/rabbitmq/.erlang.cookie +# register: rabbitmq_erlang_cookie +# when: inventory_hostname == "{{ rabbitmq_master }}" + +- name: rabbitmq_clustering | copy erlang cookie + template: + src: erlang.cookie.j2 + dest: "{{ rabbitmq_erlang_cookie_file }}" + owner: rabbitmq + group: rabbitmq + mode: 0400 + backup: yes #backing up in case the need to recover +# when: inventory_hostname != "{{ rabbitmq_master }}" + +- 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 'rabbit@{{ 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 diff --git a/tasks/rabbitmq_ha_config.yml b/tasks/rabbitmq_ha_config.yml new file mode 100644 index 0000000..8811b6d --- /dev/null +++ b/tasks/rabbitmq_ha_config.yml @@ -0,0 +1,44 @@ +--- +- name: rabbitmq_ha_config | checking if rabbitmqadmin is installed + stat: + path: /usr/sbin/rabbitmqadmin + register: rabbitmqadmin_check + +- name: rabbitmq_ha_config | install rabbitMQ admin + shell: wget http://guest:guest@localhost:15672/cli/rabbitmqadmin + when: not rabbitmqadmin_check.stat.exists + +- name: rabbitmq_ha_config | moving the rabbitMQ Admin + shell: mv rabbitmqadmin /usr/sbin + when: not rabbitmqadmin_check.stat.exists + +- name: rabbitmq_ha_config | making executable rabbitMQ Admin + shell: chmod +x /usr/sbin/rabbitmqadmin + notify: restart rabbitmq-server + when: not rabbitmqadmin_check.stat.exists + +- 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 }}" + when: item.exchange_name is defined + +- 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 }}" + when: item.exchange_name is defined diff --git a/tasks/rabbitmq_users.yml b/tasks/rabbitmq_users.yml new file mode 100644 index 0000000..8bce8b2 --- /dev/null +++ b/tasks/rabbitmq_users.yml @@ -0,0 +1,27 @@ +--- +- name: rabbitmq_users | creating rabbitmq users + rabbitmq_user: + name: "{{ item.name }}" + password: "{{ item.password }}" + vhost: "{{ item.vhost }}" + configure_priv: "{{ item.configure_priv }}" + read_priv: "{{ item.read_priv }}" + write_priv: "{{ item.write_priv }}" + tags: "{{ item.tags }}" + state: present + with_items: "{{ rabbitmq_users }}" + when: (rabbitmq_enable_clustering is defined and not rabbitmq_enable_clustering) or rabbitmq_enable_clustering is not defined + +- name: rabbitmq_users | creating rabbitmq users + rabbitmq_user: + name: "{{ item.name }}" + password: "{{ item.password }}" + vhost: "{{ item.vhost }}" + configure_priv: "{{ item.configure_priv }}" + read_priv: "{{ item.read_priv }}" + write_priv: "{{ item.write_priv }}" + tags: "{{ item.tags }}" + state: present + run_once: yes + with_items: "{{ rabbitmq_users }}" + when: (rabbitmq_enable_clustering is defined and rabbitmq_enable_clustering) diff --git a/tasks/redhat.yml b/tasks/redhat.yml new file mode 100644 index 0000000..484597d --- /dev/null +++ b/tasks/redhat.yml @@ -0,0 +1,40 @@ +--- +- name: redhat | installing pre-reqs + yum: + name: "{{ item }}" + state: present + with_items: + - epel-release + - wget + +- name: redhat | installing erlang + yum: + name: "erlang" + state: present + +- name: redhat | adding RabbitMQ public GPG key + rpm_key: + key: "{{ rabbitmq_redhat_repo_key }}" + state: present + +- name: redhat | downloading RabbitMQ + get_url: + url: "{{ rabbitmq_redhat_url }}/{{ rabbitmq_redhat_package }}" + dest: "/opt/{{ rabbitmq_redhat_package }}" + +- name: redhat | installing RabbitMQ + yum: + name: "/opt/{{ rabbitmq_redhat_package }}" + state: present + +- name: redhat | starting and enabling RabbitMQ service + service: + name: "rabbitmq-server" + state: started + enabled: yes + +- name: redhat | enabling the RabbitMQ Management Console + rabbitmq_plugin: + names: rabbitmq_management + state: enabled + notify: restart rabbitmq-server diff --git a/templates/erlang.cookie.j2 b/templates/erlang.cookie.j2 new file mode 100644 index 0000000..edd141f --- /dev/null +++ b/templates/erlang.cookie.j2 @@ -0,0 +1 @@ +{{ rabbitmq_erlang_cookie }} diff --git a/vars/main.yml b/vars/main.yml new file mode 100644 index 0000000..5977bc8 --- /dev/null +++ b/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for ansible-rabbitmq -- cgit v1.2.3