더북(TheBook)

초보 시스템 관리자의 일기 | 병렬 ssh를 이용해서 여러 시스템에 ssh 명령 전달하기

직접 콘솔 앞에서 작업하기보다 ssh 원격 접속이 편리하기는 하지만, 여러 시스템을 대상으로 하는 작업은 여전히 머리 아픈 일이다. 이러니 50대의 리눅스 시스템에 일일이 ssh로 접속해서 ls 명령을 내려야 한다면 얼마나 끔찍할까. 파일 하나를 50대의 시스템에 전송하기 위해 scp 명령을 50번 입력해야 한다니! 으악!

그래서 셸 스크립트를 만들어봤는데… 생각보다 선배의 반응이 신통치 않다.

#!/bin/bash

ssh host1 'command1'
ssh host1 'command2'
ssh host2 'command3'

‘바퀴를 다시 발명할 필요는 없다’는 말처럼 오늘 선배가 소개해준 병렬 ssh는 시스템 관리를 쉽게 만들어주는 유용한 도구임에 틀림없다. 뭐 기본적인 아이디어는 간단하다. 병렬 ssh는 단 한 번의 입력만으로 여러 SSH 서버에 같은 명령을 실행하고 그 결과를 화면에 출력하거나 파일로 저장해준다.

특히 다음과 같은 상황에서 유용하게 사용할 수 있다.

여러 SSH 서버에 동일한 명령을 실행할 때

여러 SSH 서버에 같은 파일을 배포할 때

여러 SSH 서버에서 같은 파일을 받아올 때

여러 SSH 서버를 대상으로 한다는 점을 기억하자. 특히 모든 SSH 서버가 공개키 인증을 사용하고 있어야 매번 로그인 패스워드를 입력하는 수고를 덜 수 있다.

호스트에서 server01과 server02의 SSH 서버를 대상으로 병렬 ssh를 사용하여 동시에 명령을 실행한다. 각 게스트에는 SSH 서버가 설치되어 있어야 하며 호스트 losttemple의 개인키를 보관하고 있어야 한다 (아직 준비가 되어 있지 않다면 ‘SSH 서버 설치하기’를 참고해서 SSH 서버를 준비하고 ‘공개키 인증 사용하기’를 참고해서 개인키를 전송하자).

그림 6-10 병렬 ssh를 사용해서 시스템 제어하기

병렬 ssh인 pssh 패키지를 설치한다.

shinjaehun@losttemple:~$ sudo apt-get update
shinjaehun@losttemple:~$ sudo apt-get install pssh

여러 SSH 서버에 동일한 명령을 실행하는 도구는 parallel-ssh이다. parallel-ssh [옵션] [호스트] [수행할 명령] 형식으로 명령을 실행한다. 다음 명령은 server01에 uptime 명령을 실행할 것이다. -H로 대상 호스트를 지정하고 -l로 명령을 실행할 사용자를 지정한다. -i는 결과를 화면에 출력하는 옵션이다. 참고로 uptime은 시스템을 시작한 이후 지금까지의 시간을 알려주는 명령이다.

명령을 실행하면 개인키의 패스구문을 요구할 것이다. 패스구문을 입력하고 나면 바로 아래 실행 결과가 나타날 것이다.

shinjaehun@losttemple:~$ parallel-ssh -H 192.168.122.201 -l administrator -i uptime
[1] 15:51:44 [SUCCESS] 192.168.122.201
15:51:44 up 1 min, 0 users, load average: 0.08, 0.07, 0.03

-H-l로 호스트와 사용자를 분리하지 않고 -H [사용자]@[호스트] 형식으로 입력해도 결과는 같다.

shinjaehun@losttemple:~$ parallel-ssh -H administrator@192.168.122.201 -i uptime

공백을 넣어서 여러 호스트를 대상으로 명령을 실행할 수 있다. server01(192.168.122.201)과 server02(192.168.122.202)를 대상으로 uptime 결과가 화면에 표시된다.

shinjaehun@losttemple:~$ parallel-ssh -H "192.168.122.201 192.168.122.202" -l administrator -i uptime
[1] 15:52:35 [SUCCESS] 192.168.122.201
15:52:35 up 2 min, 0 users, load average: 0.03, 0.06, 0.03
[2] 15:52:36 [SUCCESS] 192.168.122.202
15:52:36 up 2 min, 0 users, load average: 0.03, 0.05, 0.03

이렇게 일일이 호스트를 적어서 명령을 실행하는 게 여러모로 불편하다. 오타가 발생할 수도 있고 셸에서 한 번에 입력할 수 있는 텍스트 수도 제한되어 있기 때문이다. 병렬 ssh는 대상 호스트를 별도로 파일에 저장해서 명령을 실행하는 기능을 제공한다. nodes라는 파일을 생성해보자.

shinjaehun@losttemple:~$ vi nodes

IP 주소, 도메인 주소, 호스트 이름 모두 사용 가능하다. 여기에서는 IP 주소를 입력했다.

192.168.122.201
192.168.122.202
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.