之前介绍过ansible的使用,通过ssh授权批量控制服务器集群 但是生成密钥和分发公钥的时候都是需要确认密码的,这一步也是可以自动化的,利用ssh + expect + scp就可以实现,其实只用这几个命令结合也可以实现类似ansible的功能了 为了远程操作服务器进行环境初始化,总结我们都需要以下几步操作 1.ssh-keygen生成密钥对 2.将生成的公钥发送到node服务器 3.scp拷贝安装包到node服务器 4.ssh远程执行拷贝过去的安装包

下面进行集群环境初始化脚本的编写,通过ssh + expect + scp实现服务器集群自动化搭建

第一步,服务器准备

这里使用docker模拟几台服务器,分别命名为node2,node3,node4(使用镜像chenqionghe/ubuntu,密码统一为88888888),生产环境为ip或host

docker run -d --name node2 -p 2223:22 chenqionghe/ubuntu
docker run -d --name node3 -p 2224:22 chenqionghe/ubuntu
docker run -d --name node4 -p 2225:22 chenqionghe/ubuntu

还得有一台主控制服务器node1,负责操作所有的服务器节点

docker run -d --name node1 -p 2222:22 \
--link node2:node2 \
--link node3:node3 \
--link node4:node4 \
chenqionghe/ubuntu

初始化完成后进入node1节点

ssh root@127.0.0.1 -p 2222

安装必须软件

apt-get install expect -y

创建存放脚本的目录~/env

mkdir -p ~/env && cd ~/env

这里先模拟一个简单的安装包scripts/install.sh,安装vim命令

mkdir scripts
cat > scripts/install.sh <<EOF
#!/bin/bash bash
apt-get install vim -y
EOF

创建机器列表配置文件,vim nodes.txt

node2
node3
node4

第二步 编写自动化脚本

1.无交互ssh-keygen生成密钥对脚本,vim ssh-keygen.exp

#!/usr/bin/expect
#set enter "\n"
spawn ssh-keygen
expect {
"*(/root/.ssh/id_rsa)" {send "\r";exp_continue}
"*(empty for no passphrase)" {send "\r";exp_continue}
"*again" {send "\r"}
}
expect eof

2.无交互分发公钥脚本,vim send-sshkey.exp

