前言
NSQ 是一款高性能、分布式的实时消息平台。它为分布式系统中的异步通信提供了极佳的解决方案。为了实现生产环境中的自动化和快速部署,Ansible 是理想的选择。本文将详细介绍如何通过 Ansible 自动化部署 NSQ 集群服务。
组件工作流示意图
集群IP示例
准备工作
在开始之前,确保你具备以下条件:
一台控制节点(用于运行Ansible)
多台目标节点(用于部署Nsqd,建议至少3台以确保高可用性)
所有目标节点已安装支持的Linux操作系统(如CentOS、Ubuntu)
SSH免密码登录配置(控制节点可无密码登录目标节点)
目标节点网络互通,且已关闭防火墙或已开放相关端口(4161、4151、4171等)
前置环境准备
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
服务器本地域名解析填写
所需填写的服务器:
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