2010년 4월 8일 목요일

명령어 하나로 여러대 자원 관리하기 (SSH 인증키 사용)-[펌]

명령어 하나로 여러대 자원 관리하기 (SSH 인증키 사용)

문제의 요점은 여러대의 동일한 시스템을 관리하는데 있어서 반복되는 작업이 잦다는것..
이걸 어떻게하면 좀더 편리하게 할수 있느냐에서 출발한다.

물론 주기적으로 반복되는 명령어 작업이라면 CRON을 통해서 스케줄을 걸어두면 되겠지만 문제는 비정기적인 작업이다.

원리는 SSH 인증키를 가지고 스크립트를 만들어서 작업하면 100대, 1000대라도 문제 없다는것!!
SSH 인증키란 간단히 말해서 나와 서버간의 약속된 키이다.


인증키 생성하기
인증키는 ssh-keygen를 통해서 만든다. 키를 생성할때 사용할 키의 형태를 지정해 주는데 원격 서버가 SSH 프로토콜 버전 2를 지원한다면(요즘은 기본지원한다.)  rsa, dsa  프로토콜 1만을 지원한다면 rsa1 을 사용하면 된다.
컨트롤할 서버에서 인증키를 생성한다.

키가 저장될 곳과 이름을 물어 오는데 디폴트로 그냥 엔터를 치고 넘어가면, 다음과 같이 인증키 암호를 물어온다. 원하는 암호를 두번 반복해서 입력해주면 키가 생성된다.
인증키 생성시 인증키 암호를 공백으로 (passphrase 를 물어올때 그냥 엔터를 치면 된다) 만들경우에는 ssh 접속시 암호를 입력하지 않아도 그냥 접속이 되므로 편리하나 키관리에 주의를 기울여야 한다...

우리는 암호없이 접근하려고 하니깐 그냥 엔터 (Enter)  

[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
ea:24:ca:36:af:99:e6:4f:96:d2:b6:0f:25:75:fc:ea mojily@chonnom.com

※ -t : type   Specify type of key to create.


공개키 사용하기
기본 경로에 키를 저장하였다면 /root/.ssh/ 위치에 id_rsa 와 id_rsa.pub가 생성되어 있다.
.pub 확장자가 붙은 것이 공개키로 이 파일을 관리할 원격서버들의 ~/.ssh/ 에 authorized_keys 라는 이름으로 복사해준다.
scp 를 이용해서 파일을 밀어 넣어준다.

[root@localhost .ssh]# scp id_rsa.pub root@xxx.xxx.xxx.xxx:/root/.ssh/authorized_keys
root@xxx.xxx.xxx.xxx's password:
id_rsa.pub                                                                                                                  100%  397     0.4KB/s   00:00


관리대상의 서버들에 접속해서 보면 authorized_keys 부분이 확인된다.

[root@localhost .ssh]# ls -al
total 24
drwxr-xr-x 2 root root 4096 Jan 26 11:29 .
drwxr-x--- 5 root root 4096 Jan 26 11:29 ..
-rw-r--r-- 1 root root  397 Jan 26 11:29 authorized_keys


기본적인 작업은 다 끝났다...
컨트롤할 서버에서 작업대상 원격 서버로 ssh 접근을 시도해보면...암호인증없이 로그인이 되는걸 확인가능하다.

[root@mojily .ssh]# ssh -lroot xxx.xxx.xxx.xxx
Last login: Tue Jan 26 11:32:28 2010 from xxx.xxx.xxx.xxx
[root@localhost ~]#


이제는 이걸 스크립트화 시켜서 리스트로 관리하는 부분이다.
나 같은 경우에는 IDC 별로 서버가 존재하여 함수를 이용해서 관리대상 서버들을 나눌것이다.
 - remote_controal.sh

function get_nodes_1
{
cat <<EOF
192.168.0.111
192.168.0.112
EOF
}

function get_nodes_2
{
cat <<EOF
192.168.1.111
192.168.1.112
EOF
}

function get_nodes_3
{
cat <<EOF
192.168.2.111
192.168.2.112
EOF
}

case "$1" in

sh)

echo "###########################################"
echo "#                         [1] KT-ICC                               #"
echo "#                         [2] LG-Dacom                          #"
echo "#                         [3] SK-IDC                               #"
echo "###########################################"

echo -n "Select Center Number ^^;; : "
read num

get_nodes_$num | while read server ; do
        ssh -q -o 'BatchMode yes' $server "$2"  &
        wait
done;;

help)          # sh 옵션을 통해서 명령어 전달!!
cat <<EOF
sh
EOF
;;
*)

$0 sh "$1"
;;
esac

※ usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
           [-D port] [-e escape_char] [-F configfile]
           [-i identity_file] [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [user@]hostname [command]


간단하게 설명하자면 get_nodes1 / get_nodes_2 / get_nodes_3 이라는 리스트로 서버를 나누고 Select Number 에 의해서 선택된 그룹으로 while 문을 이용해 명령어를 보낸다는 것이다.


EX )사용법 예제
 - 서버가 여려대일 경우 어떤서버인지 확인이 안되니깐... hostname 으로 서버를 찍어주고 해당 서버에 날짜와 시간을 확인하는 예제이다.

[root@localhost ]# ./remote_controal.sh 'hostname; date'

###########################################
#                         [1] KT-ICC                               #
#                         [2] LG-Dacom                          #
#                         [3] SK-IDC                               #
###########################################

Select Number ^^;; : 3
SK1
Tue Jan 26 11:24:27 KST 2010
SK2
Tue Jan 26 11:24:27 KST 2010 

댓글 없음:

댓글 쓰기