본문 바로가기

OS

linux 에서 SSH로 여러 서버 관리하기.

출처 : http://www.gruter.co.kr/170

리눅스를 쓰다보니 디버깅은 힘들지만
나처럼 수개의 서버에 동일한 프로그램을 돌리고 관리하고 하는 부분에 있어서 참으로 편리한 기능이 있다.

이것을 모르고
10대를 계속해서 들어갔다 나왔다,
파일을 올렸다 내렸다 하는 삽짓을 시간 허비하면서 했었다...

hadoop의 bin디렉토리를 보다보니 자동으로 각 노드들을 관리하는 것을 보니 이렇게 관리하는 구나.. 라고 느껴 방법론을 찾아봤다.(역시 검색이 짱이다.^^)

SSH 자동 로그인을 통한 이러한 방법은
통제하기 위한 메인 서버에서 각 서버에 로그인 할 수 있는 공개키를 제공하고 각 서버는 해당 서버에서 들어오는 메시지를 그 공개키를 이용하여 받아들이는 구조로 되어 있다.

그래서 관리서버는 공개키를 생성해야 한다.

[ home@user]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
이러한 류의 물어보기 메시지 들이 나오는데
쉽게 가려면 그냥 엔터를 치면 된다. 계속해서
그러면 최종적으로
The key fingerprint is:
7e:c9:8e:75:69:ad:50:86:ab:97:a8:ba:5e:d3:a2:a1user@hostname
이러한 키가 만들어졌다고 나온다.

이때 .ssh 폴더 밑에는
id_rsa id_rsa.pub 과 같은 두개의 파일이 생성된다.

이중에 확장자가 pub인 공개키를 slave서버들에게 복사해주면 된다.

그러기 위해서 slave서버들에 있는 user의 home디렉토리 밑에 .ssh폴더가 생성되어 있어야 한다.
해당 유저가 다른 서버로 로그인 하지 않앗었다면
기본적으로 생기지 않기 때문에 user추가한 후에 강제로 mkdir .ssh로 생성해줘야 한다.

각 user생성은 웬만해서 users그룹에 넣는 것이 좋다.
그렇지 않다면 접근권한 문제등으로 인하여 잘 안되는 경우가 있다

이제 복사한다.

scp .ssh/id_rsa.pub user@slave01:.ssh/authorized_keys

리눅스엔 서버간 파일카피 명령인 scp가 존재 한다... 이런 좋은 함수가 ㅎㅎ
이경우 타서버에 처음 접속시엔 연결하고 저장할것이냐고 물어보고 slave에 공개키가 존재하지 않기 때문에 slave서버의 비밀번호를 물어보게 된다.

The authenticity of host 'slave01 (00.00.00.00)' can't be established.
RSA key fingerprint is 77:c8:a3:79:9e:ee:97:f8:28:d0:12:ca:10:1d:cc:a1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'slave01,000.000.000.000' (RSA) to the list of known hosts.
user@slave01's password:
id_rsa.pub 100% 408 0.4KB/s 00:00

마지막 100% 카피되었음을 알리는 메시지가 나오면 정상이고
그렇지 않으면 상대방서버의 해당 user의 디렉토리나 파일에 대한 접근권한이 문제가 된다.
나같은 경운 접근권한 문제가 되었을때 여러가지 chmod로 변경해 보았으나 여전히 재암호를 물어보는 통에 해당 유저를 삭제하고 다시 users 그룹으로 재생성하였다.

이제 해당 slave로 ssh 로그인 하면 암호를 묻지 않고 바로 접속 가능하다.
즉 ssh slave01 을 입력하면 slave의 암호를 묻지 않는다.

예로 slave의 hostname을 알고 싶으면
ssh slave01 hostname
이렇게 치면 slave01에 로그인 해서 hostname을 실행한 후 나오는 결과를 가지고 온다.

사실 여기 까지는 찾아찾아 성공했다만
shell프로그램에서 헤메다 결국 jaso님에게 SOS..^^

jaso님이 참고로 써라고 짜준 간단한 shell파일이다.
//exec.sh

#!/bin/sh
HOSTLIST=hostlist.dat
if [ ! -n "$1" ]
then
echo "usage: $0 \"command arg1 arg2 \""
exit 1
fi
for i in `cat $HOSTLIST`
do
echo $i "$*"
ssh $i "$*"
done

hostlist.dat에 slave hostname을 넣고
exec.sh 명령어를 치면
각 hostname서버에 접속해서 해당 명령어를 실행한 후의
결과값들이 쭈욱 나온다...

'OS' 카테고리의 다른 글

[Linux] Telnet 접속 안될때 세팅 - 패도라  (0) 2011.10.18
[linux] fedora 방화벽 설정 해제  (0) 2011.10.18
[linux] RPM 사용법  (0) 2011.10.18
[Linux] 보안점검  (0) 2011.10.18
[LINUX] 심볼릭링크 만들기 ln  (0) 2011.10.18