云最终由硬件和软件构成,而硬件和软件则是需要定期维护的组件。 硬件故障需要维修或更换; 软件需要打补丁,更新和升级; 并且必须对系统进行配置以使其领先于需求和潜在的安全威胁。 应用程序开发人员可能会发现计算云柔软,蓬松且方便,但是云管理员面临着肮脏的事实。
您不必管理云即可面对严峻的问题。 局域网,小型服务器场和计算集群带来了许多相同的系统管理挑战。 当计算机数量增加时,诸如Secure Shell(ssh), scp
和sftp
类的日常工作变得很麻烦。 本期Speaking 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=$1; 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">
在两个主机上运行uptime -a
:example.com和sample.com。 用引号括起来的计算机名称列表将名称集中在一起作为一个参数,并且出于完全相同的原因用引号引起来。 在每个机器名称必须符合范式为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
选项),以及用于捕获输出的命名目录。 实际上,许多软件包都基于此脚本的精神来简化分布式系统的管理。 其中之一是分布式外壳程序(dsh)。
更好的任务工具
dsh专为在远程系统上运行shell命令而设计,它提供了许多便利,使使用机器组更加容易。 该外壳有二进制和源形式。 对于二进制文件,请查阅Linux®或UNIX®发行版中的libdshconfig
和dsh
软件包。 例如,Ubuntu和Debian用户可以使用apt-get
一键安装dsh:
$ sudo apt-get install libdshconfig1 libdshconfig1-dev dsh
如果找不到系统的预构建软件包,则可以从源代码中轻松构建dsh。 找到该库和实用程序的最新版本,下载并解压缩两个tarball,然后使用./configure; make; sudo make install
的典型技术进行构建和安装./configure; make; sudo make install
./configure; make; sudo make install
./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
运行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
运行uptime
将在服务器文件中列出的所有计算机上dsh -g servers -- uptime
运行uptime
。
随意将-m
与-a
和-g
混合和匹配以分别扩展全局列表或组。 此外,您还可以使用--file filename
中列出的所有计算机添加filename
到主机列表。 缺省情况下,dsh并行运行命令。 相反,如果要顺序运行命令,请指定--wait-shell
。
虽然方便,但dsh有一个很大的缺点:它不能复制文件。 例如,如果要将数据部署到多台计算机上,则必须编写新脚本,采用分发基础结构(例如rsync
)或考虑使用更强大的工具(例如Parallel SSH(pssh)) 。
就像ssh一样,只能并行
像dsh一样,pssh旨在简化许多计算机的管理。 除了dsh的所有功能外,pssh还能够在中央服务器之间来回复制文件,并可以杀死一组系统中的进程。 该外壳及其底层库是用Python编写的,并且假设您的系统已经具有Python解释器和核心库(请参见清单3 ),则pssh易于安装。
清单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软件包安装了五个实用程序: parallel-ssh
, parallel-scp
, parallel-slurp
, parallel-nuke
和parallel-rsync
。 每个实用程序可在多个主机上并行运行。
-
parallel-ssh
在多个主机上并行运行命令。 - 顾名思义,
parallel-scp
文件并行复制到多个远程主机。 -
parallel-rsync
(其名称真实)可通过rsync
协议将文件有效地并行复制到多个主机。 -
parallel-slurp
文件从多个远程主机parallel-slurp
复制到中央主机。 -
parallel-nuke
杀死多个远程主机上的进程。
与dsh不同,主机始终通过清单(manifest)命名,该清单中的每一行都采用host[:port] [user]
。 以下是使用parallel-ssh
在大量主机上运行uptime
运行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
将一个或多个文件或目录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复制到server.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]
,请通过与vanilla ssh连接来验证您的配置。 如果系统提示您输入密码,请通过在远程主机上安装公钥来解决此问题,然后重试。 (有关说明,请参见ssh
和ssh-keygen
手册页。)
整体机械
对于5台,10台或更多的计算机,这里描述的工具可能就足够了,特别是对于不频繁和临时的管理任务。 但是,当机器数量增加或您经常重复做同样的事情时,考虑其他旨在自动维护许多机器的工具和子系统可能是明智的。 反过来,一些用于大型网络的软件也可以应用于少数机器。 寻找合适的工具并在手动干预和自动化之间取得平衡是一个长期的挑战。
这里是一些要考虑的工具:
-
rsync
。 这是从中央服务器分发文件并保持分发的文件系统同步的出色工具。 Speaking UNIX的先前部分详细介绍了rsync
。 - 木偶 。 Puppet是UNIX和Linux®日益流行的子系统,可自动执行配置维护。 根据其网站,“ [Puppet]提供了一个强大的框架来简化[系统管理员]需要执行的大多数技术任务。[杂项]是用Puppet的自定义语言编写的代码,与其他任何语言一样可以共享码。” Puppet可以描述组件之间的依赖关系,定义文件的正确状态,查询系统状态等等。 如果您多次执行杂务,则最好将其捕获为Puppet任务。
- Capistrano 。 Capistrano是另一种流行的远程系统管理工具。 它的主页很好地描述了该工具:“简而言之,Capistrano是一种用于在一个或多个远程服务器上自动化任务的工具。它在所有目标计算机上并行执行命令,并提供了一种在多台计算机上回滚更改的机制。对于从事任何专业或偶然的系统管理工作的任何人。” 像木偶一样,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
ls -x1 /usr/lib | grep -i xml
。 Capistrano通过角色以及其他数百种功能来支持机器组。 像cap search_libs
一样,通过cap
命令启动任务。 Capistrano在Ruby和Rails开发人员中广泛用于将代码部署到服务器,但是对于自动化大多数分布式系统管理任务来说,它是一个极好的选择。 教程介绍了如何将Capistrano与Java™语言,Perl,Python和其他编程语言混合,以及如何将Capistrano与应用程序引擎(如Drupal和Expression Engine)一起使用。 与源代码控制系统配对时,Capistrano效果最佳,但这不是必需的。 您可以使用put
操作分发二进制文件。 - Nagios 。 维护很重要,监视也很重要。 中断和错误可能会对网络造成严重破坏,尤其是当许多系统运行相同的配置时。 Nagios是一款开源监视器,可以监视服务器,服务,资源等。 它易于安装和部署,可通过任何Web浏览器使用。
您可能还需要查看计算集群工具,例如Oak Ridge国家实验室(ORNL)的集群命令和控制(C3)和pdsh。 C3在ORNL运营着一个庞大的计算集群,并提供了许多命令行工具,这些工具通过减少操作和管理集群所需的时间和精力来提高系统管理员的工作效率。 pdsh shell在许多方面与pssh相似,但也可以管理系统映像。
这么多机器,很少时间
使用dsh和pssh之类的工具可以节省时间并减少错误。 您可以在大量系统上运行相同的命令,几乎可以立即看到合并的结果。 清单也像机器一样结块,减少了遗漏的风险。 Puppet和Capistrano可以在脚本中捕获经常重复的任务。 如果您要管理更多的机器,那么自动化是关键。 看到,即使计算云也可以有一线希望。
翻译自: https://www.ibm.com/developerworks/aix/library/au-spunix_remoteserver/index.html