Ansible部署 之 zookeeper集群

news2024/11/16 22:32:50

简介

Ansible是近年来越来越火的一款轻量级运维自动化工具,主要功能为帮助运维实现运维工作的自动化、降低手动操作的失误、提升运维工作效率。常用于自动化部署软件、自动化配置、自动化管理,支持playbook编排。配置简单,无需安装客户端,被管理端主机通过ssh协议通信。Ansible本身不具有自动化部署功能,全交由其丰富的模块实现。

部署目标

  • 快速部署一个三节点的zookeeper集群
  • 部署过程中可以自定义软件安装目录及服务监听端口号

环境配置

hostname

IP

CPU

RAM

DISK

Network

master

192.168.199.201

2C

4G

40G

NAT

slave1

192.168.199.202

slave2

192.168.199.203

安装基础环境

# All node install
yum install -y wget unzip screen ntpdate net-tools sshpass vim tree telnet
# Only master node install
yum install -y ntp ansible

配置ssh互信

tee >> /etc/hosts <<EOF


192.168.199.201 master
192.168.199.202 slave1
192.168.199.203 slave2
EOF


ssh-keygen -q -t rsa -f /root/.ssh/id_rsa -N ""; \cp -f /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
tee /root/.ssh/config <<-'EOF'
host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
EOF
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2

部署文件

  • jdk:jdk-8u341-linux-x64.tar.gz
  • zookeeper:apache-zookeeper-3.8.2-bin.tar.gz

创建目录

[root@master ~]# mkdir -p /opt/playbook/{group_vars,roles/{jdk/{files,tasks,templates},zk/{files,tasks,templates}}}
[root@master ~]# cd /opt/playbook/

部署清单目录结构

[root@master playbook]# tree
.
├── group_vars
│   └── all.yml
├── hosts
├── roles
│   ├── jdk
│   │   ├── files
│   │   │   └── jdk-8u341-linux-x64.tar.gz
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       └── jdk.sh.j2
│   └── zk
│       ├── files
│       │   └── apache-zookeeper-3.8.2-bin.tar.gz
│       ├── tasks
│       │   └── main.yml
│       └── templates
│           ├── setid.sh.j2
│           ├── zoo.cfg.j2
│           └── zookeeper.service.j2
└── zk.yml


10 directories, 11 files

清单内容

[root@master playbook]# cat hosts
[jdk]
192.168.199.201
192.168.199.202
192.168.199.203


[zk]
192.168.199.201
192.168.199.202
192.168.199.203

交互式配置文件

[root@master playbook]# cat zk.yml
---
- hosts: zk
  gather_facts: false
  vars_prompt:
  - name: install_path
    prompt: 请输入软件安装目录
    default: "/opt/soft"
    private: no
  - name: leader_port
    prompt: 请输入zk服务的Leader-Port
    default: 12888
    private: no
  - name: vote_port
    prompt: 请输入zk服务的Vote-Port
    default: 13888
    private: no
  - name: client_port
    prompt: 请输入zk服务的Client-Port
    default: 12181
    private: no
  roles:
    - jdk
    - zk

声明变量

[root@master playbook]# cat group_vars/all.yml
#Soft Package
jdk_pkg: jdk-8u341-linux-x64.tar.gz
jdk_version: jdk1.8.0_341
zk_pkg: apache-zookeeper-3.8.2-bin.tar.gz
zk_version: apache-zookeeper-3.8.2-bin
#Soft Name
jdk_soft_name: jdk
zk_soft_name: zookeeper
#Install Path
install_path: /opt/soft
#Zk Port
leader_port: 12888
vote_port: 13888
client_port: 12181
# Zk Host
zk_hosts: zk

JDK部署清单

[root@master playbook]# cat roles/jdk/tasks/main.yml
---
- name: "0、创建{{ install_path }}目录"
  file:
    path: "{{ install_path }}"
    state: directory


- name: "1、解压{{ jdk_soft_name }}二进制包"
  unarchive:
    src: "{{ jdk_pkg }}"
    dest: "{{ install_path }}"


