Clustershell集羣管理

在運維實戰中,若是有若干臺數據庫服務器,想對這些服務器進行同等動做,好比查看它們當前的即時負載狀況,查看它們的主機名,分發文件等等,這個時候該怎麼辦?一個個登錄服務器去操做,太傻帽了!寫個shell去執行,浪費時間~~python

這種狀況下,若是集羣數量很少的話,選擇一個輕量級的集羣管理軟件就顯得很是有必要了。ClusterShell就是這樣一種小的集羣管理工具,原理是利用ssh,能夠說是Linux系統下很是好用的運維利器!
選擇了clustershell這個軟件(也簡稱clush),緣由以下:
1)安裝方便。一條指令就能輕鬆安裝。
2)配置方便。不少集羣管理軟件都須要在全部的服務器上都安裝軟件,並且還要進行不少的鏈接操做,clustershell就至關的方便了,僅僅須要全部機器可以ssh無密碼登陸便可,而後只在一臺服務器上安裝clustershell便可。
3)使用方便。clustershell的命令相對來講很是簡單,只有一兩個指令以及三四個參數須要記。nginx

1、部署clush環境shell

安裝clush(能夠yum直接安裝,也能夠源碼安裝)
# yum install -y clustershell數據庫

配置clush:
在/etc/clustershell目錄下,手動建立groups文件
# touch /etc/clustershell/groups
# vim /etc/clustershell/groups
all: a1 host1 host2
name:host3 host4vim

須要注意的是all 是必須配置的,clush 有 -a 這個參數,主機間用空格分離。服務器

clush命令:
clush -a 所有 等於 clush -g all
clush -g 指定組
clush -w 操做主機名字,多個主機之間用逗號隔開
clush -g 組名 -c --dest 文件羣發 (-c等於--copy)運維

注意:clush 是不支持環境變量的$PATHdom

2、下面依據實例對clush的使用進行說明
如今有四臺服務器,主機名分別是ops-server一、ops-server二、ops-server三、ops-server4
需求:
利用ops-server1服務器控制其餘三臺服務器進行集羣操做.
那麼只須要在ops-server1上安裝clustershell,並前提作好ops-server1主機和其餘三臺機器的ssh無密碼登錄的信任關係便可.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操做遠程機器,執行動做要放在雙引號或單引號內進行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
------------------------------------------------------------------------------------------------
若是出現下面報錯:
[root@ops-server1 clustershell]# clush -g db uptime
ops-server2: Host key verification failed.
clush: ops-server2: exited with exit code 255
ops-server3: Host key verification failed.
clush: ops-server3: exited with exit code 255

緣由多是ssh首次登錄的時候,會提示輸入"yes/no",須要提早將這個執行。
[root@ops-server1 clustershell]# ssh ops-server2
The authenticity of host 'ops-server2 (192.168.1.102)' can't be established.
RSA key fingerprint is 89:29:5b:26:c1:3a:94:10:10:bd:7c:aa:6b:e5:0c:1c.
Are you sure you want to continue connecting (yes/no)? yes #這裏要輸入yes
.......

[root@ops-server3 clustershell]# ssh ops-server3
The authenticity of host 'ops-server2 (192.168.1.118)' can't be established.
RSA key fingerprint is 89:29:5b:26:c1:3a:94:10:10:bd:7c:aa:6b:e5:0c:1c.
Are you sure you want to continue connecting (yes/no)? yes #這裏要輸入yes
.......
------------------------------------------------------------------------------------------------
[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

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
因爲clush是基於ssh和scp命令進行封裝的一個工具,默認的ssh端口若是不是22,那麼在執行clush命令的時候須要指明端口:
1)進行文件傳輸時, 須要加 -o -P57891 即大寫P
2)進行直接訪問(批量執行操做命令)時, 須要加 -o -p57891 即小寫P

# clush -g virtual -o -P22222 -c /data/ntpcheck.sh --dest /data/# clush -g virtual -o -p22222 /etc/init.d/nginx restart

相關文章
相關標籤/搜索