引言:

    1.如果你想知道你所管理的几万台服务器的/home分区使用率是多少。
    2.如果你想为你所管理的几万台服务器添加同一个计划任务你该怎么办?
    3.如果你想让你所管理的几万台服务器执行同一个刚刚写好的备份脚本怎么办?

一台一台的去处理?这当然不行。
所以你最有可能想到的,就是写一个循环,在这几万台机器中循环,执行同样的操作。
可是、如果经常需要做这样的操作,每天写数次循环会不会太累了呢?
更要命的是,当你要循环的主机列表或IP地址池每次都不同时,你又该怎么办呢?


所以,本文中的脚本,就是来解决这个问题的。

---------------------------------------------





哇咔咔,好久不写博客了。两年前,本人还是个新手,有很多已有的工具可以实现各种功能,但是当时的我并不知道有这些东西。所以无论需要什么功能,都是自己
动手写。当时有个需求,需要对很多服务器做相同的操作,而当时的我,并不知道有puppet之类的东西,所以没办法,只能自己写脚本了。


现在两年过去了,这脚本仍然在使用,因为有些功能puppet无法实现,或者说:无法立刻部署成功。所以当初写的这脚本,如今看来仍然有用武之处,所以,今天就贴出来供大家分享。

由于脚本是很久之前写的了,年久失修,里面有些东西已经不适用本公司现在的架构了,但是为了演示功能,那些已被弃用的功能,仍然贴了出来。与本人在线上使用的脚本相比,本文几乎没有任何删改(当然:公司的域名被我替换成example.com了)。




阅读本文的前提是:你已经了解过bash4的新特性了,并且你的所有服务器之间都已经有了信任关系。




本脚本的架构是:

在中控机(本人的是:d008.example.com)上执行要执行的命令,以及在哪些机器上执行这些命令。

脚本有一函数对用户指定的主机列表进行解析,得到最终要执行某命令的主机列表。

例如:m001-m123,表示用户要在m001至m123共123台机器上执行某命令。而该函数的功能就是:

      把m001-m123解析成:m001,m002,m003....m123这样的主机列表。

最后再在解析出的主机列表中循环,依次ssh过去并执行用户指定的命令。如果用户要执行的是个脚本,而不是普通命令,那么要先把脚本scp过去,再进行执行。

大体就是这么个思想,具体实现时,可以设置不同选项来控制脚本的行为。

本人已实现的选项有如下几个(仿man page格式做的使用说明,对齐做的不太好)

.


rchange是脚本名,部署在了/bin目录下,由于是批量更改N多服务器的配置,所以就把脚本命名为rchange


已实现的选项有:
-a COMMAND 指定要执行的命令,当使用-a时,rchange的所有剩余位置参数都是要执行的命令的一部分。
-c COMMAND 指定要执行的命令,当使用-c时,只有跟在-c后面的第一个参数,才是要执行的命令,第二个及之后的参数,均为rchange的其他option,如果该命令有参数,要把命令和参数放进同一对引号里(推荐单引号)

说明下-a和-c的区别,如下例所示:

rchange -a ls -l该命令表示要执行'ls -l'这个命令,因为-a后面所有的参数都会被认定为命令的一部分
rchange -c ls -l该命令表示要执行'ls’这个命令,而'-l'是rchange的另外一个选项,'-l'并不属于要执行的命令,而属于rchange

为避免歧义,强烈推荐将要执行的命令用一对单引号引起来,不推荐双引号,因为使用双引号时,命令中的通配符会被解析,进而造成命令执行失败,脚本行为将不可预期。

-d debug的意思,显示一些debug信息,方便调试。

-H 指定要执行命令的主机列表,可以使用'-'来指定一个范围,如:m001-m100表示100台机器。多个主机用逗号隔开,如:rchange -H d015,f018-f023,n005-n522