- name: "2、建立{{ jdk_soft_name }}软链接"
  file:
    src: "{{ install_path }}/{{ jdk_version }}"
    dest: "{{ install_path }}/{{ jdk_soft_name }}"
    state: link


- name: "3、分发环境变量"
  template:
    src: jdk.sh.j2
    dest: /etc/profile.d/jdk.sh


- name: "4、加载{{ jdk_soft_name }}环境"
  shell: bash -c 'source /etc/profile.d/jdk.sh'

JDK环境变量

[root@master playbook]# cat roles/jdk/templates/jdk.sh.j2
#!/usr/bin/env bash
# JAVA
JAVA_HOME={{ install_path }}/{{ jdk_soft_name }}
JRE_HOME=$JAVA_HOME/jre
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export PATH JAVA_HOME CLASSPATH JRE_HOME
[root@master playbook]# cat roles/zk/tasks/main.yml
- name: "1、创建安装目录"
  file:
    path: "{{ install_path }}"
    state: directory


- name:  "2、解压{{ zk_soft_name }}源码包"
  unarchive:
    src:  "{{ zk_pkg }}"
    dest: "{{ install_path }}"


- name: "3、建立{{ zk_soft_name }}软链接"
  file:
    src: "{{ install_path }}/{{ zk_version }}"
    dest: "{{ install_path }}/{{ zk_soft_name }}"
    state: link


- name: "4、创建{{ zk_soft_name }}数据目录"
  file:
    path: "{{ item }}"
    state: directory
  with_items:
    - "{{ install_path }}/{{ zk_soft_name }}/data"
    - "{{ install_path }}/{{ zk_soft_name }}/logs"


- name: "5、修改{{ zk_soft_name }}配置文件"
  template: '{{ item }}'
  with_items:
    - "{'src': 'setid.sh.j2', 'dest': '{{ install_path }}/{{ zk_soft_name }}/bin/setid.sh'}"
    - "{'src': 'zoo.cfg.j2', 'dest': '{{ install_path }}/{{ zk_soft_name }}/conf/zoo.cfg'}"
    - "{'src': 'zookeeper.service.j2', 'dest': '/usr/lib/systemd/system/zookeeper.service'}"


- name: "6、写入myid"
  shell: /bin/bash setid.sh
  args:
    chdir: "{{ install_path }}/{{ zk_soft_name }}/bin"


- name: "7、启动{{ zk_soft_name }}集群"
  systemd:
    name: zookeeper
    state: started
    daemon_reload: yes
    enabled: yes


- name: "8、获取{{ zk_soft_name }}集群状态"
  shell: ./zkServer.sh status
  args:
    chdir: "{{ install_path }}/{{ zk_soft_name }}/bin"
  register: info


- name: "9、打印{{ zk_soft_name }}集群状态"
  debug:
    msg: "{{ info.stderr_lines }}, {{ info.stdout_lines }}"

myid模板

[root@master playbook]# cat roles/zk/templates/setid.sh.j2
#!/usr/bin/env bash


{% for ip in groups[zk_hosts] %}
{% if ip == inventory_hostname %}
echo {{ loop.index - 1 }} > {{ install_path }}/{{ zk_soft_name }}/data/myid
{% endif %}
{% endfor %}

zookeeper配置文件

[root@master playbook]# cat roles/zk/templates/zoo.cfg.j2
tickTime=2000
initLimit=100
syncLimit=10
clientPort={{ client_port }}
maxClientCnxns=10000
dataDir={{ install_path }}/{{ zk_soft_name }}/data
dataLogDir={{ install_path }}/{{ zk_soft_name }}/logs


{% for ip in groups[zk_hosts] %}
server.{{ loop.index - 1 }}={{ ip }}:{{ leader_port }}:{{vote_port }}
{% endfor %}

zookeeper服务文件

[root@master playbook]# cat roles/zk/templates/zookeeper.service.j2
[Unit]
# 服务描述
Description=zookeeper
# 在网络服务启动后运行
After=network.target
[Service]
Type=forking
# jdk环境变量
Environment=JAVA_HOME={{ install_path }}/jdk ZOO_LOG_DIR={{ install_path }}/zookeeper/logs
# 启动命令
ExecStart={{ install_path }}/zookeeper/bin/zkServer.sh start
# 停止命令
ExecStop={{ install_path }}/zookeeper/bin/zkServer.sh stop
# 重载命令
ExecReload={{ install_path }}/zookeeper/bin/zkServer.sh restart
[Install]
WantedBy=multi-user.target

