Linux學習筆記(九)——su_sudo_ssh_pdsh命令

一、   su命令

   建議不要使用root賬戶直接登錄系統,主要考慮的是系統安全問題。通常的做法是使用su命令切換到root賬戶,完成需要的工作。如果su命令沒有任何參數,默認登錄的就是root賬戶,輸入密碼後會啓動一個root用戶的進程。su可以使一般用戶擁有超級用戶或其他用戶的權限,也可以使超級用戶以一般用戶的身分執行命令。但一般用戶使用該命令時必須輸入root用戶或其他用戶的口令。執行exit命令退出當前用戶的登陸。

   執行su命令切換到root用戶的PATH環境變量值:

[root@DataNode1  yarn]# echo $PATH

/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yarn/bin

 

   執行su–命令切換到root用戶的PATH環境變量值:

[root@DataNode1  ~]# echo $PATH

/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

 

1.1           su命令的常用方法

   使用su命令切換用戶主要有兩種方式,這兩種方式略有不同,命令格式如下:

   下面這種方式切換用戶後,環境變量不是全部改變,如LOGNAME,登錄用戶名稱,所以不是正真意義上的登錄。

su

su root

su yarn

 

   下面的方式會發生正真的登錄,環境變量全部會更新。

su -

su -l

su --login

su - root

su - yarn

su -l yarn

 

   對於su命令,常用的方式是切換用戶執行某個命令,當命令執行結束後立即返回當前用戶,通常是root用戶切換到其他普通用戶,使用普通用戶的權限執行命令,當命令執行結束後立即返回當前root用戶,原因是root用戶轉換成普通用戶不需要輸入普通用戶的密碼,常在腳本中使用,如下命令格式:

su - yarn -c "cd  /home/yarn ; cp /mnt/hgfs/share/jdk*.gz /home/yarn"

 

   參數-c後面跟着命令,注意:命令要使用雙引號。

二、   sudo命令

   在普通用戶沒有權限執行某個命令時通常的做法是使用su命令切換到root權限完成

   操作但是這樣存在的問題是當多個用戶都使用root權限時存在系統安全問題,很難確定某個用戶的具體操作。另外,在編寫腳本時,如果遇到普通用戶不具備的權限時,就需要使用root用戶的權限,在這種情況下,通過su命令輸入密碼的方式就無法實現了。對於上面兩個問題的解決辦法是使用sudo命令。

2.1           sudo的特點

sudo命令可以使用root用戶或者其他用戶的身份執行命令,但是需要在/etc/sudoers文件中進行配置,此文件只有root用戶有權限進行編輯,如果沒有在/etc/sudoers文件中配置,在使用sudo命令時會提示警告信息,另外要輸入使用sudo命令的用戶的密碼。

[yarn@DataNode1  ~]$ sudo mkdir /usr/local/syslog

 

We trust you have received the usual  lecture from the local System

Administrator. It usually boils down to  these three things:

 

     #1) Respect the privacy of others.

     #2) Think before you type.

     #3) With great power comes great responsibility.

 

[sudo]  password for yarn:

yarn 不在 sudoers 文件中。此事將被報告。

[yarn@DataNode1 ~]$

 

配置sudo命令的使用權限必須編輯/etc/sudoers文件,此文件只有root用戶纔可以修改,並且建議使用visudo命令進行編輯。爲什麼要使用visudo命令進行編輯有兩個原因,一是防止兩個有root權限的用戶同時修改。二是語法檢查。所以建議用visudo命令來編輯/etc/sudoers文件。

root用戶使用visudo命令打開/etc/sudoers文件:

## Allow root to run any commands  anywhere

root    ALL=(ALL)       ALL

 

可以看到root用戶擁有所有的權限,只有將使用sudo命令的用戶添加到下面就可以了,如將yarn用戶添加到配置文件中。

## Allow root to run any commands  anywhere

root    ALL=(ALL)       ALL

yarn    ALL=(ALL)       ALL

 

配置完成後,保存退出,yarn用戶就有了使用sudo命令執行所有命令的權限。

[yarn@DataNode1 ~]$ sudo mkdir /usr/local/syslog

[sudo]  password for yarn:

[yarn@DataNode1 ~]$ cd /usr/local

[yarn@DataNode1 local]$ ls

bin   games    lib      man        sbin    src     vmware-tools-distrib

