본문 바로가기

리눅스

SSH로 많은 서버에 동시에 같은 명령내리기

SSH로 많은 서버에 동시에 같은 명령내리기

예전에 PuTTYCS - 여러개의 putty를 띄워 같은 작업을 동시에 라는 글을 올리고 나서 주변에서 듣는 말.

"그거 기껏해야 수십 대 정도밖에 안되는거 아니에요? 관리해야 할 서버가 몇댄데..."

"화면은 안봐도 되니 그냥 자동화시켜 쭉 돌려버리고 싶어요."

"후후 전 이미 그런 작업을 하기위한 스크립트를 만들어(기존에 있는 걸 약간 고쳐서) 쓰고 있어요. 즐~"

"간단하게 하려면 ssh cmd로 해도 되긴 한데 여러 줄 명령을 못 내리기 때문에 여러 줄 명령을 실행하려면 스크립트를 서버 쪽으로 보내서 실행해야 하는 문제가 있어요."

등등...

뭐 맞는 말도 있고 틀린 말도 있다. 
PuttyCS는 예전에 구글에서도 쓴다고 소개한 적 있는 clusterssh처럼 많아야 십여대정도 서버에 인터렉티브하게 함께 보면서 작업하고 싶을 때 쓰는 것이다.

만약 그 단위가 수백 대, 수천 대 단위로 넘어간다면 한 화면에 보기는 불가능하고 어떤 자동화된 절차를 통해서 명령을 내려야 할 것이다.

그렇다면 어떻게 그런 작업을 할 수 있을까?
ssh을 통해 특정서버에 명령을 실행시키려면 다음과 같이 한다.

<myserver 서버에 id로 로그인 하여 ls명령 실행>
ssh id@myserver ls

<ssh키를 등록해놓았을 때는 id는 생략하고 로그인 절차 없이 바로 실행, ;로 구분하여 여러 명령 실행>
ssh myserver "ls -la;df"

그러면 여러줄의 명령이나 특정 쉘스크립트,Perl스크립트 등등을 원격서버에 실행 시키면 어떻게 해야 할까? 간단한 쉘명령이야 ;로 나눠서 한 줄에 넣어서 실행하면 되지만 작업이 복잡해지면 그런 형태로는 한계가 있다. 그럴때는 다음과 같은 방법을 쓸 수 있다.

<HEREDOC을 사용하는 방법>
ssh myserver <<\EOF
ls -la
df
EOF

<별도의 쉘스크립트를 만들고 원격에 스크립트 해석기를 실행시키고 파이프나 리다이렉션으로 보내는 방법>
#!/bin/sh
ls -la
df
가 test_script.sh 이라고 하면

cat test_script.sh | ssh myserver sh
또는
ssh myserver sh < test_script.sh

<Perl 스크립트를 ssh를 통해 실행>
cat perl_script.pl | ssh myserver perl
또는
ssh myserver perl < perl_script.pl  

이것을 기초로 여러 서버에 명령을 내리려면 다음처럼 서버의 리스트를 만들고 리스트에 대해 루프를 돌면서 위의 명령을 서버별로 실행하면 될 것이다.

<여러 서버에 루프를 돌면서 지정한 스크립트를 실행하는 스크립트>
#!/bin/sh
SERVERS="
myserver1
myserver2
"
for m in $SERVERS
do

ssh $m sh < test_script.sh

done

이렇게 하면 문제는 순차적으로 실행을 하기 때문에 한 서버씩 실행이 끝날 때 까지 기다려야 해서 속도가 늦고 나중에 결과를 보기가 힘들다는 것이다.

그러면

ssh $m sh < test_script.sh
줄을 다음과 같이
ssh $m sh < test_script.sh > $m.log &
고치면 각 ssh 명령이 fork되어서 백그라운드로 돌고 각 서버에 대한 결과는 서버이름.log 파일로 남게 된다. ( 작업결과는 *.log 파일들에 대해 grep이나 기타 유틸리티로 일괄적으로 확인 가능할 것이다. )

지금까지는 별도의 프로그램을 쓰지 않고 순수하게 기본 명령과 쉘스크립트 가지고 하는 방법이다. 하지만 이런 류의 작업은 다수의 서버를 관리 할 때 빈번하게 발생하므로 좀 더 많은 기능을 지원하면서 이런 작업을 해주는 프로그램이 많다.

shmux 라는 프로그램이 그런 것 중 하나인데 http://web.taranis.org/shmux/ 에 가보면 아랫쪽에 비슷한 기능을 하는 다음과 같은 프로그램 리스트가 쭉 있다.

그리고 최근에 NHN에서 새로 문을 연 네이버개발자센터에서도 내부적으로 python으로 개발했다는 이런 류의 작업을 하는데 쓰는 dist라는 프로그램을 공개했다.