延申阅读

以上清单中涉及的ansible模块比较多,同时还涉及jinja2相关的知识及服务配置文件的渲染。需要对此有一定的了解。下面我提供了一些相关知识的链接,供大家学习参考:

ansible学习文档: https://ansible-tran.readthedocs.io/en/latest/

yaml语法: https://www.runoob.com/w3cnote/yaml-intro.html

JinJa2语法: https://docs.jinkan.org/docs/jinja2/

部署

部署之前,需要配置Ansible主机到被管理节点的ssh免密登录;如未配置免密登录,需要额外在资产清单中配置ssh登录密码。

[root@master playbook]# ansible-playbook -i hosts zk.yml

部署完成后,从上图的显示结果中可以看到,192.168.199.203为leader节点,其余两个节点为follower节点。

来自: Ansible部署 之 zookeeper集群icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=Mzk0NTQ3OTk3MQ==&mid=2247487456&idx=1&sn=1fa0cdb236b82678ca83afaceb4fdc9e&chksm=c31587acf4620eba0594962ad1c4f2f4e3365649fbfdde8c2352a230477db7a6753c443fe508&token=113329682&lang=zh_CN#rd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1792625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小白专用 已验证24.5.30】ThinkPHP6 视图

ThinkPHP6 视图 模板引擎支持普通标签和XML标签方式两种标签定义&#xff0c;分别用于不同的目的 标签类型描述普通标签主要用于输出变量、函数过滤和做一些基本的运算操作XML标签也称为标签库标签&#xff0c;主要完成一些逻辑判断、控制和循环输出&#xff0c;并且可扩展 c…

keil下载及安装(社区版本)

知不足而奋进 望远山而前行 目录 文章目录 前言 Keil有官方版本和社区版本&#xff0c;此文章为社区版本安装&#xff0c;仅供参考。 1.keil MDK 2.keil社区版介绍 3.keil下载 (1)打开进入登录界面 (2)点击下载,跳转到信息页面 (3)填写个人信息,点击提交 (4)点击下载…

基于web的垃圾分类回收系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;公告管理&#xff0c;运输管理&#xff0c;基础数据管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;运输管理&#xff0c;公告…

Web安全:Web体系架构存在的安全问题和解决方案

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

Python算法于强化学习库之rlax使用详解

概要 在强化学习领域,开发和测试各种算法需要使用高效的工具和库。rlax 是 Google 开发的一个专注于强化学习的库,旨在提供一组用于构建和测试强化学习算法的基础构件。rlax 基于 JAX,利用 JAX 的自动微分和加速计算功能,使得强化学习算法的实现更加高效和简洁。本文将详细…

植物大战僵尸杂交版2.0.88最新版安装包

游戏简介 游戏中独特的杂交植物更是为游戏增添了不少亮点。这些杂交植物不仅外观独特&#xff0c;而且拥有更强大的能力&#xff0c;能够帮助玩家更好地应对游戏中的挑战。玩家可以通过一定的条件和方式&#xff0c;解锁并培养这些杂交植物&#xff0c;从而不断提升自己的战斗…

SpringBoot:SpringBoot中使用Redisson实现分布式锁

一、前言 Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。 刚好项目中需要使用到分布式锁&#xff0c;记录一下Redisson是如何使用分布式…

SpringBoot+Vue幼儿园管理系统(前后端分离)

技术栈 JavaSpringBootMavenMyBatisMySQLVueElement-UI 系统角色 教师用户管理员 功能截图

C++ STL - 容器

C STL&#xff08;标准模板库&#xff09;中的容器是一组通用的、可复用的数据结构&#xff0c;用于存储和管理不同类型的数据。 目录 零. 简介&#xff1a; 一 . vector&#xff08;动态数组&#xff09; 二. list&#xff08;双向链表&#xff09; 三. deque&#xff08…

