5分鐘學會,同時對100+臺linux虛擬機器進行批量操作命令,例如:磁碟分割槽、掛載目錄、修改linux虛擬機器最大連線數等;只要你需要,都能執行

黑科技王子發表於2020-11-04
  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
    最大連線數

  4. 對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
    

將批量被執行command的虛擬機器密碼和IP放入指定文字iptest.txt
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為綠色,如下圖

建立批量可執行指令碼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、部分命令說明
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虛擬機器操作,歡迎大家留言,如果有什麼問題可以隨時找我解答。關注小編不迷路,小編帶你上高速…

相關文章