在运维实战中,如果有若干台数据库服务器,想对这些服务器进行同等动作,比如查看它们当前的即时负载情况,查看它们的主机名,分发文件等等,这个时候该怎么办?一个个登陆服务器去操作,太傻帽了!写个shell去执行,浪费时间~~

这种情况下,如果集群数量不多的话,选择一个轻量级的集群管理软件就显得非常有必要了。ClusterShell就是这样一种小的集群管理工具,原理是利用ssh,可以说是Linux系统下非常好用的运维利器!
选择了clustershell这个软件(也简称clush),原因如下:
1)安装方便。一条指令就能轻松安装。
2)配置方便。很多集群管理软件都需要在所有的服务器上都安装软件,而且还要进行很多的连接操作,clustershell就相当的方便了,仅仅需要所有机器能够ssh无密码登录即可,然后只在一台服务器上安装clustershell即可。
3)使用方便。clustershell的命令相对来说非常简单,只有一两个指令以及三四个参数需要记。

一、部署clush环境

安装clush(可以yum直接安装,也可以源码安装)
# yum install -y clustershell

配置clush:
在/etc/clustershell目录下,手动创建groups文件
# touch /etc/clustershell/groups
# vim /etc/clustershell/groups
all: a1 host1 host2
name:host3 host4

需要注意的是all 是必须配置的,clush 有 -a 这个参数,主机间用空格分离。

clush命令:
clush -a 全部 等于 clush -g all
clush -g 指定组
clush -w 操作主机名字,多个主机之间用逗号隔开
clush -g 组名 -c  --dest 文件群发     (-c等于--copy)

注意:clush 是不支持环境变量的$PATH

二、下面依据实例对clush的使用进行说明
现在有四台服务器,主机名分别是ops-server1、ops-server2、ops-server3、ops-server4
需求:
利用ops-server1服务器控制其他三台服务器进行集群操作.
那么只需要在ops-server1上安装clustershell,并前提做好ops-server1主机和其他三台机器的ssh无密码登陆的信任关系即可.

下面是ops-server1服务器上的操作记录:
1)做好主机映射关系,将ip和主机名对应起来,使用比较方便。
[root@ops-server1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.102 ops-server2
192.168.1.118 ops-server3
192.168.1.108 ops-server4

2)做好ssh信任关系(最好事后验证下无密码信任关系)
[root@ops-server1 ~]# ssh-keygen -t rsa (产生本机的公私钥文件,否则没法做ssh信任关系,也没法使用ssh-copy-id命令)
[root@ops-server1 ~]# ssh-copy-id ops-server2
[root@ops-server1 ~]# ssh-copy-id ops-server3
[root@ops-server1 ~]# ssh-copy-id ops-server4

3)安装clush,然后配置clush(手动创建groups文件)
可以采用yum方式安装(yum install clustershell -y)
这里采用yum源码安装方式,下载clustershell-1.6.tar.gz,下载到/usr/local/src目录下
源码下载地址:http://openstorage.gunadarma.ac.id/pypi/simple/ClusterShell/
[root@ops-server1 ~]# cd /usr/local/src/
[root@ops-server1 src]# ls
clustershell-1.6.tar.gz
[root@ops-server1 src]# tar -zvxf clustershell-1.6.tar.gz
[root@ops-server1 src]# cd clustershell-1.6
[root@ops-server1 clustershell-1.6]# python setup.py install
-----------------------------------------------------------------------------------------------------
如果出现下面报错,说明Python默认没有安装setuptools这个第三方模块。
Traceback (most recent call last):
File "setup.py", line 35, in <module>
from setuptools import setup, find_packages
ImportError: No module named setuptools

