Skip to the content.

使用ansible-playbook一键安装rabbitmq集群

上一篇文章写了ansible的入门帮助-命令查找与使用,通过ansible的帮助文档找到自己所需要的命令使用方法。这次用一个实例演示一下,使用ansible-playbook安装rabbitmq,下面直接放脚本

# egrep -v "^#|^$" /etc/ansible/hosts
[server]
10.211.55.4 host_name=vm01
10.211.55.5 host_name=vm02
10.211.55.6 host_name=vm03
# cat /root/ansible/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 
10.211.55.4 vm01
10.211.55.5 vm02
10.211.55.6 vm03

上面是ansible的hosts文件和本级的hosts文件,下面是rabbitmq的playbook,主要分为三个步骤:

1,设置hostname,关闭iptables

2,安装启动rabbitmq

3,配置rabbitmq的集群,vm01为rabbitmq的磁盘节点,vm02、vm03为内存节点

# vim rabbitmq.j2
#jinja2:  variable_start_string: "[%" , variable_end_string: "%]"
---
  - hosts: server
    remote_user: root
    vars:
      hostname: '[% host_name %]'
    tasks:
    - name: time sync
      command: ntpdate ntp1.aliyun.com
    - name: copy hosts file
      copy: src=/root/ansible/hosts dest=/etc/hosts owner=root group=root mode=0644 force='yes'
    - name: set hostname
      shell: 'hostname '
      register: host_name_change
    - debug: msg=''
    - name: close iptables
      service: name=iptables enabled=yes state=stopped
    - name: copy rabbitmq rpm
      copy: src=/root/rabbitmq-server-3.5.6-1.noarch.rpm dest=/tmp/  owner=root group=root mode=0644
    - name: yum erlang
      yum: name=erlang state=present
    - name: install rabbitmq.rpm
      yum: name=/tmp/rabbitmq-server-3.5.6-1.noarch.rpm state=present
    - name: mkdir /var/lib/rabbitmq
      shell: mkdir -p /var/lib/rabbitmq
    - name: create .erlang.cookie
      shell: echo PKPNUVGNFXZXIQYKLTTG > /var/lib/rabbitmq/.erlang.cookie
    - name: change .erlang.cookie attribute
      shell: chown rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie; chmod 0400 /var/lib/rabbitmq/.erlang.cookie
    - name: copy erlang.cookie
      copy: src=/var/lib/rabbitmq/.erlang.cookie dest=/var/lib/rabbitmq/ owner=rabbitmq group=rabbitmq mode=0400
    - name: kill rabbitmq
      shell: rabbitmqctl stop; ps aux|grep rabbitmq|grep -v grep|awk '{print $2}'|xargs kill -9; rabbitmq-server -detached
    - name: start rabbitmq
      service: name=rabbitmq-server enabled=yes state=restarted
    - name: rabbitmq status
      shell: rabbitmqctl cluster_status
      register: result
    - debug: msg=''
    - name: config rabbit cluster node 1
      shell: rabbitmqctl stop_app ;rabbitmqctl join_cluster --ram rabbit@vm01 ;rabbitmqctl start_app
      when: ansible_hostname == "vm02"
    - name: config rabbit cluster node 2
      shell: rabbitmqctl stop_app ;rabbitmqctl join_cluster --ram rabbit@vm01 ;rabbitmqctl start_app
      when: ansible_hostname == "vm03"
    - name: rabbitmq cluster status
      shell: rabbitmqctl cluster_status
      register: rabbit_cluster_status
    - debug: msg=''

上述ansible-playbook用到了shell、yum、复制文件、新建文件夹、启动关闭服务、输出task的日志、根据主机名执行task等

下面是ansible-playbook的结果显示

# ansible-playbook rabbitmq.j2
 
PLAY ***************************************************************************
 
TASK [setup] *******************************************************************
ok: [10.211.55.5]
ok: [10.211.55.6]
ok: [10.211.55.4]
 
TASK [copy hosts file] *********************************************************
ok: [10.211.55.5]
ok: [10.211.55.6]
ok: [10.211.55.4]
 
TASK [set hostname] ************************************************************
changed: [10.211.55.5]
changed: [10.211.55.6]
changed: [10.211.55.4]
 
TASK [debug] *******************************************************************
ok: [10.211.55.5] => {
    "msg": ""
}
ok: [10.211.55.4] => {
    "msg": ""
}
ok: [10.211.55.6] => {
    "msg": ""
}
 
TASK [close iptables] **********************************************************
changed: [10.211.55.5]
changed: [10.211.55.6]
changed: [10.211.55.4]
 
