`
isiqi
  • 浏览: 16492062 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

灵活使用ssh、dsh和pssh高效管理大量计算机

阅读更多

http://os.51cto.com/art/201012/240113.htm

灵活使用ssh、dsh和pssh高效管理大量计算机

http://os.51cto.com 2010-12-23 09:46 Martin Streicher IBMDW 我要评论(0 )
  • 摘要: 云计算当前非常热门,但是每个计算云都有一项要求:硬件和软件都需要非常细心地维护。本文介绍如何从命令行通过ssh、dsh和pssh工具管理许多计算机。
  • 标签: UNIX SSH

云在根本上是由硬件和软件组成的,这些组件需要经常细心地维护。出现故障的硬件需要修理或更换;软件需要应用补丁、更新和升级;必须根据需求和潜在的安全威胁提前配置系统。应用程序开发人员可能觉得计算云很方便、很灵活,但是云管理员要应对艰巨的任务。

不只是云的管理有这些问题。LAN(小型服务器群)和计算集群也有同样的系统管理难题。在管理大量计算机时,Secure Shell (ssh)、scp sftp 等常用工具用起来非常麻烦。本期 对话 UNIX 讨论从命令行有效地管理大量计算机的技术,先从少量系统开始,然后扩大规模。

强力方式

在一组计算机上运行命令的简单方法是,把共用的 ssh 命令包装在脚本中。假设您已经把公共密钥分发到希望访问的每个远程系统上(避免每次都需要输入密码),脚本 mssh.sh 在指定的每台计算机上运行一个命令,最后输出收集的结果(见 清单 1)。


清单 1. mssh.sh

#!/bin/bash

# Usage: mssh.sh "machine1 [machine2...]" "command"



OUTPUT_LOG=/tmp/output-$$.log

ERROR_LOG=/tmp/error-$$.log

MACHINES=$1; shift

COMMAND=$2; shift



for machine in $MACHINES

do

ssh $machine $COMMAND >>$OUTPUT_LOG.$machine 2>>$ERROR_LOG.$machine &

done



wait



cat $OUTPUT_LOG.*

cat $ERROR_LOG.* >&2

rm -f $OUTPUT_LOG.* $ERROR_LOG.*

例如,命令 mssh.sh "example.com joe@sample.com" "uptime -a"> 在两台主机(example.com 和 sample.com)上运行 uptime -a 。计算机名列表放在引号中以组成一个参数,由于同样的原因,命令也放在引号中。每个计算机名必须符合 ssh 要求的模式 — 如果远程用户名与本地用户名相同,那么使用 hostname ;如果远程用户名与本地用户名不同,那么使用 username@hostname 。运行 mssh.sh "example.com joe@sample.com" "uptime -a"> 会产生这样的结果:

$ mssh.sh "example.com joe@sample.com" "uptime"

example.com

08:34:35 up 66 days, 17:29, 0 users, load average: 0.40, 0.19, 0.07

joe@sample.com

08:34:28 up 104 days, 10:18, 0 users, load average: 0.15, 0.10, 0.10

这个脚本很原始,但是可以通过扩展它包含其他特性,比如用可调的超时设置防止在主机停机时出现长时间延迟(ssh -o 选项),用指定的目录捕捉输出。实际上,有许多按这种方式构建的软件包,可以简化分布式系统管理。其中之一是 Distributed Shell (dsh)。

更好的工具

dsh 是专为在远程系统上运行 shell 命令设计的,可以简化对大量计算机的操作。可以获取这个 shell 的二进制代码和源代码。对于二进制代码,检查您的 Linux® 或 UNIX® 发行版是否有 libdshconfig dsh 包。例如,Ubuntu 和 Debian 用户可以通过 apt-get 方便地安装 dsh:

$ sudo apt-get install libdshconfig1 libdshconfig1-dev dsh

如果找不到针对您的系统预构建的包,从源代码构建 dsh 也很容易。找到库和实用程序的最新版本,下载并解压两个压缩文件,用通常的 ./configure; make; sudo make install 命令构建和安装它们(见 清单 2)。


清单 2. 从源代码构建 dsh

$ # Build and install the library first

$ wget http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.13.tar.gz

$ tar xzvf libdshconfig-0.20.13.tar.gz

$ cd libshconfig-0.20.13

$ ./configure

$ make

$ sudo make install



$ # Then build and install the utility

$ wget http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.25.9.tar.gz

$ tar xzvf dsh-0.25.9.tar.gz

$ cd dsh-0.25.9

$ ./configure

$ make

$ sudo make install

这个 shell 是相当小的应用程序;dsh dsh.conf 手册页提供掌握它所需的所有信息。例如,要想在一组主机上运行 uptime ,只需输入:

$ dsh --show-machine-names -m example.com -m joe@sample.com -- uptime

example.com: 11:34:57 up 66 days, 20:29, 0 users, load average: 0.04, 0.06, 0.01

joe@sample.com: 11:35 up 2 days, 14:59, 8 users, load averages: 0.46 0.35 0.31

-m 指定主机,主机名的规则与 ssh 相同。命令行中的双连字符把 dsh 命令本身的选项与要运行的命令分隔开。按指定主机的次序显示输出。--show-machine-names 选项在远程命令发出的输出前面加上主机名。

如果经常操作同一组计算机,可以定义一个或多个集合并指定要操作的集合。可以创建一个全局集合和任意数量的组。$HOME/.dsh/machines.list 文件是全局集合。如果指定 dsh -a ,就会在 machines.list 中列出的所有计算机上运行指定的命令。因此,如果 machines.list 包含:

example.com

joe@sample.com

那么命令:

dsh -a --show-machine-names -- uptime

会产生与前一个命令相同的输出:

$ dsh -a --show-machine-names -- uptime

example.com: 11:57:03 up 66 days, 20:51, 0 users, load average: 0.29, 0.18, 0.07

joe@sample.com: 11:57 up 2 days, 15:21, 8 users, load averages: 0.52 0.31 0.26

可以在 $HOME/.dsh/group/groupname 文件中创建更小或专门的计算机集合,其中的 groupname 是您指定的有意义的名称。例如,如果创建名为 $HOME/.dsh/group/servers 的文件,那么命令 dsh -g servers -- uptime 会在 servers 文件中列出的所有计算机上运行 uptime

可以结合使用 -m -a -g ,分别扩展全局列表和组。另外,可以使用 --file filename filename 中列出的所有计算机添加到主机列表中。在默认情况下,dsh 并行地运行命令。但是,如果希望顺序地运行命令,那么指定 --wait-shell

尽管很方便,但是 dsh 有一个重大的缺陷:它无法复制文件。如果希望把数据部署到多台计算机上,就必须编写一个新脚本,利用发行版的基础设施(比如 rsync ),或者考虑使用更健壮的工具(比如 Parallel SSH (pssh))。

与 ssh 相似,但采用并行方式

与 dsh 一样,pssh 的目标也是简化大量计算机的管理。除了具备 dsh 的所有功能之外,pssh 还可以把文件从一组系统复制到中心服务器或反向复制,以及杀死一组系统上的进程。这个 shell 和它的底层库是用 Python 编写的,如果系统上已经安装了 Python 解释器和核心库,就很容易安装它(见 清单 3)。


清单 3. 安装 pssh

$ # For systems with apt-get (apt-get installs Python if necessary)

$ sudo apt-get install pssh



$ # For all others, install Python and then continue

$ wget http://peak.telecommunity.com/dist/ez_setup.py

$ sudo python ez_setup.py

$ wget http://parallel-ssh.googlecode.com/files/pssh-2.1.1.tar.gz

$ tar xzvf pssh-2.1.1.tar.gz

$ cd pssh-2.1.1

$ sudo python setup.py install

pssh 包安装 5 个实用程序:parallel-ssh parallel-scp parallel-slurp parallel-nuke parallel-rsync 。每个实用程序都并行地操作多个主机。

  • parallel-ssh 在多个主机上并行地运行命令。
  • parallel-scp 把文件并行地复制到多个主机上。
  • parallel-rsync 通过 rsync 协议把文件高效地并行复制到多个主机上。
  • parallel-slurp 把文件并行地从多个远程主机复制到中心主机上。
  • parallel-nuke 并行地在多个远程主机上杀死进程。

与 dsh 不同,pssh 总是通过清单 文件指定主机,其中的每行采用 host[:port] [user] 形式。下面的示例用 parallel-ssh 在一组主机上运行 uptime

$ parallel-ssh -h servers.txt uptime

[1] 16:15:14 [SUCCESS] example.com 22

16:15 up 2 days, 19:39, 9 users, load averages: 0.09 0.10 0.12

[2] 16:15:28 [SUCCESS] sample.com 22

16:15:28 up 67 days, 1:09, 0 users, load average: 0.09, 0.07, 0.01

servers.txt 文件有两行:

example.com

sample.com joe

在默认情况下,每个命令实例的输出出现在 stdout 中。输出划分为每个主机一段。但是,可以指定一个目录来捕捉每个实例的输出。例如,如果运行前面的命令并添加 --outdir /tmp/uptime ,那么会把每个主机的命令输出捕捉到 /tmp/uptime 中单独的文件中,见 清单 4。


清单 4. 把输出捕捉到单独的文件中

$ parallel-ssh -h servers.txt uptime

[1] 16:15:14 [SUCCESS] example.com 22

[2] 16:15:28 [SUCCESS] sample.com 22



$ ls -1 /tmp/uptime

example.com

sample.com



$ cat /tmp/uptime/*

16:22 up 2 days, 19:46, 9 users, load averages: 0.47 0.28 0.19

16:22:32 up 67 days, 1:17, 0 users, load average: 0.06, 0.04, 0.00

parallel-ssh 实用程序可以生成最多 32 个进程,并行地连接各个节点。如果远程命令在 60 秒内没有完成,连接会终止。如果命令需要更多处理时间,可以使用 -t 设置更长的到期时间。(parallel-scp parallel-rsync 没有默认的到期时间,但是可以用 -t 指定到期时间。)

可以使用 parallel-scp 并行地把一个或多个文件或目录复制到许多计算机。如果您精通传统的 scp ,应该熟悉这个命令。

$ parallel-scp -h servers.txt /etc/hosts /tmp/hosts

[1] 16:49:38 [SUCCESS] example.com 22

[2] 16:49:55 [SUCCESS] sample.com 22

前面的命令把本地文件 /etc/hosts 复制到 servers.txt 中列出的每台计算机上的 /tmp/hosts。parallel-rsync 的工作方式相似,它通过运行 rsync 并行地在本地主机和清单中列出的远程主机之间管理文件。parallel-slurp 的作用与 parallel-scp 相反,但是有一点不同:它从每台远程计算机收集指定的文件,但是并不覆盖文件的本地版本。parallel-slurp 为每台远程计算机创建一个子目录并把指定的文件复制到此位置。

假设希望把 /etc/hosts 文件从每台远程计算机复制到本地计算机。为实现这个目标,执行 parallel-slurp -h servers.txt /etc/hosts ,见 清单 5。


清单 5. 把 /etc/hosts 文件从远程计算机复制到本地计算机

$ parallel-slurp -h servers.txt -L /tmp/hosts /etc/hosts hosts_file

1] 17:03:32 [SUCCESS] example.com 22

[2] 17:03:50 [SUCCESS] dcauto.gotdns.com 22



$ ls -R /tmp/hosts

/tmp/hosts/example.com:

hosts_file



/tmp/hosts/sample.com:

hosts_file

parallel-slurp 把指定的远程文件复制到本地计算机,把文件的每个拷贝存储在按远程主机命名的子目录中。在这里,远程文件是 /etc/hosts;每个本地拷贝名为 hosts_file-L 选项指定创建子目录的位置。在这里,目标是 /tmp/hosts,这会生成子目录 /tmp/hosts/example.com 和 /tmp/hosts/sample.com。

最后,parallel-nuke 相当于运行 ssh host killall parallel-nuke 的参数是一个模式。在远程计算机上运行的名称符合这个模式的所有进程都被杀死。可以用此命令方便地在一组服务器上停止同一守护进程。

要想使用 pssh 工具,必须在要管理的每台远程服务器上配置公共密钥访问。如果 pssh 实用程序产生 [FAILURE] ,就用一般的 ssh 建立连接以检查配置。如果系统提示输入密码,那么在远程主机上安装公共密钥并再次尝试连接。(具体步骤见 ssh ssh-keygen 手册页。)

操作大量计算机的其他工具

对于 5 台、10 台或更多计算机,这里介绍的工具很可能足够了,尤其是对于不经常执行的非重复性管理任务。但是,如果计算机数量很大,或者经常重复执行相同的任务,那么应 该谨慎地考虑采用为自动维护大量计算机而设计的其他工具和子系统。另一方面,为大型网络设计的一些软件也可以应用于少量计算机。找到适当的工具以及手工干 预与自动化之间的平衡点是一个难题,而且需要经常重新审查和调整。

下面是可以考虑采用的一些工具:

  • rsync :这个出色的工具用于从中心服务器分发文件以及保持分布式文件系统同步。前面的一期对话 UNIX 详细讨论了 rsync
  • Puppet 。Puppet 是一个越来越流行的 UNIX 和 Linux 子系统,它可以自动地维护配置。根据它的网站所说,“[Puppet] 提供一个强大的框架,可以简化 [系统管理员] 需要执行的大多数技术任务。可以用 Puppet 的定制语言编写各种任务,可以像其他代码一样共享这些任务代码。” Puppet 可以描述组件之间的依赖关系、定义文件的正确状态、查询系统的状态等等。如果要多次执行某一任务,最好以 Puppet 任务的形式捕捉它。
  • Capistrano 。Capistrano 是另一个流行的远程系统管理工具。它的主页上说:“简单地说,Capistrano 用于在一个或多个远程服务器上自动地执行任务。它在所有目标计算机上并行地执行命令,还提供在多台计算机上回退修改的机制。它非常适合任何人执行任何系统 管理任务,包括专业的系统管理员和偶尔执行系统管理的人员。” 与 Puppet 相同,Capistrano 采用脚本编程。脚本基于 Ruby 编程语言和 Capistrano 的域相关语言。下面是一个示例:
    task :search_libs, :hosts => "www.capify.org" do

    run "ls -x1 /usr/lib | grep -i xml"

    end


    此任务名为 search_libs 。它连接 www.capify.org 并运行命令 ls -x1 /usr/lib | grep -i xml 。Capistrano 通过角色 支持计算机组,还提供许多其他特性。通过 cap 命令启动任务,比如 cap search_libs 。Ruby 和 Rails 开发人员广泛采用 Capistrano 把代码部署到服务器,但是对于自动执行大多数分布式系统管理任务,它也是非常好的工具。一些教程解释了如何结合使用 Capistrano 与 Java™ 语言、Perl、Python 和其他编程语言,以及如何结合使用 Capistrano 与 Drupal and Expression Engine 等应用程序引擎。如果与源代码控制系统结合使用,Capistrano 的效果最好,但这不是必需的。可以通过 put 操作分发二进制代码。

  • Nagios 。维护很重要,但是监视也很重要。停机和错误会在网络上造成严重破坏,尤其是在许多系统采用相同配置的情况下。Nagios 是一个开放源码监视程序,它可以监视服务器、服务、资源等。它的安装和部署很容易,可以通过任何 web 浏览器使用它。

还可以研究 Oak Ridge National Laboratory (ORNL) 的 Cluster Command and Control (C3) 和 pdsh 等计算集群工具。C3 操作 ORNL 的大规模计算集群,它提供大量命令行工具,可以减少操作和管理集群所需的时间和精力,提高系统管理员的生产力。pdsh shell 在许多方面与 pssh 相似,但是还可以管理系统映像。

用很少的时间管理大量计算机

使用 dsh 和 pssh 等工具能够节省时间并减少错误。可以在大量系统上运行相同的命令,几乎马上会看到组合的结果。通过清单把相似的计算机集中在一起可以降低遗漏的风险。 Puppet 和 Capistrano 可以把经常重复执行的任务捕捉到脚本中。如果管理的计算机比较多,自动化就是关键。总之,如果采用适当的工具,计算云的管理也不难。

原文:http://www.ibm.com/developerworks/cn/aix/library/au-spunix_remoteserver/index.html?ca=drs-

【编辑推荐】

  1. 25个必须记住的SSH命令,你用过了吗?
  2. 通过SSH访问远程Linux服务器的四个安全策略
  3. 开源自动化配置管理工具Puppet入门教程
  4. Linux远程备份工具Rsync使用案例
分享到:
评论

相关推荐

    dsh (the distributed shell)-开源

    分布式shell(dsh)是一个高效且实用的开源工具,专为在多台计算机上并行执行命令而设计。它的出现极大地简化了系统管理员的工作,尤其是在管理和维护beowulf类型的分布式计算集群时。dsh允许用户通过单一的命令行...

    《基于STM32和LIS3DSH的高精度计步器设计》_LIS3DSH_2016_核心.pdf

    本文介绍了一种基于STM32微控制器和LIS3DSH加速度传感器的高精度计步器设计方法。文章首先回顾了传统计步器设计的历史与局限性,然后详细阐述了高精度计步器的设计原理、硬件电路结构及软件算法实现。以下是根据文档...

    LIS3驱动.rar_LIS3DSH 数据_LIS3DSH驱动_LIS驱动_lis3dsh hal驱动_lis3dsh驱动代码

    LIS3DSH的驱动库(已生成BIN文件)和官方英文数据手册资料

    LIS3DSH加速度传感器芯片资料

    - 这意味着LIS3DSH可以在不同类型的电子设备中灵活使用,具有广泛的兼容性。 2. **独立的I/O电源**:支持1.8V的独立输入输出(I/O)电源,并且与主电源电压兼容。 - 此特性使得LIS3DSH能够在不同的电压环境下正常...

    LIS3DSH.rar_lis3dsh_simple_stm32f4

    标题中的"LIS3DSH.rar_lis3dsh_simple_stm32f4"表明这是一个与LIS3DSH三轴加速度传感器相关的项目,它使用了简单的SPI(Serial Peripheral Interface)驱动,并且是针对STM32F4系列微控制器的。这个项目可能包含了...

    STM32例程Tutorial 27 - Motion 3-Axis Accelerometer LIS3DSH.7z

    在硬件连接部分,LIS3DSH的SDA和SCL(对于I2C)或SCK、MISO、MOSI和CS(对于SPI)需要连接到STM32的相应引脚。同时,不要忘记连接电源和地线,确保正确供电和接地。 接下来,软件部分涉及STM32的固件开发。你可能...

    lis3dsh_STdC.zip

    1. **高精度和灵敏度**:LIS3DSH可以提供±2g、±4g、±8g和±16g的可选量程,满足不同应用的需求。 2. **低功耗模式**:具有多种电源模式,如连续测量模式、单次测量模式和待机模式,以适应不同的电源管理策略。 ...

    perl-ssh-tools:功能更强大的DSH群集SSH套件

    名称cluster-ssh-tools-集群ssh工具的集合历史我经常在需要同时对许多主机执行相同操作的计算机集群上工作。 我从常规的shell循环开始: for i in `seq...可扩展性我很幸运地一次从拥有8G RAM和大量可用CPU周期的堡垒主

    分布式命令维护Linux节点.pdf

    分布式命令维护Linux节点是Linux操作系统管理和系统开发中的一个重要实践,特别是在大规模集群环境下。...了解并掌握dsh的使用方法,对于从事Linux操作系统管理和系统开发的专业人员来说,是非常有价值的技能。

    lis3dh与lis3dsh官方驱动及例子.rar

    本资源为ST公司官方LIS3DH 、LIS3DSH驱动及例子。资源解压后的driver文件夹可直接在你的工程中应用:The driver is platform independent, you need only to complete the two functions for write and read from ...

    a_GildiaTitul3DSh

    【标题】"a_GildiaTitul3DSh" 是一款3D效果的字体,它在设计上强调了立体感和视觉冲击力,适合用于标题、海报等需要突出重点的场合。这款字体可能是由设计师精心制作,以提供一种独特且引人注目的文字表现形式。 ...

    Haier海尔电热水器DSH-85V3(U1)使用说明书用户手册图解图示pdf电子版下载.pdf

    【清洁与保养】部分教导用户如何定期清洁热水器,以保持其高效运作,并延长使用寿命。 【售后服务】海尔承诺提供“1+5”成套服务,包括一次就好服务、安全测电、讲解指导、一站通检、全程无忧和现场清理等,确保...

    基于仿真的激光线宽 (DSH) 拟合程序.zip

    《激光线宽(DSH)拟合程序:MATLAB实现与应用》 在现代光学和光电子学领域,激光线宽的测量与分析是一项至关...在使用过程中,建议结合相关理论知识,逐步探索和分析程序的各个部分,以获得更全面的理解和应用能力。

    Zojirushi象印VE真空保温省电电热水瓶CV-DSH40C&50C说明书.pdf

    Zojirushi象印品牌说明书

    LIS3DSH:LIS3DSH 加速度计 Arduino 库

    这个库是由 Mike Kirkhart 设计的,它基于早期的 L3G 库进行了优化和改进,以更好地适应 LIS3DSH 芯片的功能和特性。 LIS3DSH 库的核心功能包括: 1. 初始化:库提供了初始化函数,用户可以通过调用该函数设置加...

    LIS3DH 资料_完整例程_手册_电路等,lis3dsh,C/C++

    **LIS3DH 传感器详解** LIS3DH 是一款由意法半导体(STMicroelectronics)制造的三轴加速度计,广泛应用于运动检测、姿态测量、...LIS3DH 的易用性和高性能使其成为众多IoT和嵌入式系统开发者的首选加速度传感器之一。

    LIS3DSH的代码情况

    LIS3DSH的代码情况

    LIS3DSH的烧录文件

    LIS3DSH的烧录情况

    lis3ds驱动

    2. **微电子机械系统(MEMS)**: 使用MEMS技术,LIS3DSH能在微小的硅晶片上集成了机械结构和电子电路,实现了小型化、低功耗和高可靠性。 3. **数字输出**: LIS3DSH通常提供数字I²C或SPI接口,使得数据传输更加便捷...

    stm32-lis3dsh-main.zip

    以下是LIS3DSH的一些主要特性和应用场景: 主要特性: 宽供电电压范围:1.71 V至3.6 V。 独立I/O供电:与供电电压兼容(1.8 V)。 超低功耗:适合电池供电的应用。 动态可调的满量程:±2g/±4g/±6g/±8g/±16g。...

Global site tag (gtag.js) - Google Analytics