1. 程式人生 > >linux批量分發必會面試題,通過郵件反饋結果。

linux批量分發必會面試題,通過郵件反饋結果。

har fin hosts 編輯 重定向 調用 sse ast 無密碼

請準備三臺linux機器為別為A,B,C,要求實現以下內容
1、用自己的名字用戶完成一把鑰匙開多把鎖(A,鑰匙,B,C鎖)的免密碼登錄部署場景
該題在生產環境中的用途為;批量分發數據,批量發布程序代碼,批量控制管理等。

大型批量管理軟件pupet/saltstack
2、在1題的前提下同樣用自己的名字用戶完成多把鑰匙開一把鎖(B,C鑰匙,A鎖)的免密碼登錄
B--A
C--A
一題中我們在A創建了鎖和鑰匙,所以B和C要控制A就先把鑰匙發給B和C,因為A本地的鎖還不正常,就像A給B和C發公鑰一樣給自己再發一份,鎖的名字為authorrized_keys.這樣B和C就能無密碼登錄A.
在A上把鑰匙發給B和C
$scp -p .ssh/id_dsa [email protected]:~/.ssh

3、如何實現從A指定目錄批量分發文件到B,C,用戶的家目錄(借助1題部署結果)考察scp用法
$sh fenfa.sh
4、實現A指定的目錄文件分發到B,C任意目錄下(不用root用戶你會麽)
在客戶端執行命令
#visduo 輸入98gg跳轉到98行
root ALL=(ALL) ALL
bichen ALL=(ALL) NOPASSWD:/usr/bin/rsync
加入bichen用戶
echo “bichen ALL=(ALL) NOPASSWD:/usr/bin/rsync

檢查語法
[root@lamp01 ~]# visudo -c
/etc/sudoers: parsed OK
這樣子的話bichen這個用戶在這個機器上就有root權限可以執行rsync這個命令,前提得用sudo提權。
或者也不用去客戶端,因為通過ssh可以連上客戶機,所以直接執行命令也可以。

在分發機上編輯下面面腳本,$0表示此腳本名稱,$1表示要發送的文件,$2表示要發送到遠端的路徑,先將它拷貝到遠端用戶的家目錄,在使用sudo提權rsync將其拷貝到對應的路徑下。Scp命令後面加&&\表示此命令執行成功後在執行下一條命令。102.虛擬機未開機所以顯示失敗。
技術分享圖片
5、如何快速查看所有機器的負載load,cpu,內存信息(借助問題1)的部署結果。
(思考如果服務器數量多,如何並發查看和分發數據)
[bichen@nfsserver ~]$ vim view_upload.sh

#!/bin/sh