k8s Pods漂移时间配置

默认为300秒 apiVersion: apps/v1 kind: Deployment metadata:name: my-test spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80tolerations:- key: &…

LabVIEW传感器虚拟综合实验系统

LabVIEW传感器虚拟综合实验系统 开发了一个基于LabVIEW的传感器虚拟综合实验系统&#xff0c;该系统集成了NIELVIS和CSY系列传感器实验平台&#xff0c;通过图形化编程语言进行数据处理和实验管理。系统允许用户进行多种传感器参数的测量和实验报告的自动生成&#xff0c;支持…

使用DLL还是通讯协议进行LabVIEW设备集成

在使用LabVIEW进行设备集成时&#xff0c;可以选择通过设备提供的DLL或直接使用通讯协议。选择方法取决于开发效率、性能、灵活性和维护成本等因素。本文将从这几个方面详细分析两种方法的优劣&#xff0c;帮助做出最佳决策。 分析角度 1. 开发效率&#xff1a; DLL&a…

全能大模型AIGC产品的使用体验、选择倾向与未来展望

随着人工智能技术的迅猛发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;领域正迎来前所未有的繁荣。其中&#xff0c;全能大模型产品以其强大的生成能力和广泛的应用场景&#xff0c;吸引了众多用户的关注。腾讯元宝APP的上线更是为这一领域注入了新的活力。本文…

Echarts柱状图数据太多,自定义长度之后,自适应浏览器缩放

不知道是不是最优解&#xff0c;但是当前解决了我遇到的问题&#xff0c;如有更好的方法&#xff0c;希望看到这篇文章的同学可以不吝指导一番&#xff0c;非常感谢 1、问题描述&#xff1a; 因Ecahrts柱状图数据有时多有时少&#xff0c;所以在数据达到一定程度之后&#xff…

spring mvc 中怎样定位到请求调用的controller

前言 在java web开发过程中&#xff0c;正常情况下controller都是我们自己写的&#xff0c;我们可以很方便的定位到controller的位置。但是有些时候我们引入的其他依赖中可能也有controller&#xff0c;为了找到并方便的调试jar包中的controller&#xff0c;我们一般会进行全局…

【CMake系列】10-cmake测试集成googletest与第三方库自动化构建

cmake测试&#xff0c;使用ctest 可能不能满足我们的需求&#xff0c;需要我们使用更为强大的第三方测试框架&#xff0c;如googletest&#xff0c;完成项目中的测试工作 本篇文章将第三方测试框架 googletest&#xff0c;引入&#xff0c;同时也可以作为 关于 第三方包 自动化…

Nginx编译安装,信号,升级nginx

编译安装nginx&#xff1a;前面博客有写编译安装过程 systemctl stop firewalld setenforce 0 mkdir /data cd /data wget http://nginx.org/download/nginx-1.18.0.tar.gz tar xf nginx-1.18.0.tar.gz cd nginx-1.18.0/ yum -y install make gcc pcre-devel openssl-devel …

0基础学习区块链技术——51%攻击和双花

在《0基础学习区块链技术——分叉》一文中&#xff0c;讲解了区块链分叉相关的原因。这种分叉是CAP原则的结果&#xff0c;大部分分布式系统都会优先保证Availability&#xff08;可用性&#xff09;和Partition Tolerance&#xff08;分区容错性&#xff09;。而对于Consisten…

【spring】第二篇 bean实例化

对象已经能交给Spring的IOC容器来创建了&#xff0c;但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程&#xff0c;在这块内容中主要解决两部分内容&#xff0c;分别是 bean是如何创建的 实例化bean的三种方式&#xff0c;构造方法,静态工厂和实例工厂 在讲解这…

[flutter]一键将YAPI生成的api.json文件转为需要的Dart Model类的脚本

目的&#xff1a; 根据YAPI接口平台生成的api.json接口文件&#xff0c;将接口数据转化为model类&#xff0c;生成对应的接口值类型文件。 发现&#xff1a; api.json文件导出&#xff1a; YAPi是一个接口管理平台&#xff0c;登录账号打开项目后&#xff0c;在点击数据管理…