배포 작업의 최소 단위는 다음 복사, 실행, 루트 사용자로 실행 세 가지 기능이다. 이를 조합하여 배포 작업을 쉽게 기술할 수 있다.
Fabric의 Bash 판이다.
user=blog
_put()
{
src=$1
dst=$2
host=$3
scp -pr $src ${user}@${host}:$dst
}
_run() {
cmd=$1
host=$2
ssh -l ${user} $host $cmd
}
_sudo() {
cmd=$1
host=$2
ssh -l root $host $cmd
}
간단한 사용 예. JDK 설치:
- 설치된 JDK 제거한다.
- 로컬의 .jdk1.6.0_10 디렉토리를 대상 호스트의 app의 하위 디렉토리로 복사한다.
- jdk1.6.0_10의 Soft Link jdk를 만든다.
jdk_install()
{
host=$1
echo "Install JDK on $host"
_run "mkdir -p app ; rm -rf app/jdk1.6.0_10 app/jdk" $host
_put ./jdk1.6.0_10 app/ $host
_run "cd app && ln -sf jdk1.6.0_10 jdk" $host
}
조금 어려운 아파치 HTTP 서버 설치와 시작:
- 설치된 아파치 HTTP 서버 제거한다.
- 바이너리 패키지를 대상 호스트로 복사한다.
- 바이너리 패키지 압축을 푼다.
- 일반 계정으로 실행하여도 80포트를 사용할 수 있도록 httpd 실행 파일의 소유주를 root로 변경하고 setuid를 설정한다.
- 바이너리 패키지를 삭제한다.
- 설정 파일을 대상 호스트로 복사한다.
httpd_install()
{
host=$1
echo "Install httpd on $host"
_run "mkdir -p app ; rm -rf app/httpd-2.2.10" $host
_put $source_dir/src/main/httpd-2.2.10-linux.tar.gz ./ $host
_run "tar xvzf httpd-2.2.10-linux.tar.gz -C app --exclude manual" $host
_sudo "cd /home/blog/app/httpd-2.2.10/bin && chown root httpd && chmod +s httpd" $host
_run "rm httpd-2.2.10-linux.tar.gz" $host
_put "$source_dir/src/main/environment-release/httpd/*" app/httpd-2.2.10/ $host
}
- 열 수 있는 파일 디스크립터 수를 만 개로 설정하고 아피치 서버를 시작한다.
httpd_start()
{
host=$1
echo "Start httpd on $host"
_run "ulimit -n 10000 && app/httpd-2.2.10/bin/apachectl start" $host
}
명령행에서 target_hosts 에 나열된 호스트를 대상으로 작업을 차례로 실행할 수 있다.
#!/bin/sh
#
# Tasks
#
target_hosts="
10.0.1.1 10.0.1.2
"
for host in $target_hosts
do
echo "Host $host"
for task in $@
do
$task $host
done
done
이렇게
$ ./deploy.sh httpd_stop httpd_install httpd_start