《事半功倍:使用脚本和实用程序跨所有ibmaix服务器快速运行命令》由会员分享,可在线阅读,更多相关《事半功倍:使用脚本和实用程序跨所有ibmaix服务器快速运行命令(11页珍藏版)》请在金锄头文库上搜索。
1、事半功倍:使用脚本和实用程序跨所有 IBM AIX 服务器快速运行命令简介在大多数公司中,系统管理员都被要求使用更少的资源做更多的事。由于采用了虚拟化技术(比如 IBM PowerVM),系统管理员必须管理的 IBM AIX 实例数量已显著增长。PowerVM 支持在单个硬件上运行数十或者甚至数百个 IBM AIX 逻辑分区 (LPAR)。多年前,系统管理员可能仅负责管理二十几个 AIX 实例,而在如今的环境中,系统管理员需要管理数百个 AIX LPAR 的情形很普遍。如果您处在一个具有许多 LPAR 的大型 AIX 环境中,在需要更改或需要从每个服务器收集信息时,登录到每个服务器是不切实际的
2、。在这些大型环境中,最佳的选择是谨慎地使用支持跨许多服务器快速运行命令或脚本的技术。本文将介绍跨大量服务器运行命令和脚本的多种选择。SSH 密钥概述本文中讨论的所有选择都需要在一个中央管理服务器与其余服务器之间设置 SSH 密钥。第一步是挑选一个要使用的中央管理服务器。您挑选的服务器应该能够尽可能安全地访问您环境中的其他所有服务器。一个选择是为此用途创建一个新 LPAR,并尽可能多地锁定它。其他潜在的选择包括 Network Installation Manager (NIM) 服务器或系统监视服务器。下一步是挑选一个要使用的用户帐户。您希望自动完成的许多任务可能需要根用户特权。但是,由于前缀
3、的安全问题,不推荐直接使用根帐户。一个不错的替代方案是,创建一个正常的用户帐户,并使用实用程序(比如sudo)为它授予根用户访问权。在确定要将哪个服务器用作中央管理服务器并确定了一个用户帐户后,下一步是生成一个 SSH 密钥。已有许多介绍 SSH 密钥的教程,本文不再详细探讨该主题。基本上讲,您需要使用ssh-keygen命令在中央管理服务器上创建一个私钥和公钥。私钥仅在中央管理服务器上使用,而公钥可复制到其他所有服务器。需要在每个服务器上建立一个新用户帐户,在用户的主目录中创建一个 “.ssh/authorized_keys” 文件并将公钥放入其中。如果计划以根用户级访问权来运行命令,还应设
4、置sudo或类似实用程序,向用户授予其他访问权。如果使用sudo,那么可以使用 “NOPASSWD” 选项,这样sudo就不会再提示用户输入密码。要验证 SSH 密钥是否有效,可以尝试使用ssh在一个服务器上运行一个远程命令,比如hostname。例如,如果服务器名称为 “server1”,那么您应该能够键入ssh server1 hostname,响应应该为server1。在使用sudo时,您应该能够运行ssh server1 sudo su -c whoami命令来验证此情况,最后应返回root。回页首使用一个简单的for循环在多个服务器上运行单个命令远程运行一个命令的一种方法是,使用一个
5、简单的一行循环命令。要在其上运行该命令的服务器名称将从一个文件中读取。该文件的每一行有一个服务器名称。清单 1 显示了在多个服务器上运行for循环命令行的示例。清单 1. 一个 sshfor循环的示例for server in cat serverlist; do printf %-20s $server; ssh -q -o BatchMode yes $server oslevel -s 2&1; echo; done | grep -v $我们详细分析一下这个示例: for server in cat serverlist; do 创建一个循环,让serverlist文件中的每个服务器将
6、由该循环处理,而且服务器名称将被设置为$server变量。 printf %-20s $server; 显示服务器的名称,通过填入空格来保持左对齐。这将导致服务器名称被整齐地输出。 ssh -q -o BatchMode yes $server oslevel -s 2&1; 使用两个选项来调用 ssh 命令。-q选项阻止显示登录窗口。-o BatchMode yes选项导致 SSH 在一个批处理模式下运行,而不提示用户输入任何信息。$server将通过for循环更改为当前服务器的名称。在本示例中,oslevel -s是我们需要在远程服务器上运行的命令。2&1选项用于将标准错误重定向到标准输出
7、。没有此选项,输出可能是乱序的,因为没有缓冲区来暂存标准错误。 echo; 确保无论该命令是否生成输出,光标都会移动到下一行,以便让循环中的下一个服务器名称排列在正确的位置上。为此,在每行结尾处都会使用一个回车,如果在执行命令之后没有返回输出,则设置了正确的格式。如果执行命令之后生成了输出,则会产生一个额外的空白行,但在下一步中将会删除这些行。 done | grep -v $ 结束for循环,然后过滤并删除输出中的所有空白行。图 1 显示了这个命令行和输出的一个示例。文件serverlist有一个服务器名称列表(每行一个),将在每个服务器上运行的命令为oslevel -s。图 1. 一个fo
8、r循环命令行和它的输出示例图 2 显示了一个使用sudo的for循环命令行和它的输出的示例。图 2. 一个使用 sudo 来获取根用户访问权的for循环命令和它的输出的示例在图 2 中,在多个服务器上删除了一个用户帐户。运行 rmuser 所需的根用户级访问权由sudo授予。aixtest1和aixtest3上没有输出,这意味着该用户已被删除。在aixtest2、aixtest4和aixtest5上,rmuser报告了一个错误,因为该用户不存在。这个for循环命令的缺点是,每个命令一次仅在一个服务器上运行(顺序运行)。它一般只需 1/4 秒的时间就可以建立一个 SSH 连接并运行一个快速命令。
9、如果存在网络延迟或者运行的命令花费了较长的时间,那么每个服务器可能会花费几秒钟或更长的时间。如果处理数百或数千个服务器,for循环方法可能会花很长的时间。但是,当规模较小时,它非常简单高效。回页首使用一个简单的for循环在多个服务器上运行一段脚本许多时候,手头的任务需要的不仅仅是跨所有服务器运行单个命令。在这些情况下,您可能需要在远程服务器上运行一段脚本。为此,一种方式是将该脚本复制到每个服务器 使用 Secure Copy Protocol (SCP) 或另一种文件协议,使用 SSH 远程运行该脚本,然后使用另一个 SSH 连接有选择地删除该脚本。但是,这种方式效率非常低,因为它需要与每个服
10、务器建立多个连接,需要将脚本文件复制到每个服务器。一种更好的方法是,在远程服务器上远程运行一个 shell 解释器或一个脚本解释器(比如 Perl),从本地服务器重定向您希望运行的脚本。使用这种方法,可在远程服务器上运行该脚本,无需将脚本文件复制到远程服务器。清单 2 显示了中央管理服务器上存在的info.sh脚本的内容。这是一段简单的脚本,用于检测服务器是否为 AIX。如果服务器为 AIX,则会显示操作系统级别、CPU 模式、授权的 CPU 容量和内存量。清单 2. 中央管理服务器上存在的 info.sh 脚本#!/usr/bin/kshif uname = AIX ; thenprintf
11、 This server is running AIX level : oslevel -secho CPU and Memory info: lparstat -i | egrep Mode|Entitled Capacity |Online Memoryecho -elseecho This is not an AIX serverfi清单 3 显示了一个与我们介绍的第一个循环类似的for循环。但是,在这个for循环中,我们运行的远程命令是 Korn shell (ksh) 解释器,我们将输入从info.sh文件重定向到ksh。这会导致info.sh脚本在每个远程服务器上运行,而无需实际地
12、将脚本复制到这些服务器。清单 3. 在 servelist 文件中列出的每个服务器上运行本地 “info.sh” 脚本的for循环命令的示例for server in cat serverlist; do printf %-20sn $server; ssh -q -o BatchMode yes $server ksh 2&1 ./info.sh ; echo; done | grep -v $清单 3 显示了一个在 servelist 文件中列出的每个服务器上运行本地 “info.sh” 脚本的for循环命令的示例,无需将脚本复制到每个服务器。图 3 表明当运行此命令时,info.sh脚本
13、在serverlist文件中指定的每个服务器上运行。图 3. 使用一个简单的for循环,使用输入重定向在远程服务器上运行脚本这是一种在大量服务器上运行脚本的高效方式,无需实际地将脚本复制到每个服务器。但是,脚本顺序地运行,所以如果脚本需要花较长时间才能完成,或者脚本将在大量服务器上运行,那么这可能是不切实际的。回页首对比脚本的顺序和并行运行前面介绍的for循环在远程服务器上顺序地运行命令,也就是一个接一个地运行。也有并行运行命令的选项,表明中央管理服务器同时在多个服务器上启动命令。例如,假设您需要在 35 个服务器上运行一个命令,每个服务器需要花 1 秒来建立 SSH 连接和运行该命令。如果顺
14、序地运行,此任务将花 35 秒完成。如果同时并行地运行 16 个服务器,它将花大约 3 秒(35 个服务器/同时运行 16 个 = 大约 3 秒)。在大量服务器上运行命令时,获得了显著的速度提升。图 4 显示了对比命令的顺序和并行运行的图表。图 4. 脚本的顺序执行与并行执行之间的区别回页首使用dsh命令在多个服务器上运行一个命令AIX 包含dsh命令,它被设计为在多个服务器上并行地运行一个命令。在默认情况下,dsh可并行运行最多 64 个命令(这可使用-f标志自定义)。要使用dsh,首先需要确保它已安装在中央管理服务器上。这可以通过运行which dsh; 来检查。如果向dsh返回一条路径,
15、则表示它已安装在服务器上。如果没有返回任何路径,则需要安装适用于 AIX 6.1 的csm.dsh文件集或适用于 AIX 7.1 的dsm.dsh和dsm.core文件集。适用于 AIX 6.1 或 AIX 7.1 的适当文件集应该可以在 AIX 产品安装媒介上找到。下一步将设置一些环境变量来告诉dsh如何操作。清单 4. 为dsh设置的环境变量export DSH_NODE_LIST=/home/user/serverlistexport DSH_NODE_RSH=/usr/bin/sshexport DSH_NODE_OPTS=-q -o BatchMode=yes清单 4 显示了在使用dsh之前必须设置的变量示例。DSH_NODE_LIST变量已被设置为一个文件名,这个文件指定了您需要在其上运行这些命令的服务器,每行一个服务器。DSH_NODE_RSH变量设置为/usr/bin/ssh,以告诉dsh使用 SSH 作为连接协议。