没事写写shell[我自己都不信,如果不是因为工作需要,我才不要写shell],努力让自己的脚本更健壮[就像我自己一样臃肿]

目录结构

创建两个目录,准备两个文件即可

./bin # 脚本存放路径
└── install_docker_es.sh # 脚本名称随意
./conf # 配置文件模板存放路径
└── elasticsearch.yml.template # 配置文件模板

install_docker_es.sh

脚本执行方式:sh 脚本名称 镜像名称

#!/bin/bash
# 遇到报错就退出脚本
set -e
# $(cd `dirname $0`; pwd)是脚本当前所在目录
# $(dirname `cd $(dirname $0);pwd`)是脚本当前所在目录的上一级目录
base_dir=$(cd `dirname $0`; pwd)
conf_dir=$(dirname `cd $(dirname $0);pwd`)/conf
# 利用位置变量定义镜像的名称
image_name="$1"
# 填写当前机器的ip地址
ip_host='172.31.243.179'
# 填写es需要暴露的端口,此端口和容器内部的端口一致
es_port='
9200
9201
9202
'
# 填写es集群之间通信需要暴露的端口,此端口和容器内部的端口一致
es_cluster_port='
9300
9301
9302
'
# 配置es的jvm内存大小
xms='-Xms256m'
xmx='-Xmx256m'
# 配置es的集群名称
es_cluster_name='elasticsearch-cluster'
# 配置es的data、logs、conf目录,只需要写一个总的目录即可[目录可以不存在,脚本会创建父级目录],脚本会分别创建
es_data_path='/opt/elasticsearch'
es_logs_path='/opt/elasticsearch'
es_conf_path='/opt/elasticsearch'
# 容器内的es部署目录
es_docker_path=$(docker inspect ${image_name} | awk -F '"' '/WorkingDir/ {print $4}' | uniq)
# 通过printf "%q\n"命令格式化输出变量值为数组的格式
es_port_array=($(printf "%q\n" ${es_port}))
es_cluster_port_array=($(printf "%q\n" ${es_cluster_port}))
# 如果位置变量没有输入值,则输出使用方法[sh 脚本名称 镜像名称],并退出脚本
# 镜像名称可以是<镜像名称:tag>,也可以是镜像id,只要存在即可
if [ -z "${image_name}" ];then
echo "Usage: sh $0 elasticsearch:latest"
exit 1
fi
# es需要配置系统参数max_map_count_num[jvm线程数量]
# 如果/etc/sysctl.conf配置的max_map_count_num不是262144,则会注释掉已有的配置,重新写入配置
# 通过sysctl -p使配置立即生效
max_map_count_num=$(awk -F '=' '/vm.max_map_count/ {print $NF}' /etc/sysctl.conf)
if [[ x"${max_map_count_num}" != x"262144" ]];then
sed -i '/vm.max_map_count/s/^/#/' /etc/sysctl.conf
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p &> /dev/null
fi
# 修改cluster.name为用户定义的
sed -i "/cluster.name/s/:.*/: ${es_cluster_name}/" ${conf_dir}/elasticsearch.yml.template
# 修改es的主机ip为用户定义的
sed -i "/network.publish_host/s/:.*/: ${ip_host}/" ${conf_dir}/elasticsearch.yml.template
# 配置es的发现主机的ip加端口
sed -i "/discovery.zen.ping.unicast.hosts/s/:.*/: \[\"${ip_host}:$(echo ${es_cluster_port_array[@]} | cut -d " " -f 1)\"\]/" ${conf_dir}/elasticsearch.yml.template
for (( n=2; n<=${#es_cluster_port_array[@]}; n++ ))
do
sed -i "/discovery.zen.ping.unicast.hosts/s/: \[/&\"${ip_host}:$(echo ${es_cluster_port_array[@]} | cut -d " " -f ${n})\",/" ${conf_dir}/elasticsearch.yml.template
done for (( i=0; i<${#es_port_array[@]}; i++ ))
do
# 判断data、logs、conf目录是否存在,不存在则创建
[ -d "${es_data_path}/es-data-${es_port_array[i]}" ] || mkdir -p ${es_data_path}/es-data-${es_port_array[i]}
[ -d "${es_logs_path}/es-logs-${es_port_array[i]}" ] || mkdir -p ${es_logs_path}/es-logs-${es_port_array[i]}
[ -d "${es_conf_path}/es-conf-${es_port_array[i]}" ] || mkdir -p ${es_conf_path}/es-conf-${es_port_array[i]}
# 通过-e修改多个内容[节点名称、es服务端口、es集群通信端口],重定向成以服务端口为名称的配置文件
sed -e "/node.name/s/:.*/: es-node-${es_port_array[i]}/" \
-e "/http.port/s/:.*/: ${es_port_array[i]}/" \
-e "/transport.tcp.port/s/:.*/: ${es_cluster_port_array[i]}/" ${conf_dir}/elasticsearch.yml.template \
> ${conf_dir}/elasticsearch-${es_port_array[i]}.yml
# 将模板配置文件目录下的配置文件,复制到es的conf目录下,统一管理
cp ${conf_dir}/elasticsearch-${es_port_array[i]}.yml ${es_conf_path}/es-conf-${es_port_array[i]}/elasticsearch-${es_port_array[i]}.yml
# ES_JAVA_OPTS 指定jvm内存大小
# TAKE_FILE_OWNERSHIP 因为es容器内默认的属主是uid=1000的用户,宿主机的目录属主是uid=0的用户,会造成Permission denied[权限被拒绝]的情况
# -p 暴露服务端口以及集群通信端口
# -v 宿主机与容器内的目录/文件映射
# -v /etc/localtime:/etc/localtime 容器内的时间与宿主机一致[否则容器内的时间与宿主机的时间会相差8小时]
# --name 指定es容器的名称,以服务端口为后缀
# ${image_name} 指定启动的docker镜像
docker run -d -e ES_JAVA_OPTS=""${xms}" "${xmx}"" \
-e TAKE_FILE_OWNERSHIP=true \
-p ${es_port_array[i]}:${es_port_array[i]} \
-p ${es_cluster_port_array[i]}:${es_cluster_port_array[i]} \
-v /etc/localtime:/etc/localtime \
-v ${es_data_path}/es-data-${es_port_array[i]}:${es_docker_path}/data \
-v ${es_conf_path}/es-conf-${es_port_array[i]}/elasticsearch-${es_port_array[i]}.yml:${es_docker_path}/config/elasticsearch.yml \
-v ${es_logs_path}/es-logs-${es_port_array[i]}:${es_docker_path}/logs \
--name es-cluster-${es_port_array[i]} ${image_name}
done

elasticsearch.yml.template

cluster.name: elasticsearch-cluster
node.name: es-node1
network.bind_host: 0.0.0.0
network.publish_host: "引号里面随便写,反正我会覆盖掉"
http.port: "引号里面随便写,反正我会覆盖掉"
transport.tcp.port: "引号里面随便写,反正我会覆盖掉"
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["引号里面随便写,反正我会覆盖掉"]
discovery.zen.minimum_master_nodes: 1

利用shell脚本[带注释的]部署单节点多实例es集群(docker版)的更多相关文章

  1. windows单节点下安装es集群

    linux下的es的tar包,拖到windows下,配置后,启动bin目录下的bat文件,也是可以正常运行的. 从linux下拷的tar包,需要修改虚拟机的内存elasticsearch.in.bat ...

  2. redhat6.5 redis单节点多实例3A集群搭建

    在进行搭建redis3M 集群之前,首先要明白如何在单节点上完成redis的搭建. 单节点单实例搭建可以参看这个网:https://www.cnblogs.com/butterflies/p/9628 ...

  3. Kafka 单节点多Kafka Broker集群

    Kafka 单节点多Kafka Broker集群 接前一篇文章,今天搭建一下单节点多Kafka Broker集群环境. 配置与启动服务 由于是在一个节点上启动多个 Kafka Broker实例,所以我 ...

  4. 基于 kubeadm 部署单控制平面的 k8s 集群

    单控制平面不符合 HA 要求,但用于开发/测试环境不会有任何问题,如果资源足够的话(10台以上服务器,3台用于APIserver.3台用于 etcd 存储.至少3台用于工作节点.1台作为负载均衡),可 ...

  5. Hadoop单节点启动分布式伪集群

    emm~ 写这篇博客只是手痒,因为开发环境用单节点就够了,生产环境肯定是真实集群,所以这个伪分布式纯属娱乐而已. 配置HDFS1. 安装好一台hadoop,可以参考这篇博客.2. 在hadoop目录下 ...

  6. [图文][提供可行性脚本] CentOS 7 Fencing+Pacemaker三节点搭建高可用集群

    实验说明: 实验环境: 宿主机系统   :Fedora 28 WorkStation 虚拟机管理器 :Virt-Manager 1.5.1 虚拟机配置   :ha1  CentOS 7.2 1511 ...

  7. Docker安装部署es集群

    Docker安装部署es集群:环境准备:已安装docker的centos服务器一台1. 拉取es版本docker pull elasticsearch:5.6.82. 新建文件夹 数据挂载目录 和 配 ...

  8. 利用shell脚本实现计划任务功能 V1.2

    2013.05.10  mytask 1.2 主程序休眠时间分成若干小的时间片断分段休眠,避免长时间的休眠不能及时响应系统信号. 2013.05.07 mytask 1.1 昨天发布了mytask1. ...

  9. shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中

    shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中 利用shell脚本将文本数据导入到mysql中 需求1:处理文本中的数据,将文本中的数据插入到mys ...

随机推荐

  1. C语言 生成一个随机数

    随机数的生成 有缺陷的生成方式 生成随机数可以使用 <stdlib.h> 里的 int rand(void); 函数实现! 注释: C语言中还有一个 random() 函数可以获取随机数, ...

  2. Linux上天之路(十八)之自动化部署

    pexpect Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Pyth ...

  3. Oracle update和select 关联

    Oracle update和select 关联 目录 Oracle update和select 关联 1.介绍 2.解决方法 2.1.需求 2.2.错误演示 2.3.解决方法 1.介绍 本文主要向大家 ...

  4. Exception in thread “main“ java.net.ConnectException: Call From

    问题描述:#报错语句:FileSystem fs = FileSystem.get(new URI("hdfs://hadoop000:8020"),new Configurati ...

  5. 【刷题-LeetCode】162 Find Peak Element

    Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...

  6. Xamarin/Unity3d无法访问Azure服务器或者微软API

    Xamarin因为是mono项目的商用版,mono项目是.net技术的开源修改版,所以和微软的服务对接时候会出现安全验证问题. mono项目本质是对汇编级的中间语言二次编译.可参考公共语言运行时相关知 ...

  7. gin中自定义http的配置

    package main import ( "github.com/gin-gonic/gin" "net/http" "time" ) f ...

  8. thingsboard源码编译启动

    开发环境 不同的版本对应的开发环境不同(这里以3.3.3版本说明) jdk11+:参考jdk11+安装(win) Maven3.6+:Maven安装配置 Git:参考Git安装 IDEA: 参考IDE ...

  9. 面渣逆袭:Java基础五十三问,快来看看有没有你不会的!

    大家好,我是老三, 面渣逆袭 系列继续.这节我们回到梦开始的地方--Java基础,其实过了萌新阶段,面试问基础就问的不多,但是保不齐突然问一下.想一下,总不能张口高并发.闭口分布式,结果什么是面向对象 ...

  10. 『无为则无心』Python函数 — 39、Python中异常的传播

    目录 1.异常的传播 2.如何处理异常 1.异常的传播 当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播.如果函数中没有对异常进行处理,则异常会继续向函数调用者传播.如果函数调 ...