if [ $# -ne 1 ]
then
echo "USAGE:$0 COMMAND"
exit 1
fi
for n in 102 104
do
echo ==========192.168.0.$n====
ssh -p22 [email protected].$n $1
Done
查內存,查負載
[bichen@nfsserver ~]$ sh view_upload.sh uptime
==========192.168.0.102====
Nasty PTR record "192.168.0.102" is set up for 192.168.0.102, ignoring
10:18:50 up 5 min, 1 user, load average: 0.00, 0.07, 0.04
==========192.168.0.104====
10:18:50 up 1:27, 1 user, load average: 0.00, 0.00, 0.00
[bichen@nfsserver ~]$ sh view_upload.sh "free -m"
==========192.168.0.102====
Nasty PTR record "192.168.0.102" is set up for 192.168.0.102, ignoring
total used free shared buffers cached
Mem: 980 331 649 1 39 110
-/+ buffers/cache: 181 799
Swap: 1983 0 1983
==========192.168.0.104====
total used free shared buffers cached
Mem: 980 320 659 1 50 103
-/+ buffers/cache: 166 814
Swap: 1983 0 1983
6、附加題:實現每分鐘定時分發hosts文件到所有機器上,並把分發失敗,沒有分發成功的機器信息以郵件的形式發給運維人員。
技術分享圖片
第一種方案:客戶端使用mail,服務端使用posfix
啟動posfix服務
[root@nfsserver ~]# /etc/init.d/postfix restart
Shutting down postfix: [ OK ]
Starting postfix: [ OK ]
[root@nfsserver ~]# lsof -i :25
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
master 3601 root 12u IPv4 17870 0t0 TCP localhost:smtp (LISTEN)
master 3601 root 13u IPv6 17872 0t0 TCP localhost:smtp (LISTEN)
客戶端mail命令,發郵件格式
mail -s “標題” 郵件地址 <文件
mail -s “bichen”[email protected] </etc/hosts
echo “正文”|mail -s “bichen” [email protected]
發送郵件,結果沒收到免費的郵件會經常收不到會耽擱事,所以要用收費的,或者自己的。
[root@nfsserver ~]# mail -s "bichen" [email protected] </etc/hosts
[root@nfsserver ~]# mailq
Mail queue is empty
我們分發hosts的腳本,將分發結果追加重定向到/tmp/true.log、/tmp/fail.log,如果fail.log
的內容不為空,說明有失敗的,就將fail.log發送到郵箱,最後清空日誌。
#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 2 ]
then
echo "USAGE:$0 FileName RemoteDir"
exit 1
fi

for n in 102 104

do
scp -rp $1 [email protected].$n:~ &>/dev/null&&\
ssh -t [email protected].$n sudo rsync $1 $2 &>/dev/null
if [ $? -eq 0 ]
then
echo "fenfa $1 to $2 192.168.0.$n is ok" >>/tmp/true.log
else
echo "fenfa $1 to $2 192.168.0.$n is false" >>/tmp/fail.log
fi
done
if [ -s "/tmp/fail.log" ]
then
mail -s "$(date +%F\ %T)fenfa host" [email protected]</tmp/fail.log

/tmp/true.log
/tmp/fail.log
fi
然後做定時任務,所有的腳本都放在/server/scripts
#Crontab -u bichen -e 表示在bichen用戶下做定時任務
#fenfa hosts by yankefei at 20170807

          • /bin/sh /server/scripts/fenfa_hosts.sh &>/dev/null
            配置mail使用外部smtp發郵件
            通過修改配置文件可以使用外部smtp服務器,可以到達不使用sendmail等內部郵件服務而用外部的smtp服務器發送郵件目的
            修改/etc/mail.rc最後一行加入
            Set from=
            Smtp=
            Username smtp-auth-password=
            Smtp-auth=login
            7、實現每天晚上00點定時把B,C上的數據備份到A上,並把備份結果信息以郵件的形式發給運維人員。提示備份的目錄要包含ip或主機名
            使用scp寫成腳本做成定時任務
            技術分享圖片
            8、用expect無交互式的批量分發密鑰到B,C即在第一步建立免密碼認證之前分發密鑰就實現非交互批量發布。(如果一千太機器在第一做無密碼認證時,得輸入1000次yes和1000次password)。
            (1)安裝expect
            [root@nfsserver ~]# yum install expect
            [root@nfsserver ~]# which expect
            /usr/bin/expect
            (2創建expect腳本 定義file變量,是我們的公鑰。Host為主機ip。兩個參數
            ,發送yes發送密碼)
            [bichen@nfsserver ~]$ vim fenfa_sshkey.exp
            #!/usr/bin/expect
            if { $argc !=2 } {
            send_user "usage: expect fenfa_sshkey.exp file host\n"
            exit
            }

#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "yankefei"
#spawn scp /etc/hosts [email protected]:/etc/hosts
#spawn scp -P222 $file bichen@$host:$dir
#spawn ssh-copy-id -i $file "-p 222 bichen@$host"
spawn ssh-copy-id -i $file "-p 22 bichen@$host"
expect {
"yes/no" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
expect eof
#expect fenfa_sshkey.exp ~/.ssh id_dsa.pub 192.168.0.104
上面腳本fenfa_sshkey.exp實現了一臺的免人工交互,所以還要在寫個腳本調用此腳本實現多臺非人工交互。
#vi fenfa_key
#!/bin/sh
. /etc/init.d/functions

for ip in 102 103 104

do
#expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub $ip >/dev/null 2>&1
expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.0$ip
if [ $? -eq 0 ];then
antion "$ip" /bin/true
antion "$ip" /bin/false
fi
done

linux批量分發必會面試題,通過郵件反饋結果。