etc   include  libexec  pdsh-2.26   share  syslog

 

   當然,可以通過配置文件/etc/suduers限制用戶執行sudo命令的權限,如有通過sudo執行某些命令的權限,而不是所有命令的權限,如下設置:用戶yarn只能在NameNode主機上執行mkdir命令和touch命令。

   /etc/sudoers文件只設置創建目錄和創建文件的權限:

## Allow root to run any commands  anywhere

root     ALL=(ALL)       ALL

yarn    NameNode=/bin/mkdir,/bin/touch

 

   下面測試用戶yarn使用sudo命令的權限:

[yarn@NameNode local]$ sudo mkdir /usr/local/syslogs

[sudo]  password for yarn:

[yarn@NameNode local]$ ls

bin   games    libexec  pdsh-2.26   share  syslogs

etc   include  lib          man      sbin       src     vmware-tools-distrib

[yarn@NameNode local]$ sudo touch /usr/local/syslogs/syslog.log

[yarn@NameNode local]$ cd /usr/local/syslogs

[yarn@NameNode  syslogs]$ ls

syslog.log

[yarn@NameNode  syslogs]$ sudo rm -f syslog.log

對不起,用戶 yarn 無權以 root 的身份在 NameNode 上執行 /bin/rm -f syslog.log

 

   sudo命令配置說明,第一列是使用sudo命令的用戶名稱,如果不在此文件中配置就沒有使用sudo命令的權限。第二列是用戶有權使用sudo命令的主機名稱,如果是ALL,說明在所有的主機上都可以使用sudo命令,也可以指定特定的主機,如果要指定多個主機,需要使用逗號分隔。第三列小括號中的ALL代表可以以所有用戶的身份執行命令,也可以指定特定的用戶,如果是多個用戶可以使用逗號分隔。第四列是有權使用sudo命令執行的命令,要使用命令的全路徑,如果不使用全路徑存在安全問題,因爲有同名的腳本,使用root權限執行某個同名的腳本,對系統存在安全隱患。如果是ALL有權執行所有的命令,也可以指定特定的命令,如果是多個命令要使用逗號分隔。

root     ALL=(ALL)       ALL

yarn    NameNode,DataNode1=(hadoop)      /bin/mkdir,/bin/touch

 

   如果就一臺服務器單一的主機,只要配置主機上的/etc/sudoers文件就可以了,如果是集羣,就需要在每個主機上對/etc/sudoers文件進行配置,在特定的主機上用戶可以通過sudo命令執行特定的命令。如果在所有的主機上用戶的權限都相同,只需要在一臺主機上進行配置,然後將此文件拷貝到其他主機上就可以了,可以使用pscp命令,後面的內容會涉及到。

   NameNode主機上配置好的/etc/sudoers文件拷貝到DataNode1主機上。

[root@NameNode  ~]# pdcp -w DataNode1 "/etc/sudoers"  "/etc/sudoers"

 

   另外,sudo命令不可以使用ssh命令直接遠程執行,ssh命令後面的內容會說明,這裏只是簡單的介紹。要先使用ssh命令遠程到要執行sudo命令的主機上,然後在執行sudo命令,如下例子。

[yarn@NameNode  ~]$ ssh DataNode1 "sudo mkdir  /usr/local/syslogs"

sudo:抱歉,您必須擁有一個終端來執行 sudo

[yarn@NameNode ~]$ ssh DataNode1

Last login: Thu Oct 27 11:10:40 2016 from  192.168.230.153

[yarn@DataNode1 ~]$ sudo mkdir  /usr/local/syslogs

[sudo]  password for yarn:

[yarn@DataNode1  ~]$

 

   下面的例子是用戶yarn使用hadoop用戶的身份執行命令,注意:在執行sudo命令是要使用參數-u來指定使用的用戶名稱。

下面的配置是用戶yarnNameNode主機上可以使用hadoop用戶的身份執行指定的命令。

root     ALL=(ALL)       ALL

yarn    NameNode=(hadoop)      /bin/mkdir,/bin/touch

 

   修改配置文件後,yarn用戶只能使用hadoop用戶的身份執行後面設置的命令,下面執行命令:

[yarn@NameNode local]$ sudo mkdir /usr/local/syslogs

[sudo]  password for yarn:

