半自動化運維之快速連線到指定環境(一)

jeanron100發表於2015-06-08
在大量的分散式環境中,可能存在著大量的主機配置,ip配置,資料庫例項配置,甚至作業系統使用者,資料庫使用者密碼也不同,這個時候如果記錄在10條左右還能應付,但是如果給你幾百個這樣的環境,每次都需要先查詢對應的作業系統使用者,主機名或者IP就顯得很麻煩,儘管已經設定了ssh信任連線。但是還是需要你知道使用者名稱的前提下來操作。
對於資料庫的連線也是如此,你可以使用tnsping來得到對應的主機名,但是還需要費些功夫在查詢對應的資料庫使用者名稱密碼上,因為知道主機名可能變得沒有那麼重要,我們可能只需要在客戶端連線即可。
如果要想把這些操作變為一個更快捷輕鬆的方式,使用配置檔案就是一個不錯的選擇,有很多自動化實現指令碼是把這些配置資訊放在資料庫表中,在需要的時候查取,過濾等等。
其實我們也可以在配置檔案中進行資訊的簡單過濾就可以避免去連線資料庫(因為資料庫環境也有可能不可用)
這個時候使用awk就是一個不錯的選擇。其實sed+awk能夠實現很多複雜的功能,我就次拋磚引玉,做一個粗泛的例子來說明一下。
假設我們使用了配置檔案hosts.lst
內容如下:
oel1 192.168.27.130 TEST11G ora11g n1 n1
oel1 192.168.27.130 DG11G ora11g  n1 n1  
oel2 192.168.28.131 ORA11G ora11g n1 n1

分別代表的含義就是主機名,主機Ip地址,資料庫例項名,作業系統使用者,資料庫使用者名稱,資料庫使用者密碼
假設我們只知道資料庫例項,這種場景可能比較多。我們只是想連線到指定的資料庫例項,這個時候使用sqlplus即可。
又或者我們知道主機名和資料庫例項名,我們需要連線到伺服器上去做一些操作,就可以使用ssh來完成,ssh信任關係是需要提前配置的。
我們可以使用如下的指令碼來完成這兩個功能,當然繼續擴充套件也是可以的。
if [ $# -eq 1 ]
then
cc_inst=$1
cat hosts.lst |awk '
BEGIN{
IGNORECASE=1
cc_inst="'$cc_inst'"
cc_index=1
}
{
if ($3== cc_inst )
{
print cc_index,$1,$2, $3,$4,  "\n sqlplus " $5"/"$6"@"$3
cc_index=cc_index+1
}
}'
fi

if [ $# -eq 2 ]
then
cc_hosts=$1
cat hosts.lst |awk '
BEGIN{
IGNORECASE=1
cc_inst="'$2'"
cc_hosts="'$cc_hosts'"
cc_index=1
}
{
if ($1== cc_hosts && $3==cc_inst)
{
print cc_index,$1,$2, $3,$4,  "\n ssh  " $4"@"$1
cc_index=cc_index+1
}
}'
fi

簡單演示一下。
比如我們需要連線至TEST11G這個資料塊例項。
$ ksh con.sh test11g
1 oel1 192.168.27.130TEST11G ora11g 
 sqlplus n1/n1@TEST11G

比如我們知道主機名為oel1,資料庫例項為test11g
$ ksh con.sh oel1 test11g
1 oel1 192.168.27.130TEST11G ora11g 
 ssh  ora11g@oel1

如果觀察仔細,會發現其實這個過濾中已經設定了大小寫不敏感。對於這兩個功能是透過輸入引數來進行區分的,如果輸入引數為1個,即進行第一個場景的處理,如果為2個,則進行主機名和資料庫例項名的過濾和處理。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1692274/,如需轉載,請註明出處,否則將追究法律責任。

相關文章