#!/usr/bin/expect
if { $argc != 2 } {
send_user "usage: expect send-sshkey.exp file host\n"
exit
}
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "88888888"
spawn ssh-copy-id -i $file -p 22 root@$host
expect {
"yes/no" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
expect eof 

3.远程批量执行ssh脚本, vim mssh.sh

#!/bin/bash
Port=22
if [ $# -lt 1 ];then
echo "Usage: `basename $0` command"
exit
fi
echo $@
for v in `cat nodes.txt`
do
ssh -t -p ${Port} root@${v} $@
if [ $? -eq 0 ];then
echo "执行成功:$v"
else
echo "执行失败:$v"
fi
done

4.自动化部署脚本,vim auto-deploy.sh

#!/usr/bin/env bash
#机器列表
HostList=`cat nodes.txt`
#端口号
Port=22
# 1.无交互生成密钥对
if [ ! -f ~/.ssh/id_rsa.pub ];then
expect ssh-keygen.exp
fi
# 2.无交互分发公密钥
for v in ${HostList}
do
expect send-sshkey.exp ~/.ssh/id_rsa.pub ${v}
if [ $? -eq 0 ];then
echo "公钥-发送成功:$v"
else
echo "公钥-发送失败:$v"
fi
done
# 3.分发脚本文件(安装软件包)
for v in ${HostList}
do
scp -P ${Port} -rp ~/env/scripts root@${v}:~
if [ $? -eq 0 ];then
echo "scripts-发送成功:$v"
else
echo "scripts-发送失败:$v"
fi
done
# 4.使用脚本文件安装
for v in ${HostList}
do
ssh -t -p ${Port} root@${v} /bin/bash ~/scripts/install.sh
done

到这里所有的文件已经创建完成,整个env目录结构如下

├── auto-deploy.sh
├── mssh.sh
├── nodes.txt
├── scripts
│   └── install.sh
├── send-sshkey.exp
└── ssh-keygen.exp

第三步 执行自动化脚本查看效果

sh auto-deploy.sh

执行成功结果

spawn ssh-keygen
...
公钥-发送成功:node2
...
公钥-发送成功:node3
...
公钥-发送成功:node4
install.sh 100% 40 41.4KB/s 00:00
scripts-发送成功:node2
install.sh 100% 40 45.0KB/s 00:00
scripts-发送成功:node3
install.sh 100% 40 39.9KB/s 00:00
scripts-发送成功:node4
...
Connection to node4 closed.

出现上面的结果代表3个node节点已经初始化完成,拷贝公钥+安装软件成功!

我们再来执行一下远程命令脚本,查看所有服务器系统类型

sh mssh.sh "cat /etc/os-release|head -n 1"

执行结果如下

cat /etc/os-release|head -n 1
NAME="Ubuntu"
Connection to node2 closed.
执行成功:node2
NAME="Ubuntu"
Connection to node3 closed.
执行成功:node3
NAME="Ubuntu"
Connection to node4 closed.
执行成功:node4

这样就实现了自动化创建密钥对+分发公钥+所有服务器软件环境安装+批量远程执行脚本mssh.sh,麻雀虽小,五脏俱全,绝对是干货!light weight baby!

linux集群自动化搭建(生成密钥对+分发公钥+远程批量执行脚本)的更多相关文章

  1. linux集群时间同步搭建

    http://xstarcd.github.io/wiki/sysadmin/ntpd.html http://www.voidcn.com/blog/xuxudede1989/article/p-4 ...

  2. Linux集群监控工具简介:Ganglia和Nagios

    11年时候,曾经对 Ganglia 和 Nagios有一定接触,这是两个用于监视数据中心的工具.这两个工具被大量用于高性能计算(HPC)环境中,但是它们对于其他环境也具有很大的吸引力(例如云.呈现集群 ...

  3. 基于VMware的虚拟Linux集群搭建-lvs+keepalived

    基于VMware的虚拟Linux集群搭建-lvs+keepalived 本文通过keepalived实现lvsserver的的双机热备和真实server之间的负载均衡.这方面的blog挺多,可是每一个 ...

  4. Linux环境下HDFS集群环境搭建关键步骤

    Linux环境下HDFS集群环境搭建关键步骤记录. 介质版本:hadoop-2.7.3.tar.gz 节点数量:3节点. 一.下载安装介质 官网下载地址:http://hadoop.apache.or ...

  5. linux环境(CentOS-6.7)下redis集群的搭建全过程

    linux环境下redis集群的搭建全过程: 使用mount命令将光盘挂载到/mnt/cdrom目录下: [root@hadoop03 ~]# mount -t iso9660 -o ro /dev/ ...

  6. Linux环境下SolrCloud集群环境搭建关键步骤

    Linux环境下SolrCloud集群环境搭建关键步骤. 前提条件:已经完成ZooKeeper集群环境搭建. 一.下载介质 官网下载地址:http://www.apache.org/dyn/close ...

  7. Linux环境下ZooKeeper集群环境搭建关键步骤

    ZooKeeper版本:zookeeper-3.4.9 ZooKeeper节点:3个节点 以下为Linux环境下ZooKeeper集群环境搭建关键步骤: 前提条件:已完成在Linux环境中安装JDK并 ...

  8. 【redis】 linux 下redis 集群环境搭建

    Redis集群 (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 127.0.0.1:63791 ...

  9. Linux集群

    集群的起源: 集群并不是一个全新的概念,其实早在七十年代计算机厂商和研究机构就开始了对集群系统的研究和开发.由于主要用于科学工程计算,所以这些系统并不为大家所熟知.直到Linux集群的出现,集群的概念 ...

随机推荐

  1. DataTable的Merge\COPY\AcceptChange使用说明

    在C#内使用DataTable的Merge().Copy().AcceptChange().Clone()方法的用途如下: 1.Merge()可将两个不同的表结构的表进行合并,合并后新表的列为之前两表 ...

  2. Vue(三十一)轮播组件

    直接上源码 (1)组件文件 Carousel.vue <template> <div class="carousel-component"> <div ...

  3. kettle web化

    kettle web化 通过Java API调用kettle核心代码,并基于Spring Boot提供简易的Web管理界面. 背景 在工作中,通过kettle这款ETL产品进行数据处理时,是通过kit ...

  4. 771. Jewels and Stones

    You're given strings J representing the types of stones that are jewels, and S representing the ston ...

  5. java课程之团队开发冲刺阶段1.3

    一.总结昨天进度 1.完成任务指标,但是有些问题没有得到根本上解决,只是换方式解决了 2.使用时间:6小时 二.遇到的困难 1.在设置AlertDialog弹窗组件的时候,没有办法获取选中值,再实验多 ...

  6. Android中RadioGroup的初始化和简单的使用

    一简介: RadioGroup作为一个单选按钮组,可以设置为性别选择男或则女,地址选择等等,作为一个android入门级选手,就简单的说一下RadioGroup组中RadioButton的布局和初始化 ...

  7. Springboot中关于跨域问题的一种解决方法

    前后端分离开发中,跨域问题是很常见的一种问题.本文主要是解决 springboot 项目跨域访问的一种方法,其他 javaweb 项目也可参考. 1.首先要了解什么是跨域 由于前后端分离开发中前端页面 ...

  8. ubuntu Pycharm 2017 3.3 Active

    1.打开激活窗口 2.选择 Activate new license with License server (用license server 激活) 3.在 License sever addres ...

  9. 二叉查找树(BST)的实现

    一.二叉树介绍 二叉查找树(Binary Search Tree,BST),又称二叉排序树,也称二叉搜索树,它或者是一颗空树,或者具有如下性质的树:若它的左子树不为空,则左子树上所有节点的值都小于根节 ...

  10. InputStream和Reader,FileInputStream和 FileReader的区别

    一.InputStream和Reader的区别 InputStream和Reader都可以用来读数据(从文件中读取数据或从Socket中读取数据),最主要的区别如下: InputStream用来读取二 ...