對不起,用戶 yarn 無權以 root 的身份在 NameNode 上執行 /bin/mkdir /usr/local/syslogs

 

   當執行命令時,系統提示警告信息,所以要使用參數-u來執行執行命令的用戶身份,如下方式,但是需要注意的是執行命令創建文件的權限還要受到hadoop用戶的權限限制:

[yarn@NameNode local]$ sudo -u hadoop mkdir /home/hadoop/data

[yarn@NameNode local]$ cd /home/hadoop

-bash:  cd: /home/hadoop: 權限不夠

[yarn@NameNode local]$ su hadoop

密碼:

[hadoop@NameNode local]$ cd /home/hadoop

[hadoop@NameNode ~]$ ls

data

[hadoop@NameNode ~]$

 

   需要注意的是每次執行sudo命令都要使用參數-u來指定用戶身份,默認情況下指定的是root用戶的身份。可以在/etc/sudoers配置文件中進行默認身份用戶設定,設定完成後執行sudo命令時就不需要使用參數-u了,如下設置:

## Allow root to run any commands anywhere

root     ALL=(ALL)       ALL

yarn     NameNode=(hadoop)        /bin/mkdir,/bin/touch

Defaults:yarn  runas_default=hadoop

 

[yarn@NameNode local]$ sudo mkdir /home/hadoop/dir

[sudo]  password for yarn:

[yarn@NameNode local]$ su hadoop

密碼

[hadoop@NameNode  local]$ cd

[hadoop@NameNode ~]$ ll

總用量 8

drwxr-xr-x.  2 hadoop hadoop 4096 10 27 12:08 data

drwxr-xr-x.  2 hadoop hadoop 4096 10 27 12:15 dir

 

   在上面的例子中,每次執行sudo命令都需要輸入執行sudo命令的用戶的密碼,這很不方便,如在腳本中使用某個用戶的身份執行命令時就無法輸入密碼,可以進行配置在執行sudo命令時不需要輸入用戶密碼,需要在配置文件中添加NOPASSWD關鍵字,如下配置:

## Allow root to run any commands  anywhere

root     ALL=(ALL)       ALL

yarn     NameNode=(root) NOPASSWD:       /bin/mkdir,/bin/touch

 

   上面的配置是yarn用戶可以在NameNode主機上使用root用戶的身份執行兩個命令,但是不需要輸入執行sudo命令的用戶yarn的密碼,如下測試。

[yarn@NameNode  ~]$ sudo mkdir /usr/local/syslogs

[yarn@NameNode  ~]$ cd /usr/local

[yarn@NameNode local]$ ls

bin   games    libexec  pdsh-2.26   share  syslogs

etc   include  lib          man      sbin       src     vmware-tools-distrib

 

   需要注意的是,使用visudo命令對/etc/sudoers文件進行配置時,如果語法錯誤保存退出時會有提示信息到控制檯,如下信息:

visudo>>> /etc/sudoerssyntax error 在行 99 附近<<<

現在做什麼?

 

   鍵入e是重新編輯/etc/sudoers文件,鍵入x是不保存退出,鍵入Q是保存並退出。如果語法錯誤沒有修改保存並退出,那麼sudo將不會再運行,直到錯誤被糾正。

  通常情況下用戶執行sudo命令要記錄日誌,用於檢查某個用戶執行了什麼命令在哪臺主機上等信息。但是sudo命令的日誌記錄不是自動創建的,需要root用戶配置並啓動。

  使用root用戶權限在/etc/sudoers文件中進行配置,如下:

## Allow root to run any commands  anywhere

root     ALL=(ALL)       ALL

yarn     NameNode=(root) NOPASSWD:       /bin/mkdir,/bin/touch

##配置sudo命令默認日誌文件

Defaults  logfile=/var/log/sudo

 

  測試日誌文件記錄的sudo命令的執行信息:

[yarn@NameNode local]$ sudo mkdir /usr/local/syslogs

mkdir:  無法創建目錄"/usr/local/syslogs": 文件已存在

[yarn@NameNode local]$ sudo mkdir /usr/local/syslog

...

[root@NameNode log]# cat sudo

Oct  27 14:22:33 : yarn : TTY=pts/0 ; PWD=/usr/local ; USER=root ;

    COMMAND=/bin/mkdir /usr/local/syslogs

