parallel ssh tool

병렬 ssh 작업

여러 대의 리눅스 서버를 운영하는 경우 동시에 각 서버에서 작업을 하려고 할 경우 여러가지 방법이 있습니다.

ssh 스크립트 이용 : ssh 로 자동 로그인할 수 있게 만들고 쉘스크립트 만들어서 for loop 문 돌리면서 순차적으로 명령을 실행할 수 있습니다. for loop 로 순차적으로 작업을 할 경우 서버 댓수가 많아지면 그에 따라서 작업 속도가 느려집니다. 물론 for loop 안에서 각 명령을 백그라운드에서 돌릴 수 있도록 하거나 서버 목록을 나누어서 돌리는 방법등이 있지만 결과 리포팅받고 에러난 시스템 체크하는 등의 작업이 매우 귀찮습니다.

그래서 이러한 병렬 ssh 작업을 위한 툴들이 나옵니다.

clusterssh : clusterssh는 동시에 xterm 화면을 여러개 띄우고 한번 타이핑을 하면 동시에 같은 명령이 동시에 실행됩니다. 스크립트를 실행하기보다는 직접 순차적으로 명령어를 실행하는 형태입니다. 동시에 실행할 수 있는 호스트에 제한이 생길 수 있고 수작업을 여러 대의 서버에서 동시에 하는 방식이기 때문에 위험성이 있습니다. 그렇지만 소규모의 시스템에서 동시에 위험하지 않은 명령을 내리는 데는 유용할 수 있습니다. 그렇지만 x-windows 프로그램이기 때문에 gui 환경을 구성해야지요.
http://sourceforge.net/projects/clusterssh/

pssh : 한번 명령을 내리면 여러 대의 서버에서 동시에 명령을 실행할 수 있습니다.
http://code.google.com/p/parallel-ssh/

dist : naver 에서 개발. 한번 명령을 내리면 여러 대의 서버에서 동시에 명령을 실행할 수 있습니다.
http://dev.naver.com/projects/dist/

parallel ssh tools 동시에 ssh 실행하는 툴

  • clusterssh http://sourceforge.net/projects/clusterssh/
    ClusterSSH controls a number of xterm windows via a single graphical console window to allow commands to be interactively run on multiple servers over an ssh connection.
    ClusterSSH (cssh)는 동시에 여러개의 서버에 접속해서 일괄적인 명령어 실행이나 편집작업을 할 수 있는 툴입니다.
    clusterssh
    ClusterSSHHowto
  • pssh http://code.google.com/p/parallel-ssh/
    PSSH provides parallel versions of OpenSSH and related tools. Included are pssh, pscp, prsync, pnuke, and pslurp. The project includes psshlib which can be used within custom applications.
$ pssh --host=111.177.111.142 --host=111.177.111.143 -t 10 -i hostname
[1] 14:09:29 [SUCCESS] 111.177.111.143
h0-s1003.p0-nny.cdngp.net
[2] 14:09:29 [SUCCESS] 111.177.111.142
xfn-ag1-n1.panthercdn.com
$ cat hosts.txt
111.177.111.142
111.177.111.143
$ pssh -h hosts.txt -t 10 -i hostname 

-f 에 스크립트 지정 또는 -c 에 명령어 입력. 호스트 목록은 직접 입력하거나 파일에서 가져올 수 있음.
시스템 규모가 클 경우 -d delay time ms 단위. (threads 간의 지연시간), -n thread number (최대 1024) 를 조정해 주어야 한다. -t timeout 은 스크립트 실행시간을 지정하고 기본은 0 이다. --connection_timeout 는 sshd 에 대한 연결 타임아웃을 지정한다. http://dev.naver.com/projects/dist/ 의 내용 참고.

동시수행 서버 개수 지정옵션 –n -n 이 없을때의 디폴트값은 300 과 ‘대상 서버 숫자’ 중에서 작은 수 -n 값을 지정하면 –n 지정값과 ‘대상 서버 숫자’ 중에서 작은 수 어떻게 지정하더라도 최대값은 1024

$ dist -c "hostname" -d 200 -t 10  --connection_timeout=3  111.177.111.142 111.177.111.143
[111.177.111.142] [OUT] xfn-ag1-n1.panthercdn.com
[111.177.111.143] [OUT] h0-s1003.p0-nny.cdngp.net
[SUMMARY]         [MSG] TOTAL_TIME  = 5.10783600807
[SUMMARY]         [MSG] TOTAL_JOB   = 2
[SUMMARY]         [MSG] SUCCESS_JOB = 2
[SUMMARY]         [MSG] FAIL_JOB    = 0
[SUMMARY]         [MSG] WARNING_JOB = 0

$ cat hosts.txt
111.177.111.142
111.177.111.143
$ cat scripts/hostname.sh
#!/bin/bash
hostname
$ dist -f "scripts/hostname.sh" -d 200 -t 10 --connection_timeout=3 hosts.txt
$ dist -o -s 'hostname.sh' -c 'sudo ./hostname.sh' 10.40.204.109
  • pssh 와 dist 비교
    • pssh 에서는 호스트 목록은 파일에서 가져올 수 있지만 명령어는 직접 지정을 해야 한다. pscp 기능을 이용 직접 업로드 해야 한다. 반면 dist 는 명령어를 스크립트로 지정하면 자동으로 스크립트를 업로드하고 실행 후 삭제를 한다.
    • pssh 에서는 해당 호스트명과 결과과 여러 줄에 걸쳐서 나오지만 dist 에서는 한줄에 호스트명과 스크립트 실행결과를 볼 수 있다. 스크립트 작업시 dist 가 편리한 방식이라 생각이 든다.
    • pssh 에서는 ssh 옵션을 변경할 수 있다. 그러나 dist 에서는 .ssh/config 에 ssh config 설정을 하고 작업을 해야 한다.
    • dist 에서는 scp 기능도 함께 지원하고 레포팅도 편리하게 나옵니다. 그렇지만 ssh 옵션을 바꿀 수 없기 때문에 만약 리눅스 시스템의 ssh port 나 옵션이 다르게 설정이 되어있다면 dist 실행을 하는 쉘스크립같은 것을 만들어서 처리하는 것이 편리합니다.
    • pssh, dist 모두 멀티스레드 기능을 이용하여서 처리하는데 dist 의 경우 시스템 사양에 따라서 다르겠지만 서버 댓수가 천대 넘어가면 중간에 멈추는 경우가 있습니다. 이 부분은 쉘스크립트를 하나 짜서 적용할 호스트의 갯수를 적절하게 쪼개어서 나누어 처리하고 결과를 합치면 됩니다.