최상단

컨텐츠

[Tip] 여러 서버를 동시에 패치하기

글 정보

Category
컴퓨터 이야기
2007. 4. 6. 17:25

본문

우리 팀의 프로젝트는 여러 대의 서버를 엮어 하나의 시스템으로 구축하는 일을 하기 때문에(지금은 서버 12대..덜덜덜), 개발 도중 새로운 실행파일을 생성하게 되면 이를 각 시스템에 패치하는 작업도 만만치 않다. 물론 이를 쉽게하기 위해 각 서버마다 갱신된 파일을 메인 서버에서 다운 받도록 되어있기는 하지만, 이를 가능하게 하는 프로그램은 직접 갱신을 해줘야 하기 때문에 이 프로그램은 직접 패치를 해줘야 한다...(물론, 파일이름을 바꿔서 받은 다음. 요리 저리 해서..자동으로 패치하도록 하는것도 가능할 것 같기는 하다..)

여튼! 지금 회사에서는 서버 하나하나에 telnet으로 접속 후 운영중인 프로세스를 다운 시키고 ftp로 로긴한 담에....파일 업로드 하고..다시 telnet 접속해서 프로세스를 업 시킨다.;
그 중 내가 작업해야하는 양은.........최소7대-_-;;;
초 귀찮다...ㅋㅋ 저번에 이렇게 하는거라고 대충 알려주고..오늘 또 패치됐다고 시키길래..
그냥 스크립트를 만들어버렸다-_-;;

우선..ftp에 접속해서 자동으로 파일을 업로드 하는 스크립트!
이 작업을 하기 전에
홈 디렉토리에 .netrc 파일을 생성하여
호스트 이름. 아이디. 비밀번호를 저장시켜 놓아야한다.

======================= ~/.netrc  ============================
machine 호스트_아이피    login   아이디  password    비밀번호
machine 호스트_아이피    login   아이디  password    비밀번호
machine 호스트_아이피    login   아이디  password    비밀번호
machine 호스트_아이피    login   아이디  password    비밀번호
machine 호스트_아이피    login   아이디  password    비밀번호
============================================================

뭐..대충 이런 식으로 작성해 놓으면 된다..

그리고...실제로 ftp에 접속해서 파일을 업로드 하는 스크립트~!!

============================ up.sh ============================
ftp $1 <<END
bin
hash
prompt
lcd 업로드할 파일이 있는 디렉토리
cd 호스트에 파일을 업로드할 디렉토리
put 파일이름
chmod 777 파일이름
quit
END
=============================================================

// $1 -> up.sh 실행시 첫번째 argument
            up.sh naver.com 이라고 입력하면 ftp naver.com 과 같은 효과.
// bin -> 바이너리 모드로 전환
// hash -> 전송과정 표시
// prompt -> (y/n) 과정을 묻지 않음
// lcd -> 로컬 디렉토리 변경
// cd -> 리모트 디렉토리 변경
// put -> 당연히 파일 업로드
// chmod 777 파일이름


그리고...이 up.sh를 사용해서 실제 호스트 이름을 지정해주는 스크립트!!

=====================PROGRAM_PATCH.sh======================
#!/bin/bash
hosts="
        172.16.5.133
        172.16.5.134
        172.16.5.135
        172.16.5.136
        172.16.5.137
        172.16.5.138
        172.16.5.139
        "

for host in $hosts
do
    ./.up.sh $host
done
exit 0
=============================================================

뭐..간단하게.............이렇게 해서..........ㅅ-ㅅ
실행하도록 했다....


여기까지 하면...........파일 업로드는 끝~!

그 다음...각 호스트에 자동으로 telnet 연결을 해서 자신이 원하는 명령어를 실행하고 빠져나오기~!..

=============================================================
#!/usr/bin/env python
import sys, telnetlib

# HOST LIST
hosts = [
            '172.16.5.133',
            '172.16.5.134',
            '172.16.5.135',
            '172.16.5.136',
            '172.16.5.137',
            '172.16.5.138',
            '172.16.5.139'
        ]

# USER ID
user = 'USER_ID\n'
# USER PASSWORD
password = 'USER_PASSWORD\n'

print 'This script will execute /etc/init.d/program start at all server'
a = raw_input('Do you want really do it?(y,N)')

# IF input is not Yes, This Script is closed.
if a == 'Y' or 'y':
    print 'Start Script'
else:
    sys.exit(0);

# for start
for target_host in hosts:
    # Connect to host
    tn = telnetlib.Telnet(target_host)

    # input ID
    print tn.read_until('login:')
    tn.write(user)
    # input PASSWORD
    print tn.read_until('Password')
    tn.write(password)
    print tn.read_until(' ] ')

    tn.write('exit\n')
    tn.close()
#for end

print '#########################################################'
print '#################### Script end #########################'
print '#########################################################'
=============================================================

파이썬을 이용해서 작성했다..........
Tcl을 쓰고 싶었지만;;(어디서 예제를 봤었기 때문에....) 서버에 설치가 안되어 있어서..할수 없이 다른 방법을 찾다보니..파이썬에서 Telnet 라이브러리가 있길래..ㅎ
간단하게 설명하면...
tn = telnetlib.Telnet(host_name) -> 텔넷 연결
tn.read_until('login:')               -> login: 이라는 글자가 나올때 까지 대기!~
tn.write(user)                          -> user라는 값을 입력..
이 과정을 거치게 되면...당연히 ID까지는 자동으로 입력되는 거겠죠?..
그 다음에 패스워드 입력하고...
뭐..기타 등등..자신이 원하는 작업을 쭈~욱 하다가..
tn.close()를 실행하면 됩니다~..


p.s 위의 스크립트들을 참고해서 수정만 조금하면...
간단한 자신이 원하는 자동화 툴을 생성할 수 있지 않을까요?ㅎ
전..뭐 귀찮아서..우선 여기까지만!ㅋ

트랙백과 댓글 여닫기

TOP