Oct  27 14:22:48 : yarn : TTY=pts/0 ; PWD=/usr/local ; USER=root ;

    COMMAND=/bin/mkdir /usr/local/syslog

  

   配置sudo日誌文件後,普通用戶執行的sudo命令都會記錄日誌,root用戶可以查看日誌文件,知道那個用戶執行了什麼命令,主要是爲了系統安全。日誌文件只有root有查看權限。

三、   SSH免認證登錄

SSH(secureshell)是一個系統管理工具,能夠讓用戶訪問遠程計算機上的Shell進程,並且可以執行各種命令,SSH使用加密通道來傳輸網絡數據,使用加密技術確認訪問用戶的身份,並且可以將主機間的通信加密,可以有效防止陌生主機的網絡***。

單機模式下是沒有Hadoop守護進程,所以不需要配置SSH。在僞分佈式和完全分佈式情況下必須啓動Hadoop守護進程,然而啓動Hadoop守護進程的前提是已經成功安裝了SSHHadoop運行過程中需要登錄啓動遠程節點上的Hadoop守護進程,也就是說NameNode是通過SSH來啓動和停止各個DataNode上的各種守護進程的。這就必須在節點之間執行指令的時候無需輸入密碼,因此需要安裝配置SSH,這樣NameNode使用SSH無密碼登錄並啓動其它節點上的DataNode進程。

3.1           安裝SSH工具軟件

   首先檢查系統是否已經安裝下面的軟件,如果沒有安裝,需要進行安裝。

用下面的命令查看系統是否安裝了SSH服務和RSYNC服務

rpm -qa | grep openssh

rpm -qa | grep rsync

    

rsync是遠程數據同步工具,可以同步多臺主機間的文件。

如果沒有安裝兩個服務,採用下面命令安裝,但是安裝需要連接外網。

   安裝命令是:

yum install ssh

yum install rsync

 

3.2           NameNode無密碼登錄DataNode1

   Hadoop啓動階段,NameNode節點需要連接到遠程所有的數據節點DataNode上來啓

動數據節點的守護進程。需要在NameNode上生成一個密鑰對,包括一個公鑰和一個私

鑰,要將公鑰複製到所有的DataNode節點上。當NameNode通過SSH服務連接DataNode

時,DataNode就會生成一個隨機數並用NameNode的公鑰對隨機數進行加密,併發送給

NameNodeNameNode收到加密後的字符串後再用私鑰解密,並將解密後的字符串回傳

DataNodeDataNode確認無誤之後就允許NameNode進行連接了。這就是一個公鑰

認證過程,不需要用戶手工輸入密碼。

3.2.1    NameNode上生成密碼對

   Linux系統上哪個用戶配置SSH無密碼登錄,其他用戶是不能共享的,所以,如果需要多個用戶都實現SSH無密碼登錄遠程機器,那麼這些用戶都有生成密碼對並且進行配置。在我們的例子中,root用戶需要遠程複製安裝軟件,將多臺機器同步安裝配置軟件,所以root用戶需要配置SSH無密碼登錄認證,而啓動Hadoop服務需要使用yarn用戶,所以yarn用戶也需要進行配置SSH無密碼登錄認證。

集羣中所有的節點目錄結構必須相同,具有相同的用戶。注意:使用yarn用戶和root用戶分別生成密碼對,命令如下:

ssh-keygen -t rsa

ssh-keygen  -t rsa -f ~/.ssh/id_rsa

 

   注意:在生成密碼對的過程中,問是否設置密碼和文件生成目錄,直接回車,不設置密碼。使用root用戶和yarn用戶將生成的密碼公鑰複製到要遠程登錄的DataNode上,文件目錄默認。命令如下:

ssh-copy-id  -i /root/.ssh/id_rsa.pub DataNode1

ssh-copy-id  -i /home/yarn/.ssh/id_rsa.pub DataNode1

ssh-copy-id  -i /root/.ssh/id_rsa.pub localhost

ssh-copy-id  -i /home/yarn/.ssh/id_rsa.pub localhost

 

   注意:將生成的公鑰複製到數據節點上需要對/etc/hosts文件進行配置,將所有的數據節點的ip和主機名按行進行配置,需要root用戶權限,命令如下:

vi  /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4  localhost4.localdomain4

::1         localhost localhost.localdomain  localhost6 localhost6.localdomain6

 

