多路徑配置文件自動填充腳本

多路徑配置文件自動填充腳本

1、腳本介紹1.1 腳本編寫緣由2、腳本編寫2.1 獲取多路徑信息2.2 獲取須要寫入的內容2.3 定位插入位置3、完整腳本css

1、腳本介紹

1.1 腳本編寫緣由

最近在項目(分佈式存儲+虛擬化)實施的過程當中,遇到了一個瑣碎的事情,由於分佈式存儲分了不少個lun,在多路徑寫多路徑配置文件的時候很是繁瑣,故編寫了一個腳原本實現這個功能。nginx

本腳本主要是自動填充multipath.conf文件中的multipaths參數bash

通常來講,/etc/multipath.conf文件是這樣的:分佈式

multipaths {

    multipath {
        wwid 3600605b00a60a980ff0000300310f370
        alias mpatha
        }
    multipath {
        wwid 3600605b00a60a980ff0000300310f371
        alias mpathb
        }
    multipath {
        wwid 3600605b00a60a980ff0000300310f372
        alias mpathc
        }
    multipath {
        wwid 3600605b00a60a980ff0000300310f373
        alias mpathd
        }
}

可是若是有100個lun呢?那就要一個一個multipath去添加了,很是麻煩。ide

2、腳本編寫

2.1 獲取多路徑信息

首先,使用多路徑命令查看多路徑信息,信息的格式:函數

[root@arppinging /]# multipath -ll

mpatha (360a9800064665072443469563477396c) dm-0 NETAPP,LUN 

size=3.5G features='0' hwhandler='0' wp=rw

`-+- policy='round-robin 0' prio=4 status=active

|- 1:0:0:0 sdb 8:16 active ready  running  

`- 2:0:0:0 sde 8:64 active ready  running

對比上面配置文件,可知咱們須要的內容是mpatha(alias)和360a9800064665072443469563477396c(wwid)優化

我將獲篩選後的值寫入一個文件mpathui

multipath -ll | grep mpath >> mpath

獲得如下內容lua

[root@arppinging /]# cat mpath
mpatha (360a9800064665072443469563477396c) dm-0 NETAPP,LUN

那我怎麼獲得 aliaswwid 的值呢?這時候就能夠使用到咱們的 awkspa

[root@arppinging /]# dev=`awk '{print $1}' mpath`
[root@arppinging /]# wwid=`awk 'print $2' mpath`
[root@arppinging /]# echo $dev
mpatha
[root@arppinging /]# echo $wwid
(360a9800064665072443469563477396c)

因而可知wwid並不知足咱們的要求,由於在配置文件中, wwid 是沒有()的,因此咱們須要使用 sed 將文本中的()去掉,爲防止有其餘內容存在,將非 m 開頭的行和空白行也刪除

[root@arppinging /]# sed -i 's/(\|)/^[^m]/g' mpath
[root@arppinging /]# sed -i '/^[^m]\|^$/d' mpath
[root@arppinging /]# cat mpath
mpatha 360a9800064665072443469563477396c dm-0 NETAPP,LUN

再次獲取值

[root@arppinging /]# wwid=`awk 'print $2' mpath`
[root@arppinging /]# echo $wwid
360a9800064665072443469563477396c

2.2 獲取須要寫入的內容

如何將 aliaswwid 寫入配置文件中呢?
若是有多行數據:

[root@arppinging /]# cat mpath
mpatha 3600605b00a60a980ff0000300310f370 dm-0 LSI     ,MR9261-8i
mpathb 3600605b00a60a980ff0000300310f371 dm-0 LSI     ,MR9261-8i
mpathc 3600605b00a60a980ff0000300310f372 dm-0 LSI     ,MR9261-8i
mpathd 3600605b00a60a980ff0000300310f373 dm-0 LSI     ,MR9261-8i
mpathe 3600605b00a60a980ff0000300310f374 dm-0 LSI     ,MR9261-8i
mpathf 3600605b00a60a980ff0000300310f375 dm-0 LSI     ,MR9261-8i
mpathg 3600605b00a60a980ff0000300310f376 dm-0 LSI     ,MR9261-8i
mpathh 3600605b00a60a980ff0000300310f377 dm-0 LSI     ,MR9261-8i
mpathi 3600605b00a60a980ff0000300310f378 dm-0 LSI     ,MR9261-8i
mpathj 3600605b00a60a980ff0000300310f379 dm-0 LSI     ,MR9261-8i
mpathk 3600605b00a60a980ff0000300310f37a dm-0 LSI     ,MR9261-8i
mpathl 3600605b00a60a980ff0000300310f37b dm-0 LSI     ,MR9261-8i
mpathn 3600605b00a60a980ff0000300310f37c dm-0 LSI     ,MR9261-8i

使用 while 對文本進行逐行處理,並將結果寫入mpath.conf文件