解决办法:
安装setuptools(可以百度网盘下载,http://pan.baidu.com/s/1mhTDRBE  提取密码:xpmd),如下安装setuptools后,再次安装上面的clustershell就ok了。
[root@ops-server1 src]# wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
[root@ops-server1 src]# tar -zxvf setuptools-0.6c11.tar.gz
[root@ops-server1 src]# cd setuptools-0.6c11
[root@ops-server1 setuptools-0.6c11]# python setup.py build
[root@ops-server1 setuptools-0.6c11# python setup.py install

-----------------------------------------------------------------------------------------------------
[root@ops-server1 clustershell-1.6]# mkdir /etc/clustershell
[root@ops-server1 clustershell-1.6]# cp -r conf/* /etc/clustershell
[root@ops-server1 clustershell-1.6]# cd /etc/clustershell/
[root@ops-server1 clustershell]# ls
clush.conf groups groups.conf groups.conf.d

可以将groups文件里默认的示例内容全部注释,然后按照自己的集群管理需求自定义配置的组对应关系,(再次强调下:groups文件中的all组对应是必须要配置的,clush 有 -a 这个参数,主机间用空格分离。)
如下,配置组all,组db等的对应关系,这些组不是真实存在机器上的用户组,而是在groups文件中设置的别名而已,用以批量操作。
总之,可以在groups文件里设置多组对应关系,然后对组对应的主机进行远程操控!!!
[root@ops-server1 clustershell]# cat groups
#adm: example0
#oss: example4 example5
#mds: example6
#io: example[4-6]
#compute: example[32-159]
#gpu: example[156-159]
#all: example[4-6,32-159]
db: ops-server[2,3]
all: ops-server[2,3,4]

解下来就可以利用clush管理命令进行远程机器集群管理了,常用的是下面几个参数:
-g 后面指定设置的组
-a 表示所有的组
-w 后面跟主机节点,多个主机中间用逗号隔开
-x 表示去掉某个节点进行操作。后面跟主机节点,多个主机中间用逗号隔开
-X 表示去掉某个组进行操作,多个组之间用逗号隔开
-b 相同输出结果合并

注意,clush操作远程机器,执行动作要放在双引号或单引号内进行

[root@ops-server1 clustershell]# clush -g db uptime
ops-server2: 22:49:35 up 4 days, 14:24, 0 users, load average: 0.00, 0.01, 0.05
ops-server3: 22:49:42 up 11:13, 1 user, load average: 0.00, 0.01, 0.05
[root@ops-server1 clustershell]# clush -a uptime
ops-server2: 22:49:49 up 4 days, 14:24, 0 users, load average: 0.00, 0.01, 0.05
ops-server4: 22:49:42 up 8 days, 30 min, 0 users, load average: 0.00, 0.01, 0.05
ops-server3: 22:49:57 up 11:13, 1 user, load average: 0.00, 0.01, 0.05
[root@ops-server1 clustershell]# clush -a hostname
ops-server4: ops-server4
ops-server3: ops-server3
ops-server2: ops-server2

[root@ops-server1 clustershell]# clush -a "echo asdfsdf > /tmp/test"
[root@ops-server1 clustershell]# clush -a "cat /tmp/test"
ops-server4: asdfsdf
ops-server3: asdfsdf
ops-server2: asdfsdf

[root@ops-server1 clustershell]# clush -w ops-server3 'ifconfig|grep "inet addr"|grep 192.168'
ops-server3: inet addr:192.168.1.118 Bcast:192.168.1.255 Mask:255.255.255.0
[root@ops-server1 clustershell]# clush -w ops-server3,ops-server4 'ifconfig|grep "inet addr"|grep 192.168'
ops-server4: inet addr:192.168.1.108 Bcast:192.168.1.255 Mask:255.255.255.0
ops-server3: inet addr:192.168.1.118 Bcast:192.168.1.255 Mask:255.255.255.0

[root@ops-server1 ~]# clush -a hostname
ops-server2: ops-server2
ops-server3: ops-server3
ops-server4: ops-server4
[root@ops-server1 ~]# clush -b -a hostname
---------------
ops-server2
---------------
ops-server2
---------------
ops-server3
---------------
ops-server3
---------------
ops-server4
---------------
ops-server4
[root@ops-server1 ~]# clush -a "cat /etc/issue"
ops-server2: CentOS release 6.8 (Final)
ops-server2: Kernel \r on an \m
ops-server2:
ops-server4: CentOS release 6.8 (Final)
ops-server4: Kernel \r on an \m
ops-server4:
ops-server3: CentOS release 6.8 (Final)
ops-server3: Kernel \r on an \m
ops-server3:
[root@ops-server1 ~]# clush -b -a "cat /etc/issue"
---------------
ops-server[2-4] (3)
---------------
CentOS release 6.8 (Final)
Kernel \r on an \m

[root@ops-server1 ~]# clush -a -x ops-server4 hostname
ops-server3: ops-server3
ops-server2: ops-server2
[root@ops-server1 ~]# clush -a -x ops-server2,ops-server4 hostname
ops-server3: ops-server3

clush进行文件或目录分发:
--copy 表示从本地拷贝文件或目录到远程集群节点上,等于-c
--rcopy 表示从远程集群节点上拷贝文件或目录到本机上
--dest 前面表示本地要复制的文件或目录路径,后面表示远程机器的存放路径。--dest后面可以空格跟目标路径,也可以是=目标路径。  比如--dest /tmp 等同于 --dest=/tmp

本地拷贝文件到远程节点上
[root@ops-server1 ~]# cat test.file
test1
test2
123456
[root@ops-server1 ~]# clush -g db -c /root/test.file --dest /root/
[root@ops-server1 ~]# clush -g db "cat /root/test.file"
ops-server2: test1
ops-server2: test2
ops-server2: 123456
ops-server3: test1
ops-server3: test2
ops-server3: 123456

[root@ops-server1 ~]# clush -w ops-server4 --copy test.file --dest /root/
[root@ops-server1 ~]# clush -w ops-server4 "cat /root/test.file"
ops-server4: test1
ops-server4: test2
ops-server4: 123456

本地拷贝目录到远程节点上(注意,这里面拷贝目录时,不需要跟参数-r)
[root@ops-server1 ~]# mkdir /root/huanqiu
[root@ops-server1 ~]# clush -g db -c /root/huanqiu --dest /root/
[root@ops-server1 ~]# clush -g db "ls -l /root/huanqiu"
ops-server2: total 0
ops-server3: total 0

比如远程拷贝ops-server3和ops-server4节点上的/root/test到本机的/tmp目录下
[root@ops-server1 tmp]# pwd
/tmp
[root@ops-server1 tmp]# clush -w ops-server3,ops-server4 --rcopy /root/test --dest=/tmp/
[root@ops-server1 tmp]# ll
-rw-r--r--. 1 root root 9 Nov 25 02:06 test.ops-server3
-rw-r--r--. 1 root root 19 Nov 25 02:06 test.ops-server4

将所有节点的/etc/passwd文件拷贝到本机的/tmp目录下
[root@ops-server1 tmp]# clush -a --rcopy /etc/passwd --dest=/tmp
[root@ops-server1 tmp]# ll
total 16
-rw-r--r--. 1 root root 901 Nov 25 02:04 passwd.ops-server2
-rw-r--r--. 1 root root 854 Nov 25 02:04 passwd.ops-server3
-rw-r--r--. 1 root root 854 Nov 25 02:04 passwd.ops-server4
-rw-r--r--. 1 root root 9 Nov 25 02:06 test.ops-server3
-rw-r--r--. 1 root root 19 Nov 25 02:06 test.ops-server4

由此可以发现,远程拷贝文件到本机后,会在文件名的后面打上主机名的标记!

另外注意一个参数:
--user=username,这个表示使用clush命令操作时,登陆ssh时使用的用户。
比如:
ops-server1本机(root账号)管理ops-server2节点机的wangshibo账号下的操作,

首先做本机到wangshibo@ops-server2的ssh无密码登陆的信任关系
[root@ops-server1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub wangshibo@ops-server2
wangshibo@ops-server2's password:
Now try logging into the machine, with "ssh 'wangshibo@ops-server2'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

[root@ops-server1 ~]# ssh wangshibo@ops-server2
[wangshibo@ops-server2 ~]$

接着就可以进行远程管控了。注意:--user参数要紧跟clush后面
[root@ops-server1 ~]# clush -w --user=wangshibo ops-server2 hostname
Usage: clush [options] command

clush: error: option -w: invalid value: '--user=wangshibo'
[root@ops-server1 ~]# clush --user=wangshibo -w ops-server2 hostname
ops-server2: ops-server2

[root@ops-server1 ~]# clush --user=wangshibo -w ops-server2 "echo 123456 > test"
[root@ops-server1 ~]# clush --user=wangshibo -w ops-server2 "cat test"
ops-server2: 123456

登陆ops-server2的wangshibo用户下查看:
[wangshibo@ops-server2 ~]$ ls
test
[wangshibo@ops-server2 ~]$ cat test
123456

运维利器-ClusterShell集群管理操作记录的更多相关文章

  1. 运维利器-ClusterShell集群管理

    在运维实战中,如果有若干台数据库服务器,想对这些服务器进行同等动作,比如查看它们当前的即时负载情况,查看它们的主机名,分发文件等等,这个时候该怎么办?一个个登陆服务器去操作,太傻帽了!写个shell去 ...

  2. 大数据运维尖刀班 | 集群_监控_CDH_Docker_K8S_两项目_腾讯云服务器

    说明:大数据时代,传统运维向大数据运维升级换代很常见,也是个不错的机会.如果想系统学习大数据运维,个人比较推荐通信巨头运维大咖的分享课:https://url.cn/5HIqOOr,主要是实战强.含金 ...

  3. 《跟老男孩学Linux运维:Web集群实战》读书笔记

    Linux 介绍 Linux 安装 Linux 调优 Web 基础 Nginx 应用 LNMP 应用 PHP 缓存加速 Nginx 调优 MySQL 应用 NFS 网络文件共享 Nginx 反向代理与 ...

  4. Clustershell集群管理

    在运维实战中,如果有若干台数据库服务器,想对这些服务器进行同等动作,比如查看它们当前的即时负载情况,查看它们的主机名,分发文件等等,这个时候该怎么办?一个个登陆服务器去操作,太傻帽了!写个shell去 ...

  5. 运维利器-ClusterShell

    前言 和ansible类似,但是更加高效 安装 yum install -y clustershell clush命令: clush -a 全部 等于 clush -g all clush -g 指定 ...

  6. 运维-安装rabbitmq 集群

    服务器:   online-platform-rabbitmq-01 online-platform-rabbitmq-02 online-platform-rabbitmq-03 绑定HOSTS: ...

  7. Redis运维实战之集群中的脑裂

    1.对于分布式Redis主从集群来说,什么是脑裂? 所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求.而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客 ...

  8. LVS+Heartbeat 高可用集群方案操作记录

    之前分别介绍了LVS基础知识和Heartbeat基础知识, 今天这里简单说下LVS+Heartbeat实现高可用web集群方案的操作说明. Heartbeat 项目是 Linux-HA 工程的一个组成 ...

  9. Haproxy+Heartbeat 高可用集群方案操作记录

    之前详细介绍了haproxy的基础知识点, 下面记录下Haproxy+Heartbeat高可用web集群方案实现过程, 以加深理解. 架构草图如下: 1) 基本环境准备 (centos6.9系统) 1 ...

随机推荐

  1. 优化MySchool数据库(三)

    使用T_SQL 编写业务逻辑: 如何定义及使用“变量”: ---- 让电脑帮我记住一个名字(王二) C#: string   name ;    [定义一个变量] name = "王二&qu ...

  2. 转载文章----初识Ildasm.exe——IL反编译的实用工具

    转载地址http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要:(路径:C:\Program ...

  3. 使用git的分支功能实现定制功能摘取与组合的想法

    前言,这个想法应该是git比较通用的做法,只是我还没用过,所以把自己的想法记录在这里,督促自己以后按这个方式执行. 我们公司现在面临一个问题, 就是客户的定制需求很多,很杂,其中坑爹需求很多. 我还没 ...

  4. 初识Go

    意外关注到一位牛人的微信,提到了2014年他推荐的编程语言是Go.于是乎饶有兴趣的淘了一本书<Go语言程序设计>,学习起来. 第一章的练习题我的答案如下: // Copyright © 2 ...

  5. JavaScript Patterns 6.7 Borrowing Methods

    Scenario You want to use just the methods you like, without inheriting all the other methods that yo ...

  6. 【转发】揭秘Facebook 的系统架构

    揭底Facebook 的系统架构 www.MyException.Cn   发布于:2012-08-28 12:37:01   浏览:0次 0 揭秘Facebook 的系统架构 www.MyExcep ...

  7. Review 代码

    最近需要 Review 代码,学习了<代码整洁之道>.<代码质量>等书籍. 把对这些代码之道的学习心得整理成文

  8. Linux 性能优化工具 perf top

    1. perf perf 是一个调查 Linux 中各种性能问题的有力工具. NAME perf - Performance analysis tools for Linux SYNOPSIS per ...

  9. 烂泥:CentOS6.5光盘以及ISO镜像文件的使用

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 学习CentOS有一段时间了,在平时使用过程中.系统镜像以及光盘使用的比较多,这篇文章就从实用的角度介绍相关有关光盘与镜像文件的使用. 因为物理机相关的 ...

  10. ES6函数剩余参数(Rest Parameters)

    我们知道JS函数内部有个arguments对象,可以拿到全部实参.现在ES6给我们带来了一个新的对象,可以拿到除开始参数外的参数,即剩余参数(废话好多 O(∩_∩)O~). 这个新的对象和argume ...