事半功倍使用脚本和实用程序跨所有 IBM AIX 服务器快速运行命令.docx
- 文档编号:12850000
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:13
- 大小:371.60KB
事半功倍使用脚本和实用程序跨所有 IBM AIX 服务器快速运行命令.docx
《事半功倍使用脚本和实用程序跨所有 IBM AIX 服务器快速运行命令.docx》由会员分享,可在线阅读,更多相关《事半功倍使用脚本和实用程序跨所有 IBM AIX 服务器快速运行命令.docx(13页珍藏版)》请在冰豆网上搜索。
事半功倍使用脚本和实用程序跨所有IBMAIX服务器快速运行命令
事半功倍:
使用脚本和实用程序跨所有IBMAIX服务器快速运行命令
简介
在大多数公司中,系统管理员都被要求使用更少的资源做更多的事。
由于采用了虚拟化技术(比如IBMPowerVM®),系统管理员必须管理的IBM®AIX®实例数量已显著增长。
PowerVM支持在单个硬件上运行数十或者甚至数百个IBMAIX逻辑分区(LPAR)。
多年前,系统管理员可能仅负责管理二十几个AIX实例,而在如今的环境中,系统管理员需要管理数百个AIXLPAR的情形很普遍。
如果您处在一个具有许多LPAR的大型AIX环境中,在需要更改或需要从每个服务器收集信息时,登录到每个服务器是不切实际的。
在这些大型环境中,最佳的选择是谨慎地使用支持跨许多服务器快速运行命令或脚本的技术。
本文将介绍跨大量服务器运行命令和脚本的多种选择。
SSH密钥概述
本文中讨论的所有选择都需要在一个中央管理服务器与其余服务器之间设置SSH密钥。
第一步是挑选一个要使用的中央管理服务器。
您挑选的服务器应该能够尽可能安全地访问您环境中的其他所有服务器。
一个选择是为此用途创建一个新LPAR,并尽可能多地锁定它。
其他潜在的选择包括NetworkInstallationManager(NIM)服务器或系统监视服务器。
下一步是挑选一个要使用的用户帐户。
您希望自动完成的许多任务可能需要根用户特权。
但是,由于前缀的安全问题,不推荐直接使用根帐户。
一个不错的替代方案是,创建一个正常的用户帐户,并使用实用程序(比如 sudo)为它授予根用户访问权。
在确定要将哪个服务器用作中央管理服务器并确定了一个用户帐户后,下一步是生成一个SSH密钥。
已有许多介绍SSH密钥的教程,本文不再详细探讨该主题。
基本上讲,您需要使用 ssh-keygen 命令在中央管理服务器上创建一个私钥和公钥。
私钥仅在中央管理服务器上使用,而公钥可复制到其他所有服务器。
需要在每个服务器上建立一个新用户帐户,在用户的主目录中创建一个“.ssh/authorized_keys”文件并将公钥放入其中。
如果计划以根用户级访问权来运行命令,还应设置 sudo 或类似实用程序,向用户授予其他访问权。
如果使用 sudo,那么可以使用“NOPASSWD”选项,这样 sudo就不会再提示用户输入密码。
要验证SSH密钥是否有效,可以尝试使用 ssh 在一个服务器上运行一个远程命令,比如 hostname。
例如,如果服务器名称为“server1”,那么您应该能够键入 sshserver1hostname,响应应该为 server1。
在使用 sudo 时,您应该能够运行 sshserver1sudosu-cwhoami 命令来验证此情况,最后应返回root。
回页首
使用一个简单的 for 循环在多个服务器上运行单个命令
远程运行一个命令的一种方法是,使用一个简单的一行循环命令。
要在其上运行该命令的服务器名称将从一个文件中读取。
该文件的每一行有一个服务器名称。
清单1显示了在多个服务器上运行 for 循环命令行的示例。
清单1.一个ssh for 循环的示例
forserverin`catserverlist`;doprintf"%-20s"$server;
ssh-q-o"BatchModeyes"$serveroslevel-s2>&1;echo;done|grep-v^$
我们详细分析一下这个示例:
∙forserverin`catserverlist`;do –创建一个循环,让 serverlist 文件中的每个服务器将由该循环处理,而且服务器名称将被设置为$server 变量。
∙printf"%-20s"$server; –显示服务器的名称,通过填入空格来保持左对齐。
这将导致服务器名称被整齐地输出。
∙ssh-q-o"BatchModeyes"$serveroslevel-s2>&1; –使用两个选项来调用ssh命令。
-q 选项阻止显示登录窗口。
-o"BatchModeyes" 选项导致SSH在一个批处理模式下运行,而不提示用户输入任何信息。
$server 将通过 for 循环更改为当前服务器的名称。
在本示例中,oslevel-s 是我们需要在远程服务器上运行的命令。
2>&1 选项用于将标准错误重定向到标准输出。
没有此选项,输出可能是乱序的,因为没有缓冲区来暂存标准错误。
∙echo;– 确保无论该命令是否生成输出,光标都会移动到下一行,以便让循环中的下一个服务器名称排列在正确的位置上。
为此,在每行结尾处都会使用一个回车,如果在执行命令之后没有返回输出,则设置了正确的格式。
如果执行命令之后生成了输出,则会产生一个额外的空白行,但在下一步中将会删除这些行。
∙done|grep-v^$ –结束 for 循环,然后过滤并删除输出中的所有空白行。
图1显示了这个命令行和输出的一个示例。
文件 serverlist 有一个服务器名称列表(每行一个),将在每个服务器上运行的命令为 oslevel-s。
图1.一个 for 循环命令行和它的输出示例
图2显示了一个使用 sudo 的 for 循环命令行和它的输出的示例。
图2.一个使用sudo来获取根用户访问权的 for 循环命令和它的输出的示例
在图2中,在多个服务器上删除了一个用户帐户。
运行rmuser所需的根用户级访问权由 sudo 授予。
aixtest1 和 aixtest3 上没有输出,这意味着该用户已被删除。
在 aixtest2、aixtest4 和 aixtest5 上,rmuser 报告了一个错误,因为该用户不存在。
这个 for 循环命令的缺点是,每个命令一次仅在一个服务器上运行(顺序运行)。
它一般只需1/4秒的时间就可以建立一个SSH连接并运行一个快速命令。
如果存在网络延迟或者运行的命令花费了较长的时间,那么每个服务器可能会花费几秒钟或更长的时间。
如果处理数百或数千个服务器,for 循环方法可能会花很长的时间。
但是,当规模较小时,它非常简单高效。
回页首
使用一个简单的 for 循环在多个服务器上运行一段脚本
许多时候,手头的任务需要的不仅仅是跨所有服务器运行单个命令。
在这些情况下,您可能需要在远程服务器上运行一段脚本。
为此,一种方式是将该脚本复制到每个服务器[使用SecureCopyProtocol(SCP)或另一种文件协议],使用SSH远程运行该脚本,然后使用另一个SSH连接有选择地删除该脚本。
但是,这种方式效率非常低,因为它需要与每个服务器建立多个连接,需要将脚本文件复制到每个服务器。
一种更好的方法是,在远程服务器上远程运行一个shell解释器或一个脚本解释器(比如Perl),从本地服务器重定向您希望运行的脚本。
使用这种方法,可在远程服务器上运行该脚本,无需将脚本文件复制到远程服务器。
清单2显示了中央管理服务器上存在的 info.sh 脚本的内容。
这是一段简单的脚本,用于检测服务器是否为AIX。
如果服务器为AIX,则会显示操作系统级别、CPU模式、授权的CPU容量和内存量。
清单2.中央管理服务器上存在的info.sh脚本
#!
/usr/bin/ksh
if["`uname`"="AIX"];then
printf"ThisserverisrunningAIXlevel:
"
oslevel-s
echo"CPUandMemoryinfo:
"
lparstat-i|egrep"^Mode|^EntitledCapacity|^OnlineMemory"
echo"------------------------------"
else
echo"ThisisnotanAIXserver"
fi
清单3显示了一个与我们介绍的第一个循环类似的 for 循环。
但是,在这个 for 循环中,我们运行的远程命令是Kornshell(ksh)解释器,我们将输入从 info.sh 文件重定向到 ksh。
这会导致 info.sh 脚本在每个远程服务器上运行,而无需实际地将脚本复制到这些服务器。
清单3.在servelist文件中列出的每个服务器上运行本地“info.sh”脚本的 for 循环命令的示例
forserverin`catserverlist`;doprintf"%-20s\n"$server;
ssh-q-o"BatchModeyes"$server'ksh2>&1'<./info.sh;echo;done|grep-v^$
清单3显示了一个在servelist文件中列出的每个服务器上运行本地“info.sh”脚本的 for 循环命令的示例,无需将脚本复制到每个服务器。
图3表明当运行此命令时,info.sh 脚本在 serverlist 文件中指定的每个服务器上运行。
图3.使用一个简单的 for 循环,使用输入重定向在远程服务器上运行脚本
这是一种在大量服务器上运行脚本的高效方式,无需实际地将脚本复制到每个服务器。
但是,脚本顺序地运行,所以如果脚本需要花较长时间才能完成,或者脚本将在大量服务器上运行,那么这可能是不切实际的。
回页首
对比脚本的顺序和并行运行
前面介绍的 for 循环在远程服务器上顺序地运行命令,也就是一个接一个地运行。
也有并行运行命令的选项,表明中央管理服务器同时在多个服务器上启动命令。
例如,假设您需要在35个服务器上运行一个命令,每个服务器需要花1秒来建立SSH连接和运行该命令。
如果顺序地运行,此任务将花35秒完成。
如果同时并行地运行16个服务器,它将花大约3秒(35个服务器/同时运行16个=大约3秒)。
在大量服务器上运行命令时,获得了显著的速度提升。
图4显示了对比命令的顺序和并行运行的图表。
图4.脚本的顺序执行与并行执行之间的区别
回页首
使用 dsh 命令在多个服务器上运行一个命令
AIX包含 dsh 命令,它被设计为在多个服务器上并行地运行一个命令。
在默认情况下,dsh 可并行运行最多64个命令(这可使用 -f 标志自定义)。
要使用 dsh,首先需要确保它已安装在中央管理服务器上。
这可以通过运行 whichdsh;来检查。
如果向 dsh 返回一条路径,则表示它已安装在服务器上。
如果没有返回任何路径,则需要安装适用于AIX6.1的 csm.dsh 文件集或适用于AIX7.1的 dsm.dsh 和 dsm.core 文件集。
适用于AIX6.1或AIX7.1的适当文件集应该可以在AIX产品安装媒介上找到。
下一步将设置一些环境变量来告诉 dsh 如何操作。
清单4.为 dsh 设置的环境变量
exportDSH_NODE_LIST="/home/user/serverlist"
exportDSH_NODE_RSH=/usr/bin/ssh
exportDSH_NODE_OPTS="-q-oBatchMode=yes"
清单4显示了在使用 dsh 之前必须设置的变量示例。
DSH_NODE_LIST 变量已被设置为一个文件名,这个文件指定了您需要在其上运行这些命令的服务器,每行一个服务器。
DSH_NODE_RSH 变量设置为 /usr/bin/ssh,以告诉 dsh 使用SSH作为连接协议。
DSH_NODE_OPTS 变量被设置为 -q-oBatchMode=yes,以告诉SSH客户端不显示登录窗口,并且不提示用户输入任何信息。
设置这些变量后,可运行 dsh,然后运行应在每个服务器上运行的命令行,在多个服务器上运行一个命令。
图5显示了使用 dsh 在多个服务器上运行的 oslevel 命令。
图5.使用“dsh”在多个服务器上运行的“oslevel”命令
dsh 的另一项有用功能是 dshbak 命令。
如果返回了大量输出,那么该命令可以将 dsh 的输出格式化为一种更容易使用的格式。
要使用dshbak,只需运行正常的 dsh 命令,将输出传送到 dshbak,如图6所示。
图6.使用“dshbak”格式化“dsh”的输出
回页首
使用并行SSH在多个服务器上运行命令和脚本
并行SSH是一个实用程序,它被设计用来在多个服务器上并行地运行SSH命令,其工作方式类似于AIX dsh 实用程序。
但是,并行SSH拥有多项优势,包括:
能跨平台运行(同一个实用程序可在Linux®和其他UNIX®变体上运行),是开放的,而且拥有使用重定向来运行脚本的能力。
并行SSH包含在大多数Linux分发库中,可轻松地安装。
要在AIX上使用并行SSH,需要先安装Python脚本语言的2.4版或其更高版本。
我发现并行SSH setup.py 安装程序可能很难在AIX上运行,而且也没有必要这样做。
相反,您可以轻松地手动将并行SSH二进制文件复制到您希望运行它们的任何位置。
要使用并行SSH在多个服务器上运行某个命令,可以使用一个与清单5类似的命令。
清单5.使用 pssh 在多个服务器上运行某个命令的示例命令
#pssh-hserverlist-ioslevel-s
-hserverlist 命令在 serverlist 文件中指定服务器列表(每行一个服务器名称)。
-i选项指定屏幕上的输出必须是内联的。
oslevel-s 是应在每个服务器上运行的命令名称。
图7显示了使用 pssh 在多个服务器上运行 oslevel 命令的示例输出。
图7.使用“pssh”在多个服务器上运行“oslevel”命令
使用 pssh 也可以在多个服务器上快速而又轻松地运行脚本。
此任务无需使用 inputdirection 将脚本复制到每个服务器。
基本而言,这与本文的使用一个简单的 for 循环在多个服务器上运行脚本 一节中介绍的方法相同。
但在这里,它可以并行完成,因此速度要快得多。
要使用 pssh 运行 info.sh 脚本(如清单2所示),可使用清单6中所示的命令行。
清单6.使用“pssh”在多个服务器上运行一段本地脚本
#pssh-hserverlist-i-I -I 开关告诉 pssh 从标准输入中读取要运行的命令。 图8显示了使用 pssh 在多个服务器上运行 info.sh 脚本的输出。 图8.使用“pssh”在多个服务器上运行info.sh脚本 回页首 补充说明 AIX dsh 套件还包含一个名为dcp的命令,它允许在多个服务器之间并行地复制文件。 这可能使得将文件推送到许多LPAR成为一个非常快捷的、轻松的过程。 并行SSH也包含类似的复制命令,它们可以并行运行。 pscp 命令用于将文件复制到服务器,而 pslurp 用于从服务器复制文件。 图9显示了用于将 info.sh 文件复制到多个服务器上的 /tmp 目录的 pscp 命令。 图9.使用“pscp”将info.sh复制到多个服务器上的/tmp目录 回页首 结束语 本文已经证明,可通过多种方法在多个服务器上运行命令或脚本。 系统管理员既可以使用在每个服务器上按顺序运行命令或脚本的简单的一行循环,也可使用并行运行命令的实用程序(比如 dsh 和并行SSH)。 使用这些工具和方法,系统管理员可以提高效率,在更短的时间内完成更多的工作。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 事半功倍使用脚本和实用程序跨所有 IBM AIX 服务器快速运行命令 事半功倍 使用 脚本 实用程序 所有 服务器 快速 运行 命令