Ansible部署 之 zookeeper集群

简介

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 <<EOF192.168.199.201 master
192.168.199.202 slave1
192.168.199.203 slave2
EOFssh-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 noUserKnownHostsFile /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.yml10 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: zkgather_facts: falsevars_prompt:- name: install_pathprompt: 请输入软件安装目录default: "/opt/soft"private: no- name: leader_portprompt: 请输入zk服务的Leader-Portdefault: 12888private: no- name: vote_portprompt: 请输入zk服务的Vote-Portdefault: 13888private: no- name: client_portprompt: 请输入zk服务的Client-Portdefault: 12181private: noroles:- 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.j2dest: /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: directorywith_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.shargs:chdir: "{{ install_path }}/{{ zk_soft_name }}/bin"- name: "7、启动{{ zk_soft_name }}集群"systemd:name: zookeeperstate: starteddaemon_reload: yesenabled: yes- name: "8、获取{{ zk_soft_name }}集群状态"shell: ./zkServer.sh statusargs: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.mzph.cn/news/848499.shtml

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

相关文章

Github 2024-06-06 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:2724 次关注人…

详细分析Mysql中的SQL_MODE基本知识(附Demo讲解)

目录 前言1. 基本知识2. Demo讲解2.1 ONLY_FULL_GROUP_BY2.2 STRICT_TRANS_TABLES2.3 NO_ZERO_IN_DATE2.4 NO_ENGINE_SUBSTITUTION2.5 ANSI_QUOTES 前言 了解Mysql内部的机制有助于辅助开发以及形成整体的架构思维 对于基本的命令行以及优化推荐阅读&#xff1a; 数据库中增…

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

文章目录 错误描述错误原因解决步骤 跟着我下面的步骤走&#xff0c;解决你的问题&#xff0c;如果解决不了 私信我来给你解决 错误描述 执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;报错ERROR 1524 (HY000): Plugin mysql_native_password is not …

AI炒股:获取个股的历史成交价格并画出K线图

任务&#xff1a;获取贵州茅台的近几个月的价格数据&#xff0c;绘制k线图&#xff1b; 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 用AKShare库获取股票贵州茅台&#xf…

PID算法在电机速度控制上的应用

目录 概述 1 系统硬件框架 1.1 框架介绍 1.2 硬件实物图 2 STM32Cub生成工程 2.1 软件版本信息 2.2 配置参数 ​编辑2.3 生成项目 3 PID算法实现 3.1 概念 3.2 代码实现 4 其他功能实现 4.1 设置电机速度 4.2 PID算法控制电机 4.3 功能函数的调用 5 测试 5.1 …

3072. 将元素分配到两个数组中 II Rust 线段树 + 离散化

题目 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操…

winscp无法上传,删除,修改文件并提示权限不够的分析

使用winscp删除文件,报了个错如下 根据这个错就去百度,网上大部分都是通过下面这种方法解决: 在winscp端进行设置 输入主机名(即IP地址)、用户名和密码,然后点击高级 在箭头所指位置输入sudo + sftp应用程序的路径 先查询 sudo find / -name sftp-server -print点击Sh…

如何让 AI 自动阅读文档样例,编写符合你需求的代码?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 痛点 我本科读的计算机专业。当时编程&#xff0c;讲究的就是个扎实。例如哈夫曼编码用来压缩解压文件&#xff0c;那真的是自己一行行代码写过来的。更…

【Pytorch】计算机视觉项目——卷积神经网络TinyVGG模型图像分类(如何使用自定义数据集)

目录 一、前言二、工作流程回顾三、详细步骤流程1. 环境配置2. 数据准备数据集下载数据存储结构&路径查看图片 3. 数据转换4. 自定义数据集&#xff08;Custom Dataset &#xff09;4.1 方法一&#xff1a;使用ImageFolder加载数据集信息查看张量转图片创建DataLoader 4.2 …

Java Web学习笔记12——JavaScript字符串

String&#xff1a; String字符串对象创建方法有两种&#xff1a; 方式一&#xff1a; var str new String("Hello String"); 方式二&#xff1a; var str "Hello String"; 常见的属性和方法&#xff1a; <!DOCTYPE html> <html lang"…

