一、使用场景

       1. 大家对100+台大规模的linux虚拟机,同时进行批量操作,各种工具往往显得力不从心;少则2h多则6h,把大家整的头晕眼花往往还有遗漏;网上也没有相对较好的资料参考
       2. 这里,小编呕心力作写了一个shell脚本,只需花5m分钟就能把活干完,看起来很简单;小编却花费了数天才研究出来的成果,与大家分享,好用到爆炸。

二、使用目的和效果

        1. 只要你有同时批量操作linux虚拟机的需求,你把脚本的发送send指令,与expect获取字符串的内容按自身需求修改,可能花2-3m分钟,你就可以实现批量操作功能。
        2. 大家不要怀疑,对于100+台服务器运行,手到擒来,小编运行150+台服务器多次效果ok。     

三、操作步骤

3.1 操作前数据查看

  1. 查看硬盘信息 fdisk -l
    新安装的linux虚拟机centos系统,发现有一个硬盘/dev/mapper/centos-root,共14.4GB
    查看硬盘信息

  2. 查看硬盘挂载信息 df -h
    发现硬盘/dev/mapper/centos-root整体挂载在根目录下/
    硬盘挂载信息

  3. 查看最大连接数 ulimit -n或者ulimit -a
    ulimit -n就是查找当前用户的进程,最多打开的文件open files数是1024
    最大连接数

