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

集群IP示例
准备工作
在开始之前,确保你具备以下条件:
一台控制节点(用于运行Ansible)
多台目标节点(用于部署Nsqd,建议至少3台以确保高可用性)
所有目标节点已安装支持的Linux操作系统(如CentOS、Ubuntu)
SSH免密码登录配置(控制节点可无密码登录目标节点)
目标节点网络互通,且已关闭防火墙或已开放相关端口(4161、4151、4171等)
前置环境准备
Jumpserver 控制节点上安装Ansible
部署所在服务器:
Jumpserver安装命令:
yum -y install ansible
服务器主机名设置
涉及修改服务器:
masterslavearbiterJumpserver执行命令:
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.1ssh -p 22 root@192.168.1.2ssh -p 22 root@192.168.1.3
服务器安装 Docker 服务
部署所在服务器:
masterslavearbiter
服务器本地域名解析填写
所需填写的服务器:
masterslavearbiter命令:
vi /etc/hosts内容如下:
192.168.1.1 master192.168.1.2 slave192.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
    
            
    
                    
    
                    
参与讨论