服务器多了,原始操作就会出现弊端,假如同时给成百上千台服务器执行一个命令,拷贝一个文件,杀一个进程等,就需要逐个连接服务器进行操作,累死运维小哥。有什么简化运维管理的工具呢?
可以编写shell脚本使用for循环,但是这样做一方面不确定操作是否成功,另一方面for循环语句性能不好,因为命令是同步执行的。那有什么效率高,且使用方便的工具呢?这类工具已经有很多了,比如 pdsh,mussh,cssh,dsh等还有这里提到的pssh:
pssh是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便。
安装pssh
pssh安装还是非常简单的,前提需要Python环境的支持。
#下载安装包
wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz
#解压
tar -zxvf pssh-2.3.1.tar.gz
cd pssh-2.3.1
#安装
python setup.py install
介绍pssh命令,参数
参数:
-h 执行命令的远程主机列表 或者 -H user@ip:port 文件内容格式[user@]host[:port]
-l 远程机器的用户名
-P 执行时输出执行信息
-p 一次最大允许多少连接
-o 输出内容重定向到一个文件
-e 执行错误重定向到一个文件
-t 设置命令执行的超时时间
-A 提示输入密码并且把密码传递给ssh
-O 设置ssh参数的具体配置,参照ssh_config配置文件
-x 传递多个SSH 命令,多个命令用空格分开,用引号括起来
-X 同-x 但是一次只能传递一个命令
-i 显示标准输出和标准错误在每台host执行完毕后
命令:
pscp 传输文件到多个hosts,类似scp
pslurp 从多台远程机器拷贝文件到本地
pnuke 并行在远程主机杀进程
prsync 使用rsync协议从本地计算机同步到远程主机
远程控制服务器
远程控制服务器有两种模式:登录模式和命令模式
登录模式:将会登录到远程服务器的终端
命令模式:只会远程执行命令,返回结果,不会登录。
如下所示:
[root@test pssh]# pssh -H root@192.168.22.211 -A -P date
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
192.168.22.211: 2016年 03月 23日 星期三 14:56:24 CST
[1] 14:56:25 [SUCCESS] root@192.168.22.211
-A:提示输入密码,-P:返回执行结果
建立安全连接
操作的时候每次都要输入密码,服务器数量多的话操作很麻烦,所以要用到ssh安全连接,将本地加密的安全密钥文件,拷贝到远程服务器上。建立一个单向信任的连接,放到 .ssh文件夹中,下面测试将在22.210服务器上进行。
ssh-keygen 创建公钥和密钥,使用数字签名RSA
[root@test pssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
55:6c:23:2a:2b:9b:21:b7:6f:73:02:b7:49:7c:fb:43 root@test.master
The key's randomart image is:
+--[ RSA 2048]----+
| .. |
| ..+ |
| ..o . |
| . .. |
| . oS |
| . = = . E |
| o X + o |
| + * o . |
| o.+ ... |
+-----------------+
查看是否创建
[root@test pssh]# cd /root/.ssh/
[root@test .ssh]# ls
id_rsa id_rsa.pub known_hosts
将公钥复制到远程主机上
[root@test .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.22.211
root@192.168.22.211's password:
Now try logging into the machine, with "ssh 'root@192.168.22.211'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
在次连接远程主机时,不用输入密码
[root@test .ssh]# ssh root@192.168.22.211
Last failed login: Wed Mar 23 14:49:56 CST 2016 from 192.168.22.210 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Wed Mar 23 14:47:37 2016 from 192.168.22.210
[root@adminjc ~]#
PSSH小试
编写Host文件
[root@test .ssh]# vim HostList
插入内容:格式为:用户名+@+主机ip+:端口号,端口号默认为22,可不写。其他端口号要写明
root@192.168.22.211
root@192.168.22.212
root@192.168.22.213
root@192.168.22.214
以上写的就是要远程控制的主机列表
PSSH批量执行命令,并行命令的执行。
pssh -h HostList -P "command"
""里面可以输入命令串
例如:
在从节点建立新目录/home/slave/test
pssh -h HostList -P "mkdir /home/slave/test"
执行日志命令,返回各服务器时间
[root@test .ssh]# pssh -h HostList -P date
192.168.22.212: 2016年 03月 23日 星期三 16:30:43 CST
[1] 16:30:43 [SUCCESS] root@192.168.22.212
192.168.22.211: 2016年 03月 23日 星期三 16:30:43 CST
192.168.22.214: 2016年 03月 23日 星期三 16:30:44 CST
[2] 16:30:43 [SUCCESS] root@192.168.22.211
[3] 16:30:43 [SUCCESS] root@192.168.22.214
192.168.22.213: 2016年 03月 23日 星期三 16:30:44 CST
[4] 16:30:44 [SUCCESS] root@192.168.22.213
[root@test .ssh]#
-p选项指定同时执行的线程数
[root@test .ssh]# pssh -h HostList -p 2 -P date
pscp命令,批量复制文件到远程主机
pscp是远程拷贝文件,如从主节点将文件分发到所有从节点
[root@test .ssh]# vim psshtest
[root@test .ssh]# pscp -h HostList -r psshtest /usr/local/
[1] 16:40:26 [SUCCESS] root@192.168.22.211
[2] 16:40:26 [SUCCESS] root@192.168.22.213
[3] 16:40:26 [SUCCESS] root@192.168.22.214
[4] 16:40:26 [SUCCESS] root@192.168.22.212
[root@test .ssh]#
小结
pssh就介绍到这,集群管理工具有很多,比如后面要说的SaltStack,puppet,func等功能一个比一个强大。
环境加速成长,当只有一台服务器时,手工操作其实也没事,完全应付的过来;但是当服务器数量多了以后,就必要要考虑,怎么才能提高效率,减少错误。选择合适的工具能够有立竿见影的效果。