SwiftUI中ContentUnavailableView的使用(iOS 17、tvOS 17推出的新组件)

iOS 17为SwiftUI带来了一个新的组件ContentUnavailableView&#xff0c;它允许我们向用户呈现一个空状态&#xff0c;而不需要创建自定义错误或者无内容视图。 ContentUnavailableView易于使用&#xff0c;可自定义&#xff0c;并且具有用于空搜索状态的预定义视图。 建议在无…

【C语言】详解函数(下)(庖丁解牛版)

文章目录 1. 前言2. 数组做函数形参3. 函数嵌套调用和链式访问3.1 嵌套调用3.2 链式访问 1. 前言 详解C语言函数(上)的链接&#xff1a;http://t.csdnimg.cn/EGsfe 经过对函数的初步了解之后,相信大家已经对C语言标准库里的函数已经有初步的认知了&#xff0c;并且还学会了如…

设计模式-工厂方法(创建型)

创建型-工厂方法 简单工厂 将被创建的对象称为“产品”&#xff0c;将生产“产品”对象称为“工厂”&#xff1b;如果创建的产品不多&#xff0c;且不需要生产新的产品&#xff0c;那么只需要一个工厂就可以&#xff0c;这种模式叫做“简单工厂”&#xff0c;它不属于23中设计…

nvme-cli常见命令分析

一、背景 nvme-cli命令常常用于获取或者设置SSD参数&#xff0c;比如常见的nvme list&#xff0c;nvme id-ctrl等&#xff0c;都是获取SSD的基本信息&#xff0c;也有nvme admin-passthru用于读取或者设置自定义命令。作为使用者&#xff0c;我们并不知道nvme-cli源码怎么实现…

光波长 深入程度

UV深入程度&#xff08;UVC&#xff0c; UVB&#xff0c; UVA&#xff09;https://mp.weixin.qq.com/s?__bizMzkwNTM0Njk3MA&mid2247483934&idx1&sn92d1ba67ead404e7714af11ec0526786&chksmc0f868ebf78fe1fd0610493e6f49a5d90835a20a829a900746906cda12f2fa12…

ultralytics-极市平台打榜

ultralytics 应用教程 ultralytics简介 UltralyticsYOLOv8YOLOv8 基于深度学习和计算机视觉领域的尖端技术,在速度和准确性方面具有无与伦比的性能。其流线型设计使其适用于各种应用,并可轻松适应从边缘设备到云 API 等不同硬件平台。链接 安装教程 作为第三方python包直接…

hcia datacom学习(12):vlan间路由

不同vlan相当于不同网段&#xff0c;如果vlan间没有三层技术&#xff0c;那么它们就无法互相通信。 vlan间路由可以有3种方式&#xff1a; 1.直接使用路由器转发 *路由器本身不需要额外设置&#xff0c;只需配置端口ip作为网关即可。 *路由器不能处理带有vlan标签的数据帧&a…

springboot3 一些听课笔记(1)

文章目录 一、日志框架二、springboot 自动配置三 、springweb3.13.2 自己编写一个messageconvert3.2.2 如果我们想让其支持yaml格式呢&#xff1f; 一、日志框架 springboot底层 默认使用logbacksjf4j作为日志框架。 1、每个 starter 场景&#xff0c;都会导入一个核心场景 …

10_JavaWeb过滤器

文章目录 过滤器1.过滤器的实现1.1 实现过滤器1.2 配置过滤器1.2.1 过滤器的xml方式1.2.2 过滤器的注解方式 2. 过滤器的生命周期3. 过滤器链使用 过滤器 生活举例: 公司前台,停车场安保,地铁验票闸机 java中过滤仅仅是对请求做出过滤 客户端向服务器发出请求&#xff0c;在服…

Jail管理器AppJail的使用@FreeBSD

Jail的简介 Jail是FreeBSD操作系统中一个功能强大的安全机制&#xff0c;自FreeBSD 4.X版本起便投入使用&#xff0c;并且随着系统的发展&#xff0c;其功能、效率、稳定性和安全性得到了持续的强化。 Jail基于chroot的概念&#xff0c;通过更改一系列程序的根目录&#xff0…