192.168.230.153  NameNode

192.168.230.154  DataNode1

 

   還可以採用下面的方式,但是沒有上面的方式簡潔。

ssh-keygen  -t rsa -f ~/.ssh/id_rsa

scp  ~/.ssh/id_rsa.pub [email protected]:~/

cat  ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

chmod  600 ~/.ssh/authorized_keys

chmod  700 ~/.ssh

 

3.3           SSH遠程常用方法

3.3.1    連接到遠程主機

   可以通過ssh命令遠程到其他主機,前提是配置了SSH無密碼認證,通過下面的命令直接遠程到其他主機上進行命令操作。ssh命令後面可以跟IP地址或者主機名稱,但是主機名稱和IP的對應需要在/etc/hosts文件中進行配置。

[root@NameNode  local]#  ssh DataNode1

Last  login: Wed Oct 26 17:55:44 2016 from 192.168.230.153

[root@DataNode1 ~]# pwd

/root

[yarn@NameNode local]$ ssh DataNode1

Last  login: Wed Oct 26 18:28:38 2016 from 192.168.230.1

[yarn@DataNode1  ~]$ pwd

/home/yarn

[root@NameNode  local]# ssh [email protected]

Last  login: Wed Oct 26 19:39:38 2016 from 192.168.230.153

[root@NameNode  local]# ssh root@DataNode1

Last  login: Wed Oct 26 19:49:01 2016 from 192.168.230.153

[root@NameNode  local]# ssh yarn@DataNode1

yarn@datanode1's password:

 

   通過ssh命令遠程其他主機,一旦認證成功,將會爲用戶返回一個shell連接。

3.3.2    SSH服務的默認端口號

SSH服務器默認在端口22上運行。如果SSH服務器指定的是其他的端口號。可以使用-p參數進行指定端口號,如下方式。

[root@NameNode  local]# ssh DataNode1 -p 22

Last login: Wed Oct 26 19:49:29 2016 from  192.168.230.153

[root@DataNode1 ~]#

  

3.3.3    在當前主機執行遠程命令

   可以在當前主機中執行遠程命令,命令格式如下:

ssh 主機名 | root@主機名 | root@IP "命令"

ssh 主機名 | yarn@主機名 | yarn@IP "命令"

 

   如下例子:

[root@NameNode local]# ssh DataNode1 "echo OK"

OK

[root@NameNode local]# ssh DataNode1 "echo $USER"

yarn

[root@NameNode  local]#

 

   如果想要在遠程機器上一次執行多條命令,命令要用分號分隔,注意:命令要使用雙引號,如下例子:

[root@NameNode  local]# ssh DataNode1 "cd  /home/yarn ; mkdir logs ; cd logs ; touch syslog.log"

[root@NameNode  local]# ssh DataNode1 "cd  /home/yarn ; rm -rf logs"

[root@NameNode  local]#

 

3.3.4    在腳本中使用SSH

   可以在腳本中使用ssh命令,如:在集羣中所有的機器上創建日誌目錄,並在目錄中創建日誌文件,首先,我們先創建一配置文件,用來保存集羣中所有的主機名稱或IP地址。

   主機配置文件hosts,文件內容如下,注意:每個主機名稱佔用一行。

NameNode

DataNode1

 

   腳本createLogs.sh

#!/bin/bash

# 使用ssh命令爲所有的主機創建日誌文件

for  line in `cat hosts`

do

   echo "開始爲主機:$line創建日誌目錄和日誌文件..."

   ssh $line "cd /usr/local ; mkdir logs  ; cd logs ; touch syslog.log"

done

~

  

   腳本執行會使用ssh命令遠程創建目錄和文件。

四、   pdsh概述

   以搭建一個Hadoop集羣爲例,通常情況下多臺機器具有有同樣的配置,同樣的目錄結構,如:JDK的安裝目錄和環境變量配置文件,Hadoop的安裝目錄和配置文件。通過手工配置效率較低。

pdsh是一個開源的工具,可以在多個遠程機器上並行執行命令,pdsh的全稱是paralleldistributed shell(並行的分佈式Shell)pdsh主要用於大批量服務器的配置、部署、文件複製等操作。在使用pdsh遠程操作時,需要配置本地主機和遠程主機間的ssh無密碼登錄服務。另外,pdsh還附帶了pdcp命令,此命令可以將本地文件批量複製到遠程的多臺主機上,在搭建集羣環境時是非常有用。