while read line
do
   dev=`echo $line | awk '{print $1}'`
   wwin=`echo $line | awk '{print $2}'`
   cat << EOF >> mpath.conf
    multipath {
        wwid $wwin
        alias $dev
        }
EOF
done < mpath

查看 mpath.conf 文件

    multipath {
        wwid 3600605b00a60a980ff0000300310f37b
        alias mpathl
        }
    multipath {
        wwid 3600605b00a60a980ff0000300310f37c
        alias mpathn
        }

2.3 定位插入位置

那麼我須要在哪裏插入2.3獲取到的內容呢?
首先咱們要明確,在配置文件中的格式是這樣的:

multipaths {
        multipath {
                  }
}

而咱們獲取的內容是:

multipath {
          }

很明顯咱們須要找到外層的 multipaths {} 並在中間插入內容

[root@arppinging /]# cat -n multipath.conf | grep '\<multipaths\>'
    80    multipaths {
[root@arppinging /]

那若是沒有外層的 mulitpaths {} 怎麼辦呢?這時候就須要加一個判斷了,若是沒有咱們就給它添加上

cat -n multipath.conf | grep "\<multipaths\>" >/dev/null 2>&1
if [ $? -eq 0 ]
then
    linenumber=`cat -n multipath.conf | grep "\<multipaths\>" | awk '{print $1}'`
else
   cat << EOF >> multipath.conf
multipaths {
}
EOF
    linenumber=`cat -n multipath.conf | grep "\<multipaths\>" | awk '{print $1}'`
fi

定位到該位置的行號後,那麼我能夠使用 sed 在mulitipath.conf文件80行後插入mpath.conf的內容

sed -i "${linenumber}r mpath.conf" multipath.conf

這樣就行了!

3、完整腳本

#!/bin/bash
# date:2019/2/21
# 腳本功能:自動將wwin和盤符信息寫入multipath.conf文件


# 定義文件內容優化函數,主要是刪除文本中非多路徑內容
mpathtext (){
    echo > mpath.conf
    echo > mpath
    multipath -ll | grep mpath >> mpath
    sed -i 's/(\|)//g' mpath
    sed -i '/^[^m]\|^$/d' mpath
}

# 定義不能再/etc/目錄下對配置文件操做和判斷配置文件是否存在
condition (){
    path=`echo $PWD | awk -F'/' '{print $2}'`
    [ $path = 'etc' ] && echo -e "\033[31m[ERROR]\033[0m 請勿在/etc/目錄下執行腳本" && exit 1
#    cp /etc/multipath.conf ${PWD}/
#    [ $? -ne 0 ] && echo "\033[31m [ERROR]\033[0m /etc/下沒有multipath.conf文件" && exit 2
    ls -l ${PWD}/multipath.conf 1>/dev/null 2>&1
    [ $? -ne 0 ] && echo -e "\033[31m[ERROR]\033[0m 當前目錄下沒有multipath.conf文件" && exit 2
}

# 是否須要刪除 `multipaths` 參數的全部配置
reset (){
    read -p "是否刪除multipath.conf文件已有的multipaths參數?[y/n][n]:" option
    option=${option:-'n'}
    case $option in
        n)
    ;;
        y)
        linenumber=`cat -n multipath.conf | grep "\<multipaths\>" | awk '{print $1}'`
            if [ ! -n "$linenumber" ];then
            echo -e "無multipaths參數.               \033[32m [OK]\033[0m"
        else
        sed -i ${linenumber},'$'d multipath.conf
        echo -e "multipaths參數已經被刪除.       \033[32m [OK]\033[0m"
        fi
    ;;
    *)
        echo -e "\033[31m[ERROR]\033[0m input error,please enter n or y"
        exit 3
    ;;
    esac
}


condition
reset
mpathtext

# 定位多路徑配置文件的行,若是不存在,則建立multipaths參數。
cat -n multipath.conf | grep "\<multipaths\>" >/dev/null 2>&1
if [ $? -eq 0 ]
then
    linenumber=`cat -n multipath.conf | grep "\<multipaths\>" | awk '{print $1}'`
else
   cat << EOF >> multipath.conf
multipaths {
}
EOF
    linenumber=`cat -n multipath.conf | grep "\<multipaths\>" | awk '{print $1}'`
fi


# 將獲取到的wwin和盤符寫入mpath.conf文件
while read line
do
   dev=`echo $line | awk '{print $1}'`
   wwin=`echo $line | awk '{print $2}'`
   cat << EOF >> mpath.conf
    multipath {
        wwid $wwin
        alias $dev
        }
EOF
done < mpath

# 將mpath.conf文件插入配置文件中
sed -i "${linenumber}r mpath.conf" multipath.conf
echo -e "multipath.conf文件修改完成.     \033[32m [OK]\033[0m"
相關文章
相關標籤/搜索