-e
except排除,在已指定的主机或IP列表中排除某个或某段IP,比如想使m001-m100(m052除外)这99台机器执行某命令,执行如下命令即
可:rchange -H m001-m100 -e m052,这样就会排除m052这台机器。排除多个主机可用逗号隔开,如:rchange -H
m001-m100 -e m052,m067,m091-m-94这样一共会排除6台主机,最终有94台会执行你指定的命令。

-h --help    打印帮助
-v --version 显示程序版本
-x --example 显示使用示例
这3个没什么可说的。

-m (mode)改变运行模式。当在很多主机执行同一个命令时,脚本默认会并行执行,即、在所有机器上同时执行,当使用-m选项时,脚本会改成串行执行。就是一个接一个地来。

-n
(name)在每一台主机上执行某命令之前,先打印该主机的主机名。当你想查看系统的什么属性时,这个选项会很有用,他会使显示更人性化。当使用-n选项
时,脚本的运行模式会强制使用串行,因为并行执行时,无法判断主机名和程序输出的对应关系,一瞬间屏幕就满了,根本什么也看不出来。

-s
(script)当使用-s选项时,-s后面跟着的第一个参数,会被认为是个脚本,而不是普通的命令,此时rchange会把这个脚本scp到所有要执行
这个脚本的主机上,之后再执行,rchange以该脚本的扩展名来判断要调用的解释器,如:.pl会被认定是perl脚本,.py会被认定是python
脚本,.php会被认定是php脚本,其他所有都会被认定是shell脚本(bash),当然,您也可以根据其他方式来判断,这里我就是这么设置并演示
的。

还有如下3个长选项,这3个选项是后加进去的,所以当使用时,不要使用其他选项,如果非要使用,必须把长格式选项放在前面,其他短选项放在后面,因为本人使用这几个选项时,基本不指定主机列表,所以就没考虑那么多。

--md5   显示所有主机中的filename的md5值。此选项强制使用串行模式,并强制打印主机名。
                  使用该选项时,默认主机列表包括中控机(d008)
--sync 从中控机同步filename这个文件,使得所有主机中的该文件,都和中控机中的该文件一致。
--list 在所有主机中执行ls -lh ,查看所有机器中这文件的属性神马的。

--md5和--list的执行结果如下:(--sync只是同步,没有输出)



其他选项的使用示例:





好了,现在开始贴代码,最近比较懒,中文注释就不写了,原文中有注释,但是是英文写的,对付看吧,不过我也没用什么生僻的单词,所以理解起来应该不费劲。


首先,贴的是/bin/rchange.doc,因为帮助的内容也很多,所以单独放在这个文件里了。

rchang.doc.part1:

rchange.doc.part2:

rchange.doc.part3:





接下来就是脚本的功能代码了:

rchang.part1:
rchang.part2:

rchang.part3:

rchang.part4:


rchang.part5:

rchang.part6:


rchang.part7:

rchang.part8

:


rchang.part9:


完结。


因为本人所在公司所有服务器的域名都是d001-d***和z001-z***这样的规则命名的,所以我就按这个规则写的解析主机列表,如果你的公司服务器命名规则不同(大部分人都会和我这里不同),那么重新写一个适合自己公司的解析函数即可。


我注释写的不是很多,但也写了几句,应该不至于看不懂吧。本文仅提供思想,仅供参考。