pdsh可以通過多種方式在遠程主機上運行命令,默認是rsh方式,另外也支持sshmrshqshmqshkrb4xcpu等多種rcmd模塊,這個可以在運行命令時通過參數指定。我們指定ssh服務爲遠程登錄服務。

4.1           pdsh安裝

   我們還是將pdsh工具安裝到/usr/local目錄下,當然也可以是其他目錄,如果/opt目錄等等。首先將pdsh安裝包pdsh-2.26.tar.bz2從共享文件夾拷貝到/usr/local目錄下,注意:拷貝安裝過程必須使用root用戶權限。

cd /usr/local

su

cp /mnt/hgfs/share/pdsh/pdsh-2.26.tar.bz2  .

 

   使用root權限在/usr/local目錄下解壓文件:

tar -jxvf pdsh-2.26.tar.bz2

 

   解壓完成後,生成一個目錄pdsh-2.26,進入目錄中,分別指向下面三條命令,注意:安裝pdsh工具軟件需要使用c編譯器gcc,如果沒有安裝,pdsh不能安裝成功,需要首先安裝gcc編譯器。

   檢查系統是否安裝了gcc編譯器:

[yarn@NameNode ~]$ rpm -qa | grep gcc

gcc-4.4.7-17.el6.i686

libgcc-4.4.7-17.el6.i686

 

   如果沒有安裝gcc-4.4.7-17.el6.i686要首先安裝,安裝過程需要外網,安裝命令如下:

yum install gcc

 

   安裝過程需要幾分鐘時間,直到命令行提示符出現,可以在執行上面的rpm命令檢查是否安裝成功。gcc安裝成功後,就可以安裝pdsh工具軟件了,按照下面的命令順序執行。

cd pdsh-2.26

./configure --with-ssh --without-rsh  --with-machines=/etc/pdsh/machines

make

make install

 

在執行configure腳本時,“--with-ssh”參數表示啓用ssh模塊,而“--with-dshgroups”表示啓用主機組支持,啓用此參數後,就可以將一組主機列表寫入一個文件並放到~/.dsh/group/etc/dsh/group目錄下,然後通過pdsh“-g”參數進行調用。最後的參數“--with-machines”“--with-dshgroups”參數的擴展,通過將所有要管理的主機列表都寫入指定的/etc/pdsh/machines文件中,接着通過pdsh“-a”參數調用,最終完成所有主機的便捷管理。

 

   檢測是否安裝成功,使用下面的命令。

pdsh -v

 

   如果顯示使用信息,說明安裝成功。

4.2           pdsh基本命令

4.2.1    pdsh命令

   在一個集羣中,從一臺主機上可以通過ssh命令遠程到其他主機上執行命令,如果集羣機器很多,可以通過在腳本中使用ssh命令的方式執行,但是ssh命令還是有侷限的,如一臺機器執行結束後另一臺機器才能開始執行,而pdsh命令可以並行在多臺機器上同時執行相同的命令,當然pdsh底層使用的還是ssh或其他的遠程方式,如rsh等等。

   pdsh命令格式:

pdsh [-參數選項] 命令

 

   下面將pdsh命令常用參數進行舉例說明。

   參數-h:顯示pdsh命令的使用說明:

[yarn@NameNode  ~]$ pdsh -h

Usage:  pdsh [-options] command ...

-S                return largest of remote  command return values

-h                output usage menu and quit

-V                output version information  and quit

-q                list the option settings and  quit

-b                disable ^C status feature  (batch mode)

-d                enable extra debug information  from ^C status

-l  user           execute remote commands  as user

-t  seconds        set connect timeout  (default is 10 sec)

-u  seconds        set command timeout (no  default)

-f  n              use fanout of n nodes

-w host,host,...  set  target node list on command line

-x  host,host,...  set node exclusion list  on command line

-R  name           set rcmd module to name

-M  name,...       select one or more misc  modules to initialize first

-N                disable hostname: labels on  output lines

-L                list info on all loaded modules and  exit

-g  groupname      target hosts in dsh  group "groupname"

-X  groupname      exclude hosts in dsh  group "groupname"

-a                target all nodes