TASK [copy rabbitmq rpm] *******************************************************
ok: [10.211.55.5]
ok: [10.211.55.6]
ok: [10.211.55.4]
 
TASK [yum erlang] **************************************************************
ok: [10.211.55.5]
ok: [10.211.55.6]
ok: [10.211.55.4]
 
TASK [install rabbitmq.rpm] ****************************************************
ok: [10.211.55.5]
ok: [10.211.55.6]
ok: [10.211.55.4]
 
TASK [mkdir /var/lib/rabbitmq] *************************************************
changed: [10.211.55.5]
 [WARNING]: Consider using file module with state=directory rather than running mkdir
 
changed: [10.211.55.6]
changed: [10.211.55.4]
 
TASK [create .erlang.cookie] ***************************************************
changed: [10.211.55.5]
changed: [10.211.55.6]
changed: [10.211.55.4]
 
TASK [change .erlang.cookie attribute] *****************************************
changed: [10.211.55.5]
 [WARNING]: Consider using file module with owner rather than running chown
 
changed: [10.211.55.6]
changed: [10.211.55.4]
TASK [copy erlang.cookie] ******************************************************
ok: [10.211.55.5]
ok: [10.211.55.6]
ok: [10.211.55.4]
 
TASK [kill rabbitmq] ***********************************************************
changed: [10.211.55.5]
changed: [10.211.55.6]
changed: [10.211.55.4]
 
TASK [start rabbitmq] **********************************************************
changed: [10.211.55.6]
changed: [10.211.55.5]
changed: [10.211.55.4]
 
TASK [rabbitmq status] *********************************************************
changed: [10.211.55.6]
changed: [10.211.55.5]
changed: [10.211.55.4]
 
TASK [debug] *******************************************************************
ok: [10.211.55.5] => {
    "msg": "Cluster status of node rabbit@vm02 ...\n[{nodes,[{disc,[rabbit@vm01]},{ram,[rabbit@vm03,rabbit@vm02]}]},\n {running_nodes,[rabbit@vm01,rabbit@vm03,rabbit@vm02]},\n {cluster_name,<<\"rabbit@vm01\">>},\n {partitions,[]}]"
}
ok: [10.211.55.4] => {
    "msg": "Cluster status of node rabbit@vm01 ...\n[{nodes,[{disc,[rabbit@vm01]},{ram,[rabbit@vm03,rabbit@vm02]}]},\n {running_nodes,[rabbit@vm02,rabbit@vm03,rabbit@vm01]},\n {cluster_name,<<\"rabbit@vm01\">>},\n {partitions,[]}]"
}
ok: [10.211.55.6] => {
 
 
    "msg": "Cluster status of node rabbit@vm03 ...\n[{nodes,[{disc,[rabbit@vm01]},{ram,[rabbit@vm03,rabbit@vm02]}]},\n {running_nodes,[rabbit@vm01,rabbit@vm02,rabbit@vm03]},\n {cluster_name,<<\"rabbit@vm01\">>},\n {partitions,[]}]"
}
 
TASK [config rabbit cluster node 1] ********************************************
skipping: [10.211.55.4]
skipping: [10.211.55.6]
changed: [10.211.55.5]
 
TASK [config rabbit cluster node 2] ********************************************
skipping: [10.211.55.5]
skipping: [10.211.55.4]
changed: [10.211.55.6]
 
TASK [rabbitmq cluster status] *************************************************
changed: [10.211.55.5]
changed: [10.211.55.6]
changed: [10.211.55.4]
 
TASK [debug] *******************************************************************
ok: [10.211.55.5] => {
    "msg": "Cluster status of node rabbit@vm02 ...\n[{nodes,[{disc,[rabbit@vm01]},{ram,[rabbit@vm03,rabbit@vm02]}]},\n {running_nodes,[rabbit@vm03,rabbit@vm01,rabbit@vm02]},\n {cluster_name,<<\"rabbit@vm01\">>},\n {partitions,[]}]"
}
ok: [10.211.55.4] => {
    "msg": "Cluster status of node rabbit@vm01 ...\n[{nodes,[{disc,[rabbit@vm01]},{ram,[rabbit@vm03,rabbit@vm02]}]},\n {running_nodes,[rabbit@vm03,rabbit@vm02,rabbit@vm01]},\n {cluster_name,<<\"rabbit@vm01\">>},\n {partitions,[]}]"
}
ok: [10.211.55.6] => {
    "msg": "Cluster status of node rabbit@vm03 ...\n[{nodes,[{disc,[rabbit@vm01]},{ram,[rabbit@vm03,rabbit@vm02]}]},\n {running_nodes,[rabbit@vm02,rabbit@vm01,rabbit@vm03]},\n {cluster_name,<<\"rabbit@vm01\">>},\n {partitions,[]}]"
}
 
