一、使用场景
1. 大家对100+台大规模的linux虚拟机,同时进行批量操作,各种工具往往显得力不从心;少则2h多则6h,把大家整的头晕眼花往往还有遗漏;网上也没有相对较好的资料参考
2. 这里,小编呕心力作写了一个shell脚本,只需花5m分钟就能把活干完,看起来很简单;小编却花费了数天才研究出来的成果,与大家分享,好用到爆炸。
二、使用目的和效果
1. 只要你有同时批量操作linux虚拟机的需求,你把脚本的发送send指令,与expect获取字符串的内容按自身需求修改,可能花2-3m分钟,你就可以实现批量操作功能。
2. 大家不要怀疑,对于100+台服务器运行,手到擒来,小编运行150+台服务器多次效果ok。
三、操作步骤
3.1 操作前数据查看
- 查看硬盘信息 fdisk -l
新安装的linux虚拟机centos系统,发现有一个硬盘/dev/mapper/centos-root,共14.4GB - 查看硬盘挂载信息 df -h
发现硬盘/dev/mapper/centos-root整体挂载在根目录下/ - 查看最大连接数 ulimit -n或者ulimit -a
ulimit -n就是查找当前用户的进程,最多打开的文件open files数是1024
3.2 shell脚本编写
- 对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填写情况]()
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为绿色,如下图
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虚拟机操作