3.2 shell脚本编写

  1. 对100+台同类linux虚拟机硬盘/dev/mapper/centos-root自动分区、挂载目录、修改linux虚拟机最大连接数

    4.1 在/root目录下,创建文本iptest.txt,放置100+台虚拟机的密码password和ip地址;将来被执行shell脚本batch_exec.sh循环执行,调用其iptest.txt文本中所罗列的password和ip,进行远程交互登录,依次执行指定命令command,如:磁盘分区、挂载目录、修改最大连接数等。

     4.1.2 注意:第1列,放置密码password;第2列放置ip
                 cd /root
                 cat >> iptest.txt << EOF
                 > abcdef 192.168.1.1
                 > aefged 192.168.5.8
                 > aexcdd 192.168.8.9
                 > EOF
                #里面添加密码、ip,ip后面不要有空格null
    
    4.1.3 查看文本iptest.txt中批量执行的虚拟机密码password和ip填写ok,如果有100+台,全部填写,多多益善,真正体现接下来batch_exec.sh的实力。                    ![查看linux虚拟机密码与ip填写情况](https://img-blog.csdnimg.cn/20201104220028929.png#pic_center)
    

    4.2 在/root目录下,创建脚本batch_exec.sh,并授权
    touch batch_exec.sh
    chmod 777 batch_exec.sh
    #此处,授权为最高可执行读r(read)写w(write)权限,通过sh ./root/batch_exec.sh,运行此脚本,完成批量运行指令commad;授权之后的shell为绿色,如下图
    创建批量可执行脚本batch_exec.sh,并授权

    4.2.1 将下面第2部分黑色窗口展示的 代码片copy 放置batch_exec.sh脚本中;第1部分为详解。

第1部分,shell脚本详解
#!/bin/bash 
#课堂小知识,此处为解释器,作用就是将shell脚本里面的内容,翻译成为计算机能识别的语言;
#就像翻译官,沟通华夏子孙与外国人,起一个翻译作用;
#每台linux虚拟机,都有各种各样的解释器,就像翻译官,有英语翻译官、法语、德语翻译官一样;
#解释器不同,识别的语言也不同。

apt-get update
#安装的linux虚拟机,如果是ubuntu系统的使用apt-get,是centos系统的使用yum -y update;
#后续的shell中只需apt-get与yum互换即可;
#此处目的,更新一下系统,做个健康检查,恢复机理

apt-get install expect -y
#此处安装expect,系统以交互形式要求输入指定字符串,实现交互通信;
#例如,linux虚拟机出了1、2、3,三个选项,你选择1,虚拟机自动给出1的答案或者指令;
#所有脚本中-y(yes的简写),后期出现要你确认的事件,以后就不用再点确认,这里提前设置自动确认了。

while read -r line
#看这个shell最后1行,此处是取出 iptest.txt中,虚拟机password和ip(将来要批量执行分区、挂载命令的虚拟机信息)
#将循环读取的第1列密码password、第2列ip信息,放入变量line中
do
password=`echo $line| awk '{print $1}'`
#读取变量line中的第1列信息,即密码password
echo $password
#测试过程中,可以将密码打印出来,判断取值是否ok

ip=`echo $line| awk '{print $2}'`
#读取变量line中的第2列信息,即ip
echo $ip
#测试过程中,可以将ip打印出来,判断取值是否ok

expect << EOF
#此处,启动远程expect交互,<< EOF(可以理解为从哪开始),与后面< EOF(可以理解为结束)遥相呼应
spawn ssh root@$ip
#前面的所有步骤,都完成了从iptest.txt (password ip)取值--> line --> password、ip
#启动新进程(spawn作用),这里是ssh链接从iptest.txt获取虚拟机ip

expect {
 "*yes/no" { send "yes\r"; exp_continue }
 "*password:" { send "$password\r" }
}
#固定用法,expect预判断上面spawn进程开启后,通过ssh root@ip链接ok,后会让你输入虚拟机密码
#通过send把从iptest.txt传递给line的密码password发送过去,如果ok,就登录成功了
#此时,你已经在登录的这台linux虚拟机中了
 
 sleep 2
 #密码验证登录,需要时间,此处可以休眠一下
 
 expect "*#"
 #开启远程交互,固定用法:第1个expect”*#”是开启接收字符串,第2个expect”*#”是结束停止接收字符串;与EOF类似
 
 send "fdisk /dev/mapper/centos-root\r"
 #开始对登录ok的这台linux虚拟机进行分区
 
 expect "Command*"
 #预判上面send的fdisk...执行成功后,会出现Command这个界面
 #Command*后面的*代指任何字符或字符串,你可以理解为捕捉或者预判linux界面出来了"Command,那接下来往下走
 
 send "n\r"
 #此处n代表add a new partition,说白了就是增加1个新分区
 #分区就像是把电脑500G硬盘,分为C盘、D盘、E盘
 
 expect "Select*"
 #预判上面send的n选择分区指令,linux界面出来了Select的字符串,那接下来选择
 
 send "p\r"
 #这里的p代表primary主分区;硬盘分有主分区、逻辑分区,但是主分区一定要有;
 #就比如C盘,可以启动系统程序(主分区作用),也可以存放文件(逻辑分区作用)
 #这里linux的这个p就是对硬盘分区,分一个primary的主分区
 
 expect "Partition*"
 #这里捕捉或者预判linux界面出来了Partition的字符串,接下来往下走
 
 send "1\r"
 #将/dev/mapper/centos-root分1个区,将来就是/dev/mapper/centos-root1
 #如果send的是2,将来分区的磁盘就是dev/mapper/centos-root2
 
 expect "First*"
 send "\r"
 expect "Last*"
 send "\r"
 #选择分区的大小,相当于一个区间,这个区间范围就是【First Last】
 # 以上send的2个null空格
 
 expect "Command*"
 send "w\r"
 #将以上分区信息,写(write简写w)入虚拟机,说白了就是保存
 #以上步骤的截图,如下4.
 
 send "mkfs.ext4 /dev/mapper/centos-root1\r"
 #将磁盘 /dev/mapper/centos-root1制作为ext4文件系统格式
 #linux中,万物皆文件,磁盘必须以挂载mount文件目录形式出现
 #所有磁盘也必须有文件格式,就像电脑有txt、mp4、ppt格式等
 #其中mkfs为(make file system制作文件系统,ext4为一种常用的格式)
 
 send "mkdir -p /workDir\r"
 #创建一个workDir目录,将来把分区好的/dev/mapper/centos-root1硬盘挂载上去
 #其中-p为递归,你可以创建/workDir/a/b/c,不用一层一层创建
 
 send "mount /dev/mapper/centos-root1 /workDir\r"
 #将/dev/mapper/centos-root1挂载到目录/workDir\r下
 
 send "echo '/dev/mapper/centos-root1 /workDir ext4 defaults 0 0' >> /etc/fstab\r "
 #设置开启自启动/etc/fstab,不管宕机重启,它们的格式固定了ext4
 
 send "mount -a\r"
 #检查挂载是否ok,如果异常会中断连接,如果ok会回到最初界面
 
 expect "*root/"
 #预判mount -a挂载检查ok,光标显示在root用户下
 
 send "echo '* hard nofile 65535' >> /etc/security/limits.conf\r"
 send "echo '* soft nofile 65535' >> /etc/security/limits.conf\r"
 send "echo 'root hard nofile 65535' >> /etc/security/limits.conf\r"
 send "echo 'root soft nofile 65535' >> /etc/security/limits.conf\r"
 send "sysctl -p\r"
 #以上,是将用户开启进程打开open files文件数,修改为最大值65535
 #sysctl -p为立马生效,与ubuntu中source xxx.file类似
 
 sleep 1
 #send "reboot\r"
 #修改完配置后可以重启电脑,也可以休眠1s,让配置生效
 
 expect "*#"
 #此处从进程接受字符串,第1个表开启接收,第2个表结束
 
 interact
 #此处,代表1台linux命令执行完以后,继续循环读取下一台linux的密码password和ip,继续ssh连接root@ip,实现交互登录,这里也是允许交互的意思
 
 EOF
 #第1个EOF表示,开始执行某些指令;第二个EOF表示执行指令结束
 done < iptest.txt

5、硬盘分区过程截图展示 fdisk /dev/mapper/centos-root
硬盘分区过程展示 6、硬盘分区结果展示 fdisk -l
硬盘分区结果展示
7、batch_exec.sh脚本展示及部分命令说明
send 用于向进程发送字符串
expect 从进程接受字符串
spawn 启动新的集成
interact 允许用户交互

#!/bin/bash
apt-get update
apt-get install expect -y
while read -r line
do
password=`echo $line| awk '{print $1}'`
echo $password
ip=`echo $line| awk '{print $2}'`
echo $ip
expect << EOF
spawn ssh root@$ip
expect {
 "*yes/no" {send "yes\r";exp_continue }
 "*password:" {send "$password\r" }
 }
 sleep 2
 expect "*#"
 send "fdisk /dev/mapper/centos-root\r"
 expect "Command*"
 send "n\r"
 expect "Select*"
 send "p\r"
 expect "Partition*"
 send "1\r"
 expect "First*"
 send "\r"
 expect "Last*"
 send "\r"
 expect "Command*"
 send "w\r"
 send "mkfs.ext4 /dev/mapper/centos-root1\r"
 send "mkdir -p /workDir\r"
 send "mount /dev/mapper/centos-root1 /workDir\r"
 send "echo '/dev/mapper/centos-root1 /workDir ext4 defaults 0 0' >> /etc/fstab\r "
 send "mount -a\r"
 expect "*root/"
 send "echo '* hard nofile 65535' >> /etc/security/limits.conf\r"
 send "echo '* soft nofile 65535' >> /etc/security/limits.conf\r"
 send "echo 'root hard nofile 65535' >> /etc/security/limits.conf\r"
 send "echo 'root soft nofile 65535' >> /etc/security/limits.conf\r"
 send "sysctl -p\r"
 sleep 1
 #send "reboot\r"
 expect "*#"
 interact
 EOF
 done < iptest.txt

以上就是写好后,大家只需要在sh batch_exec.sh脚本就可完成对100+台linux虚拟机操作,欢迎大家留言,如果有什么问题可以随时找我解答。关注小编不迷路,小编带你上高速…

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