没事写写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. k8s 理解Service工作原理

    什么是service? Service是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法. 简单来说K8s提供了service对象来访问pod.我们在<k8s网络模型与集群通信> ...

  2. Guava Cache源码浅析

    1. 简介 Guava Cache是指在JVM的内存中缓存数据,相比较于传统的数据库或redis存储,访问内存中的数据会更加高效,无网络开销. 根据Guava官网介绍,下面的这几种情况可以考虑使用Gu ...

  3. Jarvis OJ--PHPINFO

    一道浙大的题目 题目地址:http://web.jarvisoj.com:32784 拿到这道题目, 是一道反序列化的题目,题目源码很简单,当创建OowoO()这个类的对象时,会自动调用__const ...

  4. 01-JS中字面量与变量

    01-JS中字面量与变量 一.直接量(字面量) 字面量:英语叫做literals,也做直接量,看见什么,它就是什么. (一)数字的字面量 数字的字面量,就是这个数字自己,并不需要任何的符号来界定这个数 ...

  5. 《剑指offer》面试题29. 顺时针打印矩阵

    问题描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4 ...

  6. linux简单命令汇总

    ls [选项] [文件或目录] -a 显示所有文件,包括隐藏文件 -l 显示详细信息 -d 查看目录属性 -h 人性化显示文件大小 -i 显示inode mkdir [选项] 目录名 -p 递归创建 ...

  7. 第06讲:Flink 集群安装部署和 HA 配置

    Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...

  8. alpakka-kafka(9)-kafka在分布式运算中的应用

    kafka具备的分布式.高吞吐.高可用特性,以及所提供的各种消息消费模式可以保证在一个多节点集群环境里消息被消费的安全性:即防止每条消息遗漏处理或重复消费.特别是exactly-once消费策略:可以 ...

  9. 学习Java第6天

    今天所做的工作: 1.完成学生信息管理系统样卷 2.核心技术接口继承,多态 明天工作安排: 1.类的高级特性(Java类包) 2.异常处理 今天做一个小小的总结,Java程序是完全面向对象的,它的所有 ...

  10. 论文解读(GAN)《Generative Adversarial Networks》

    Paper Information Title:<Generative Adversarial Networks>Authors:Ian J. Goodfellow, Jean Pouge ...