在大多数公司中,系统管理员被要求事半功倍。 随着虚拟化技术(例如IBMPowerVM®)的应用,系统管理员必须管理的IBM®AIX®实例的数量急剧增加。 PowerVM允许单个硬件运行数十个甚至数百个IBM AIX逻辑分区(LPAR)。 几年前,系统管理员可能只负责管理几十个AIX实例,而在当今环境中,通常会找到要管理数百个AIX LPAR的系统管理员。
如果您在具有许多LPAR的大型AIX环境中,则在需要更改或需要从每台服务器收集信息时登录到每个LPAR是不切实际的。 在这些大型环境中,最好的选择是谨慎使用允许您在许多服务器上快速运行命令或脚本的技术。 本文介绍了用于在大量服务器上运行命令和脚本的几个选项。
本文讨论的所有选项都依赖于在中央管理服务器和其余服务器之间设置的SSH密钥。
第一步是选择要使用的中央管理服务器。 您应该选择一个尽可能安全的服务器,并且该服务器可以访问您环境中的所有其他服务器。 一种选择是为此目的创建一个新的LPAR,并尽可能地将其锁定。 其他可能的选项是网络安装管理器(NIM)服务器或系统监视服务器。
下一步是选择要使用的用户帐户。 您可能想要自动化的许多任务都需要root特权。 但是,由于潜在的安全问题,不建议直接使用root帐户。 一个很好的选择是创建一个普通用户帐户,并使用sudo等实用程序授予其根访问权限。
确定要用作中央管理服务器的服务器并确定用户帐户后,下一步是生成SSH密钥。 有很多关于SSH密钥的教程,因此本文将不对该主题进行详细说明。 本质上,您需要使用ssh-keygen命令在中央管理服务器上创建私钥和公钥。 私钥仅在中央管理服务器上,而公钥可以复制到所有其他服务器上。
您需要在每台服务器上建立一个新的用户帐户,在用户的主目录中创建一个“ .ssh / authorized_keys”文件,并将公钥放入文件中。 如果您打算运行具有root级访问权限的命令,则还应该设置sudo或类似的方法来授予用户其他访问权限。 如果使用sudo ,请使用“ NOPASSWD”选项,以便sudo不会提示用户输入密码。
要验证SSH密钥是否正常运行,应尝试使用ssh在其中一台服务器上运行远程命令(例如hostname 。 例如,如果服务器名称为“ server1”,则应该能够输入ssh server1 hostname ,并且响应应该为server1. 使用sudo ,您应该能够通过运行ssh server1 sudo su -c whoami,来验证这一点,该命令应该返回root.
一种用于远程运行命令的方法是简单的单行循环命令。 从文件中读取将在其上运行命令的服务器的名称。 文件的每一行都有一个服务器名称。 清单1显示了用于在多个服务器上运行命令的for循环命令行示例。
让我们详细分析一下:
for server in `cat serverlist`; do for server in `cat serverlist`; do –创建一个循环,以便该循环将处理serverlist文件中的每个服务器,并将服务器名称设置为$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选项用于将标准错误重定向到标准输出。 否则,由于未缓冲标准错误,因此输出可能会出现故障。 echo; – echo; –确保无论命令是否产生输出,都将光标移动到下一行,以便循环中的下一个服务器名称在其正确位置对齐。 它通过在每行的末尾使用回车符来实现此目的,如果命令后没有返回任何输出,则设置正确的格式。 如果命令确实产生了输出,则会导致多余的空行,但是,这些行将在下一步中删除。 done | grep -v ^$ done | grep -v ^$ –结束for循环,然后过滤所有空白行的输出并将其删除。图1显示了此命令行和输出的示例。 文件serverlist具有服务器名称列表(每行一个),并且将在每个服务器上运行的命令是oslevel -s 。
图2显示了一个使用sudo及其输出的for循环命令行示例。
在图2中,在多个服务器上删除了一个用户帐户。 sudo授予运行rmuser的根级访问权限。 在aixtest1和aixtest3上没有输出,这意味着该用户已被删除。 在aixtest2 , aixtest4和aixtest5 , rmuser报告错误,因为该用户不存在。
此for循环方法的缺点是,每个命令一次(串行)在一个服务器上运行。 建立SSH连接并运行快速命令通常至少需要1/4秒。 如果存在网络延迟或命令运行时间更长,则每台服务器可能需要数秒钟或更长时间。 如果要处理成百上千的服务器,则for循环方法可能会花费很长时间。 但是,它对于较小规模的情况非常简单有效。
很多时候,手头的任务需要的不仅仅是在所有服务器上运行单个命令。 在这些情况下,您可能需要在远程服务器上运行脚本。
一种方法是将脚本复制到每个服务器(使用安全复制协议(SCP)或其他文件协议),使用SSH远程运行脚本,然后选择使用另一个SSH连接删除脚本。 但是,这非常低效,因为它需要与每个服务器建立多个连接,并且需要将脚本文件复制到每个服务器。
更好的方法是在远程服务器上远程运行Shell解释器或脚本解释器(例如Perl),然后从本地服务器重定向要运行的脚本。 使用此方法,脚本可以在远程服务器上运行,而不必将脚本文件复制到远程服务器。
清单2显示了中央管理服务器上存在的info.sh脚本的内容。 这是一个简单的脚本,用于检测服务器是否为AIX。 如果是AIX,则显示OS级别,CPU模式,标题为CPU容量和内存量。
清单3展示了一个for循环,类似于我们介绍的第一个循环。 但是,在此for循环中,我们正在运行的远程命令是Korn shell(ksh)解释器,并且我们将输入从info.sh文件重定向到ksh 。 这将导致info.sh脚本在每个远程服务器上运行,而无需实际将脚本复制到服务器。
清单3显示了一个for循环命令的示例,该命令可以在servelist文件中列出的每个服务器上运行本地“ info.sh”脚本,而不必将脚本复制到每个服务器。
图3显示,当运行此命令时, info.sh脚本在serverlist文件中指定的每个服务器上运行。
这是一种在大量服务器上运行脚本的有效方法,而无需实际将脚本复制到每个服务器。 但是,该脚本是串行运行的,因此,如果脚本需要较长的时间才能完成,或者脚本运行的服务器数量众多,则可能不可行。
前面介绍的for循环在远程服务器上串行运行命令,这意味着一个接一个地运行。 还有一些选项可以并行运行命令,这意味着中央管理服务器可以同时在多个服务器上启动命令。 例如,假设您需要在35台服务器上运行命令,并且每台服务器需要1秒才能建立SSH连接并运行该命令。 如果以串行方式运行,则需要35秒才能完成。 如果并行运行同时运行16台服务器,则大约需要3秒钟(35台服务器/ 16台同时运行=大约3秒钟)。 在大量服务器上并行运行命令时,可以大大提高速度。 图4显示了比较命令的串行和并行运行的图。
AIX包含一个dsh命令,该命令旨在在多个服务器上并行运行命令。 缺省情况下, dsh最多可以并行运行64个命令(可使用-f标志自定义)。
使用dsh第一步是确保已将其安装在中央管理服务器上。 这可以通过运行which dsh来检查; 。 如果将路径返回到dsh ,则服务器已安装它。 如果不是,则需要安装AIX 6.1的csm.dsh文件集或AIX 7.1的dsm.dsh和dsm.core文件集。 为AIX 6.1或AIX 7.1设置的适当文件应该在AIX产品安装介质上。
下一步是设置一些指示dsh如何操作的环境变量。
清单4显示了使用dsh之前必须设置的变量的示例。
DSH_NODE_LIST变量应设置为文件名,该文件名指定需要在其上运行命令的服务器,每行一台服务器。
DSH_NODE_RSH变量设置为/usr/bin/ssh以指示dsh使用SSH作为连接协议。
DSH_NODE_OPTS变量设置为-q -o BatchMode=yes以指示SSH客户端不显示登录标语并且不提示用户任何内容。
设置完这些变量后,可以通过运行dsh在多台服务器上运行命令,然后在每台服务器上运行命令行。 图5显示了使用dsh在多台服务器上运行的oslevel命令。
dsh另一个有用功能是dshbak命令。 如果命令返回大量输出,则可以将dsh的输出格式化为易于使用的格式。 要使用dshbak ,只需运行常规dsh命令并将输出通过管道dshbak到dshbak ,如图6所示。
并行SSH是一种实用程序,旨在在多个服务器上并行运行SSH命令,其工作方式与AIX dsh实用程序类似。 但是,并行SSH具有多个优点,包括:跨平台(在Linux®和其他UNIX®变体上使用相同的实用程序),开放源代码以及具有使用重定向运行脚本的功能。
大多数Linux发行版本信息库中都提供并行SSH,以方便安装。
要在AIX上使用并行SSH,您首先需要安装2.4版或更高版本的Python脚本语言。 我发现并行SSH setup.py安装程序可能很难在AIX上运行,因此没有必要。 相反,您可以轻松地手动将并行SSH二进制文件复制到要运行它们的任何位置。
要使用并行SSH在多台服务器上运行命令,请使用类似于清单5中列出的命令。
清单5.使pssh在多台服务器上运行命令的示例命令
# pssh -h serverlist -i oslevel -s
-h serverlist命令指定serverlist文件中的服务器列表(每行一个服务器名称)。 -i选项指定输出必须在屏幕上内联。 oslevel -s是应在每个服务器上运行的命令的名称。
图7显示了使用pssh在多台服务器上运行oslevel命令的示例输出。
使用pssh ,还可以在多个服务器上快速轻松地运行脚本。 无需使用输入方向将脚本复制到每个服务器即可完成此操作。 这与本文前面使用简单的for循环在多台服务器上运行脚本部分下介绍的方法基本相同。 但是,在这种情况下,它是并行进行的,因此速度要快得多。
运行使用info.sh脚本(列表2中示出) pssh ,使用清单6所示的命令行。
清单6.使用“ pssh”在多个服务器上运行本地脚本
# pssh -h serverlist -i -I < info.sh
-I开关告诉pssh从标准输入读取要运行的命令。 所述< info.sh选项重定向info.sh脚本的标准输入pssh ,这在效果上运行的每个服务器上该脚本,而不必实际将脚本复制到每个服务器。
图8显示了使用pssh在多台服务器上运行info.sh脚本的输出。
AIX dsh套件还包含一个名为dcp的命令,该命令允许将文件并行复制到多个服务器或从多个服务器复制。 这可以非常快速,轻松地将文件推出到许多LPAR。
并行SSH还包括类似的复制命令,它们都并行运行。 pscp命令用于将文件复制到服务器,而pslurp用于从服务器复制文件。
图9显示了用于将info.sh文件复制到多个服务器上的/ tmp目录中的pscp命令。
如图所示,有多种方法可以在多个服务器上运行命令或脚本。 系统管理员既可以使用简单的单线循环在每个服务器上依次运行命令或脚本,也可以使用并行运行命令的实用程序(例如dsh和并行SSH)。 使用这些工具和方法可以使系统管理员更高效,并在更短的时间内完成更多工作。
翻译自: https://www.ibm.com/developerworks/aix/library/au-aix-run-commands/index.html
相关资源:微信小程序源码-合集6.rar