没事写写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. leetcode 509. 斐波那契数

    问题描述 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,   F(1) = 1 F(N) ...

  2. Javascript中常用事件集合和事件使用方法

    Javascript中常用事件集合和事件使用方法 一.事件绑定 格式: 事件源 . on事件类型=事件处理函数 事件绑定三要素 1.事件源:和谁绑定 2.事件类型:什么事件 3.事件处理函数:触发了要 ...

  3. nginx的fastcgi配置

    首先参考了一份配置注释(来自"小刚的博客"): #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错 ...

  4. 加深对AQS原理的理解示例一:实现一个独占锁

    /** *@Desc * 这个自定义的独占锁 只是一个简单的版本,非常粗糙,只为了加深对AQS原理理解.但还有一些列问题有待解决,比如锁的重入,锁不允许被其他线程中断等! *@Author zhang ...

  5. golang中goroutine协程调度器设计策略

    goroutine与线程 /* goroutine与线程1. 可增长的栈os线程一般都有固定的栈内存,通常为2MB,一个goroutine的在其声明周期开始时只有很小的栈(2KB),goroutine ...

  6. IoC容器-Bean管理(bean生命周期)

    1,生命周期 即从对象创建到对象销毁的过程 2,bean生命周期 (1)通过构造器创建bean实例(无参数构造) (2)为bean的属性设置值和对其他bean的引用(调用set方法) (3)调用bea ...

  7. Flink 如何通过2PC实现Exactly-once语义 (源码分析)

    Flink通过全局快照能保证内部处理的Exactly-once语义 但是端到端的Exactly-once还需要下游数据源配合,常见的通过幂等或者二阶段提交这两种方式保证 这里就来分析一下Sink二阶段 ...

  8. Windows安装软件出现 2502 2503的错误?

    1 输入这个命令 2 3 msiexec /package +"需要安装文件的路径" 4 5 //注意路径的问题 斜杆要保持一致. 6 //注意要有空格. 我的安装路径 7 msi ...

  9. SharePoint Online 为Modern Page添加脚本

    前言 众所周知,如果我们想向SharePoint 页面添加脚本,最方便的便是经典页面,添加方式主要有内容编辑器Web部件或者直接使用SharePoint Designer. 但是,如果页面是Moder ...

  10. table 增加或删除一行

    转载请注明来源:https://www.cnblogs.com/hookjc/ <HTML><SCRIPT LANGUAGE="JScript">funct ...