PLAY RECAP *********************************************************************
10.211.55.4                : ok=19   changed=10    unreachable=0    failed=0
10.211.55.5                : ok=20   changed=11    unreachable=0    failed=0
10.211.55.6                : ok=20   changed=11    unreachable=0    failed=0

因为一直在测试运行,所以changed数量不等于修改task的数量

Consider using file module with state=directory rather than running mkdir的提示是说:最好用 state=directory 代替mkdir

rabbitmq界面

我们要查看rabbitmq的界面,需要启用图形化界面插件,并且设置登录的用户名、密码和权限

# rabbitmq-plugins enable rabbitmq_management
# rabbitmq-plugins list
 Configured: E = explicitly enabled; e = implicitly enabled
 | Status:   * = running on rabbit@vm01
 |/
[e*] amqp_client                       3.5.6
[  ] cowboy                            0.5.0-rmq3.5.6-git4b93c2d
[  ] eldap                             3.5.6-gite309de4
[e*] mochiweb                          2.7.0-rmq3.5.6-git680dba8
[  ] rabbitmq_amqp1_0                  3.5.6
[  ] rabbitmq_auth_backend_ldap        3.5.6
[  ] rabbitmq_auth_mechanism_ssl       3.5.6
[  ] rabbitmq_consistent_hash_exchange 3.5.6
[  ] rabbitmq_federation               3.5.6
[  ] rabbitmq_federation_management    3.5.6
[E*] rabbitmq_management               3.5.6
[e*] rabbitmq_management_agent         3.5.6
[  ] rabbitmq_management_visualiser    3.5.6
[  ] rabbitmq_mqtt                     3.5.6
[  ] rabbitmq_shovel                   3.5.6
[  ] rabbitmq_shovel_management        3.5.6
[  ] rabbitmq_stomp                    3.5.6
[  ] rabbitmq_test                     3.5.6
[  ] rabbitmq_tracing                  3.5.6
[e*] rabbitmq_web_dispatch             3.5.6
[  ] rabbitmq_web_stomp                3.5.6
[  ] rabbitmq_web_stomp_examples       3.5.6
[  ] sockjs                            0.3.4-rmq3.5.6-git3132eb9
[e*] webmachine                        1.10.3-rmq3.5.6-gite9359c7
 
 
# rabbitmqctl add_user admin admin
# rabbitmqctl set_user_tags admin administrator

保证15672端口在使用

# lsof -i:15672
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
beam.smp 22246 rabbitmq   23u  IPv4 281650      0t0  TCP *:15672 (LISTEN)
beam.smp 22246 rabbitmq   24r  IPv4 285017      0t0  TCP vm01:15672->10.211.55.2:57264 (ESTABLISHED)

在浏览器打开http://IP:15672/

rabbitmq的文档http://www.rabbitmq.com/documentation.html

http://mysql.taobao.org/index.php?title=Rabbitmq

使用ansible-playbook一键安装rabbitmq集群 - 第1张

在rabbitmq上面截图的两个RAM节点有遇到: Node statistics not available,在两个RAM节点执行下面即可

[root@vm02 ~]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
  mochiweb
  webmachine
  rabbitmq_web_dispatch
  amqp_client
  rabbitmq_management_agent
  rabbitmq_management
 
Applying plugin configuration to rabbit@vm02... started 6 plugins.

rabbitmq的HA

rabbitmq的HA高可用需要设置policy

rabbitmq集群设置policy

virtual host选自建的,下面name名字随意起的,pattern 为 ^ 表示匹配所有,下面ha-mode选all,这样node1节点故障,queue会在其他节点上继续运行,不会出现 queue down的情况

ha-sync-mode 选automatic,默认新加入的镜像不会同步消息,即默认的选项是manual,如果不加此选项,rabbitmq node节点重启后,会提示unsynchronised mirrors

设置rabbitmq的内存水位线high watermark

vm_memory_high_watermark 默认值为0.4,就是说2G的内存,可以使用的是2G * 0.4 = 800M,超过800M,就会限制生产者,rabbitmq 内存告警阈值

rabbitmqctl set_vm_memory_high_watermark 0.8

2016年04月29日 于 linux工匠 发表