前言

NSQ 是一款高性能、分布式的实时消息平台。它为分布式系统中的异步通信提供了极佳的解决方案。为了实现生产环境中的自动化和快速部署,Ansible 是理想的选择。本文将详细介绍如何通过 Ansible 自动化部署 NSQ 集群服务。

组件工作流示意图

集群IP示例

服务器别名

服务器

主机名

服务器担任角色

服务器用户

配置

服务器端口

二进制链接

master

192.168.1.1

master-nsq

nsqd lookupd

root

2G

22

Nsqd

slave

192.168.1.2

slave-nsq

nsqd lookupd

root

2G

22

Nsqd

arbiter

192.168.1.3

arbiter-nsq

nsqadmin

root

2G

22

Nsqd

Jumpserver

192.168.1.100

Jumpserver

跳板机

root

2G

22

准备工作

  • 在开始之前,确保你具备以下条件:

    • 一台控制节点(用于运行Ansible

    • 多台目标节点(用于部署Nsqd,建议至少3台以确保高可用性)

    • 所有目标节点已安装支持的Linux操作系统(如CentOS、Ubuntu)

    • SSH免密码登录配置(控制节点可无密码登录目标节点)

    • 目标节点网络互通,且已关闭防火墙或已开放相关端口(416141514171等)

前置环境准备

  • Jumpserver 控制节点上安装Ansible

    • 部署所在服务器:Jumpserver

      • 安装命令:yum -y install ansible

  • 服务器主机名设置

    • 涉及修改服务器:master slave arbiter Jumpserver

      • 执行命令: hostnamectl set-hostname <主机名称>

        • 注:执行时将 <> 去掉!

  • 服务器免密配置

    • Jumpserver 执行的命令:

      • 返回root目录:cd /root/

      • 创建密钥信息:ssh-keygen # 一路回车即可

      • 获取公钥信息:cat /root/.ssh/id_rsa.pub

    • master slave arbiter 执行的命令:

      • 创建公钥存放目录:mkdir /root/.ssh/

      • 创建公钥存放文件:touch /root/.ssh/authorized_keys

      • 赋予公钥文件权限:chmod 600 /root/.ssh/authorized_keys

      • 将从 Jumpserver 上获取公钥信息写入公钥文件:vi /root/.ssh/authorized_keys

      • 保存退出:ESC--->:wq

    • 验证是否免密成功:

      • Jumpserver 上连接 master slave arbiter

        • ssh -p 22 root@192.168.1.1

        • ssh -p 22 root@192.168.1.2

        • ssh -p 22 root@192.168.1.3

  • 服务器安装 Docker 服务

  • 服务器本地域名解析填写

    • 所需填写的服务器:master slave arbiter

      • 命令:vi /etc/hosts

        • 内容如下:

          • 192.168.1.1 master

          • 192.168.1.2 slave

          • 192.168.1.3 arbiter

构建Ansible-Playbook目录

  • 文件所在服务器:Jumpserver

Nsq                                     # 主项目目录
  └─deploy_center.yaml                    # 定义角色的编排任务
  └─hosts                                 # Ansible 主机清单/配置
  └─roles                                 # Ansible 角色目录
      └─nsq                               # Nsq 角色
         └─tasks                          # 任务目录
            └─main.yml                    # 定义角色的主要任务yml

编写Ansible 主机清单/配置(hosts)

Nsq                                     # 主项目目录
  └─deploy_center.yaml                    # 定义角色的编排任务
  └─hosts                                 # Ansible 主机清单/配置     <------当前位置
  └─roles                                 # Ansible 角色目录
      └─nsq                               # Nsq 角色
         └─tasks                          # 任务目录
            └─main.yml                    # 定义角色的主要任务

文件内容(hosts)

[all:vars]     # 全局配置 
ansible_ssh_user=root    # 指定 Ansible 连接远程主机时使用的SSH 用户名
ansible_ssh_port=22      # 指定连接远程主机时的SSH 端口号
ansible_become=yes       # 表示在执行任务时,需要提升权限
ansible_become_method=sudo   # 指定提升权限时用的方法
ansible_become_user=root     # 表示提升权限后,以哪个用户身份执行命令
extension=false  # 这不是 Ansible 的内置变量,可能是自定义变量,具体含义要看你的 playbook 或 role 如何使用它
ansible_python_interpreter=/usr/bin/python  # 指定远程主机上 Ansible 应该使用的 Python 解释器路径

[master]
192.168.1.1
[slave]
192.168.1.2
[arbiter]
192.168.1.3

定义角色主要任务

Nsq                                     # 主项目目录
  └─deploy_center.yaml                    # 定义角色的编排任务
  └─hosts                                 # Ansible 主机清单/配置     
  └─roles                                 # Ansible 角色目录
      └─nsq                               # Nsq 角色
         └─tasks                          # 任务目录
            └─main.yml                    # 定义角色的主要任务         <------当前位置

文件内容(main.yml)

- name: confirm System type  #判断服务器类型,获取对应类型的文件
  command: "arch"
  register:  type  #执行结果存放

- name: confirm System hostname  #判断主机名
  command: hostname
  register:  hostnameresult  #执行结果存放

# 导入Nsq镜像
- name: Docker Load Nsq Images   
  become: true
  shell:  docker load < /root/nsq.tar

# 重复执行删除容器
- name: Repeatedly deleting containers
  become: true
  ignore_errors: yes
  shell:  | 
    sudo docker rm -f nsqd && 
    sudo docker rm -f nsqadmin &&
    sudo docker rm -f lookupd &&
    rm -rf /docker/docker/nsq &&
    mkdir -p /docker/docker/nsq/{data,conf,log}

# 启动Nsq-lookupd容器
- name: Start Nsq-lookupd container
  become: true
  shell:  docker run -d --name lookupd -p 4160:4160 --privileged=true  -p 4161:4161 --restart=always -v /etc/hosts:/etc/hosts nsqio/nsq:v1.2.1 /nsqlookupd -http-address 0.0.0.0:4161 -tcp-address 0.0.0.0:4160 -broadcast-address 192.168.1.1
  when: hostnameresult.stdout | regex_search('master')

# 启动Nsq-lookupd容器
- name: Start Nsq-lookupd container
  become: true
  shell:  docker run -d --name lookupd -p 4160:4160 --privileged=true  -p 4161:4161 --restart=always -v /etc/hosts:/etc/hosts  nsqio/nsq:v1.2.1 /nsqlookupd -http-address 0.0.0.0:4161 -tcp-address 0.0.0.0:4160 -broadcast-address 192.168.1.2
  when: hostnameresult.stdout | regex_search('slave')

# 启动Nsqd容器
- name: Start Nsqd container
  become: true
  shell:  docker run -d --name nsqd -p 4150:4150 --privileged=true -p 4151:4151 --restart=always -v /etc/hosts:/etc/hosts -v /docker/docker/nsq/data:/usr/local/nsq/bin/data  nsqio/nsq:v1.2.1 /nsqd -tcp-address 0.0.0.0:4150 -data-path /usr/local/nsq/bin/data --http-address 0.0.0.0:4151 -lookupd-tcp-address 192.168.1.1:4160 -lookupd-tcp-address 192.168.1.2:4160 -broadcast-address 192.168.1.1
  when: hostnameresult.stdout | regex_search('master')

# 启动Nsqd容器
- name: Start Nsqd container
  become: true
  shell:  docker run -d --name nsqd -p 4150:4150 --privileged=true -p 4151:4151 --restart=always -v /etc/hosts:/etc/hosts -v /docker/docker/nsq/data:/usr/local/nsq/bin/data  nsqio/nsq:v1.2.1 /nsqd -tcp-address 0.0.0.0:4150 -data-path /usr/local/nsq/bin/data --http-address 0.0.0.0:4151 -lookupd-tcp-address 192.168.1.1:4160 -lookupd-tcp-address 192.168.1.2:4160 -broadcast-address 192.168.1.2
  when: hostnameresult.stdout | regex_search('slave')

# 启动Nsqadmin容器
- name: Start Nseq container
  become: true
  shell:  docker run -d --name nsqadmin --privileged=true -p 4171:4171 --restart=always -v /etc/hosts:/etc/hosts nsqio/nsq:v1.2.1 /nsqadmin --lookupd-http-address 192.168.1.1:4160 -lookupd-http-address 192.168.1.2:4160
  when: hostnameresult.stdout | regex_search('arbiter')

定义角色编排顺序

Nsq                                     # 主项目目录
  └─deploy_center.yaml                    # 定义角色的编排任务         <------当前位置
  └─hosts                                 # Ansible 主机清单/配置     
  └─roles                                 # Ansible 角色目录
      └─nsq                               # Nsq 角色
         └─tasks                          # 任务目录
            └─main.yml                    # 定义角色的主要任务

文件内容(deploy_center.yaml)

# 安装Nsq集群中间件
- hosts: 
    - jyw-center-master
    - jyw-center-slave
    - jyw-center-arbiter
  gather_facts: no
  remote_user: secure
  roles:
    - nsq

安装 Nsq 组件

Nsq                                     # 主项目目录                <------当前位置
  └─deploy_center.yaml                    # 定义角色的编排任务         
  └─hosts                                 # Ansible 主机清单/配置     
  └─roles                                 # Ansible 角色目录
      └─nsq                               # Nsq 角色
         └─tasks                          # 任务目录
            └─main.yml                    # 定义角色的主要任务

执行命令

# 使用ansbile-playbook调用编排文件

ansible-playbook -i ./hosts -v deploy_center.yaml

等待安装即可!