available  rcmd modules: ssh,exec (default: ssh)

 

   參數-w指定要執行的遠程主機,可以指定多個,每個主機用逗號隔開,可以是主機名也可以是IP地址。

[yarn@NameNode  ~]$ pdsh -w NameNode,DataNode1  "cd /home/yarn ; mkdir data"

[yarn@NameNode  ~]$ pdsh -w 192.168.230.153,192.168.230.154 "cd /home/yarn ; mkdir  data"

 

   通常的做法是,將主機名稱配置到文件中,因爲主機很多的情況下,採用上面的方式命令會很長。上面的命令方式適合對單一的遠程主機進行操作。下面採用配置文件的方式實現上面命令的功能。

   主機配置文件hosts

NameNode

DataNode1

 

   或者採用主機IP地址的方式:

192.168.230.153

192.168.230.154

 

   注意:將hosts文件放在執行pdsh命令的目錄下,如:在/home/yarn目錄下創建一個目錄job,將hosts文件拷貝到job目錄下,在job目錄下執行pdsh命令。

pdsh -w ^hosts "cd /home/yarn ; mkdir data"

   

   查看主機上的IP和主機名稱:

[yarn@NameNode  job]$ pdsh -w ^hosts "echo  $HOSTNAME"

192.168.230.153: NameNode

192.168.230.154: NameNode

[yarn@NameNode  job]$

 

   參數-R指定遠程工具名稱,pdsh默認是rsh,我們在安裝pdsh時已經重新指定了ssh,當然可以使用-R參數重新指定。

pdsh -w ^hosts -R  ssh "cd /home/yarn ; mkdir data"

 

   參數-a:通過-a參數可以指定所有的遠程主機,在pdsh命令中使用此參數,pdsh默認會查看/etc/pdsh/目錄下的machines文件中的主機列表,目錄名稱和文件名稱在執行configure腳本時可以修改,通過“--with-machines”參數進行指定。

./configure --with-ssh --without-rsh --with-machines=/etc/pdsh/machines

 

   我們就以默認情況舉例,首先使用root用戶權限在/etc目錄下創建pdsh目錄,在此目錄下創建文件machines文件,文件中是主機名稱,一行一個,也可以使用IP地址,保存後退出。

su

cd /etc

mkdir pdsh

cd pdsh

vi machines

NameNode

DataNode1

:wq

 

   執行pdsh命令:

[yarn@NameNode  ~]$ pdsh -a "cd /home/yarn ;  touch pdsh"

  

   命令執行後會在兩個主機上創建文件pdsh,當使用-a參數時,就不需要使用-w參數,系統會從/etc/pdsh目錄下讀取machines文件中的主機名稱執行命令。

 

   參數-x 此參數和-w參數功能正好相反,用來指定不執行命令的多個或單個主機,使用方式如-w參數。

   採用主機名稱的方式,NameNode主機執行命令,DataNode1主機不執行命令:

[yarn@NameNode  ~]$ pdsh -w NameNode -x DataNode1 "cd  /home/yarn ; touch syslogs"

 

   如果要是有多個主機執行命令,多個主機除外,可以採用配置文件的形式,還是上面的例子,將NameNode寫入hosts1文件,DataNode1寫入hosts2文件,以下面的方式執行。

[yarn@NameNode job]$ echo NameNode > hosts1

[yarn@NameNode job]$ echo DataNode1 > hosts2

[yarn@NameNode  job]$ cat hosts1

NameNode

[yarn@NameNode  job]$ pdsh -w ^hosts1 -x ^hosts2  "cd /home/yarn ; touch file"

 

4.2.2    pdcp命令

   如果配置整個集羣,要求所有的機器安裝相同的軟件,如果逐一拷貝效率較低,通常的做法是將所有要安裝的軟件拷貝到一臺主機上,通過pdcp命令同步拷貝到其他機器上。pdcp命令格式:

pdcp [-參數] “源文件1 [源文件2...]  目標

 

   下面將pdcp命令常用參數進行舉例說明,參數的用法和pdsh命令大多相同。

   參數-w指定要拷貝文件的遠程主機,多個主機用逗號隔開,可以是主機名也可以是IP地址。

[yarn@NameNode  ~]$ pdcp -w DataNode2 "syslogs" "/home/yarn"

 

   也可以將主機名稱或IP寫入到一個配置文件,使用方式如pdsh命令。

