Linux学习笔记(九)——su_sudo_ssh_pdsh命令

时间:2016-10-31 14:34:13   收藏:0   阅读:2262

一、   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 root@192.168.230.154:~/

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 root@192.168.230.154

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卸载,环境变量文件删除。

 

 


本文出自 “kevin.blog” 博客,请务必保留此出处http://dongkevin.blog.51cto.com/12103298/1867443

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!