SHELL实现同时操作多个服务器:服务器批量管理的更多相关文章

  1. 如何进行服务器的批量管理以及python 的paramiko的模块

    最近对公司的通道机账号进行改造管理,全面的更加深入的理解了公司账号管理的架构.(注:基本上所有的机器上的ssh不能使用,只有部分机器能够使用.为了安全的角度考虑,安装的不是公版的ssh,而都是定制版的 ...

  2. Android操作HTTP实现与服务器通信(转)

    Android操作HTTP实现与服务器通信   本示例以Servlet为例,演示Android与Servlet的通信. 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方 ...

  3. 21. 无法执行该操作,因为链接服务器”Server_202”的 OLE DB 访问接口 “SQLNCLI10″ 无法启动分布式事务”

    无法执行该操作,因为链接服务器”Server_202”的 OLE DB 访问接口 “SQLNCLI10″ 无法启动分布式事务” 原因:调用存储过程的方式有问题,必须用JDBC方式调用存储过程才可以正常 ...

  4. Silverlight提示“Load 操作失败。远程服务器返回了错误: NotFound”

    调试时出现“Load 操作失败.远程服务器返回了错误: NotFound”: 一定要注意此错误之前的错误是什么?基本就是用户Cookie的问题,用户没有登录. 有时需要设置成Any CPU 有时重新编 ...

  5. 无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务

    在存储过程中使用事务,并且使用链接服务器时,报类似下面的错误 链接服务器"****"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 " ...

  6. centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课

    centos shell编程4[分发系统] 服务器标准化  mkpasswd 生成密码的工具  expect讲解   expect传递参数   expect自动同步文件  expect指定host和要 ...

  7. 使用ansible批量管理远程服务器

    使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全 ...

  8. ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs

    ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs 第一部分:使用ssh key 实现服务器间的免密码交互登陆 步骤1: 安装openssh-clients [root@001 ...

  9. Fabric 源码学习:如何实现批量管理远程服务器?

    前不久,我写了一篇<Fabric教程>,简单来说,它是一个用 Python 开发的轻量级的远程系统管理工具,在远程登录服务器.执行 Shell 命令.批量管理服务器.远程部署等场景中,十分 ...

  10. 获取Shell后的操作

    对于Windows系统主机和Linux系统主机,获取Shell后的操作都不同. Windows 当我们通过对Web服务器进行渗透,拿到了该Web服务器的shell后,可以执行系统命令后,我们该如何操作 ...

随机推荐

  1. android创建桌面快捷方式(启动目标非项目的启动页)

    1.布局文件中,目标Activity加入以下filter <intent-filter>                  <action android:name="an ...

  2. Mac删除.DS_Store文件

    1.删除.DS_Store文件 sudo find ./ -name ".DS_Store" -depth -exec rm {} \; 2.禁止生成此文件 defaults wr ...

  3. java8中CAS的增强

    注:ifeve.com的同名文章为本人所发,此文在其基础做了些调整.转载请注明出处! 一.java8中CAS的增强 前些天,我偶然地将之前写的用来测试AtomicInteger和synchronize ...

  4. aix 维护常用命令

    errpt   - dH  :如果有记录表示硬故障件出现.#向ibm报修 mail:关键错误信息会以mail方式发给root用户.#根据报错程序联系相应厂家. df  -g: 文件系统不可以,当/va ...

  5. 3515 如何调试AT指令、查看拨号模块的打印

    冯sir给了一个在设备运行的程序serial,运行起来后可以敲指令输入AT指令,具体步骤如下: 1.将serial文件从U盘拷贝到设备里,U盘在设备系统下的目录是/stm/udisk/0/,但是注意设 ...

  6. OVER 分析函数

    over不能单独使用,要和分析函数:rank(),dense_rank(),row_number(),ntile ,sum(),avg()等一起使用. rank,dense_rank,row_numb ...

  7. win7 64的系统安装。net4.0总是提示安装未成功

    主要原因是Windows update的临时文件损坏,建议重命名该文件夹. 1. 开始——运行——cmd——键入net stop WuAuServ回车(停止windows update服务): 2. ...

  8. redis五种数据类型的使用(zz)

    redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...

  9. Ajax Step By Step3

    第三[.$.getScript()和$.getJSON()] jQuery 提供了一组用于特定异步加载的方法:$.getScript(),用于加载特定的 JS 文件: $.getJSON(),用于专门 ...

  10. 【转】 71道经典Android面试题和答案,重要知识点都包含了

    ,,面试题1.        下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存  B.内存回收程序负责释放无用内存   C.内存回收程序允许程序员直接释放内存 ...