[yarn@NameNode  ~]$ pdcp -w ^hosts "syslogs" "/home/yarn"

 

   如果拷貝的是一個目錄,需要加上參數-r

[yarn@NameNode  ~]$ pdcp -w ^hosts -r  "job" "/home/yarn"

 

   需要注意的是,pdcp命令後面是兩個或多個參數,要用空格分隔,建議將參數使用雙引號。

   參數-x-w正好相反,用法與pdsh命令相同。

$ pdcp  -w DataNode2 -x NameNode "job/hosts1"  "job/hosts2" "/home/yarn"

 

   參數-a的用法與pdsh命令相同,要在/etc/pdsh/machines文件中配置主機名稱或IP地址,因爲pdcp命令會讀取此文件的主機信息。

[yarn@NameNode  ~]$ pdcp -a "sys"  "/home/yarn"

 

4.2.3    使用pdsh工具爲集羣所有的主機安裝配置JDK

   首先要在所有的主機上安裝pdsh工具軟件,如果只使用pdsh命令,其他主機不需要安裝pdsh軟件,但是pdcp命令需要目標主機也安裝pdsh軟件才能拷貝成功。下面的例子是集羣安裝JDK並配置環境變量。

   首先將JDK安裝包拷貝到NameNode主機上,因爲JDK要安裝在/usr/local目錄下,這個目錄只有root用戶採用權限,所以腳本的執行者是root用戶,這是通用的做法。在root用戶的工作目錄/root下創建一個目錄job,將JDK安裝包和腳本文件都放置在這個目錄下,同樣,主機名稱配置文件也放置在這個目錄下。

# yarn用戶登錄,然後切換成root用戶

su

# 進入到root用戶的工作目錄

cd  /root

# 創建job目錄

mkdir  job

# 進入到job目錄

cd job

# JDK文件拷貝到當前目錄

cp  /mnt/hgfs/share/jdk*.gz .

# 編輯主機配置文件

vi hosts

NameNode

DataNode1

:wq

# 編輯執行腳本

vi  install_jdk.sh

 

   install_jdk.sh腳本:

#!/bin/bash

# NameNode主機上執行的腳本,將JDK安裝包先拷貝到各個數據節點上的/usr/local目錄下

# 然後在各節點使用tar命令安裝JDK,安裝完成將JDK安裝包刪除,然後在/etc/prfile.d目錄下配置JDK環境變量

# 安裝配置完成後,執行

jdk="jdk-8u51-linux-i586.tar.gz"

jdkpath="/usr/local"

JAVA_HOME="$jdkpath/jdk1.8.0_51"

JRE_HOME="$jdkpath/jdk1.8.0_51/jre"

 

echo "刪除JDK相關軟件包..."

pdsh -w ^hosts "rpm -e --nodeps  tzdata-java-2012j-1.el6.noarch" 2>/dev/null

pdsh -w ^hosts "rpm -e --nodeps  java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.i686" 2>/dev/null

pdsh -w ^hosts "rpm -e --nodeps  java-1.7.0-openjdk-1.7.0.9-2.3.4.1.el6_3.i686" 2>dev/null

echo "拷貝$jdk到數據節點..."

pdcp -w ^hosts $jdk $jdkpath

echo "在各節點安裝$jdk..."

pdsh -w ^hosts "tar -xzf $jdkpath/$jdk -C  $jdkpath/"

echo "刪除各節點上的$jdk安裝包..."

pdsh -w ^hosts "rm -f $jdkpath/$jdk"

echo "配置JDK環境變量..."

pdsh -w ^hosts "echo export  JAVA_HOME=$jdkpath/jdk1.8.0_51 >> /etc/profile.d/java.sh"

pdsh -w ^hosts "echo export  JRE_HOME=$jdkpath/jdk1.8.0_51/jre >> /etc/profile.d/java.sh"

pdsh -w ^hosts "echo export  PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH >> /etc/profile.d/java.sh"

pdsh -w ^hosts "echo export  CLASS_PATH=.:$JAVA_HOME/lib:$JRE_HOME/lib >>  /etc/profile.d/java.sh"

pdsh -w ^hosts "source  /etc/profile.d/java.sh"

 

   需求:將NameNode主機和DataNode1主機上的JDK卸載,環境變量文件刪除。

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章