DevOps/CI.CD
[Bash] Apache 설정 파일 일괄 배포
라퐁
2025. 5. 30. 10:15
아파치를 Docker로 돌리고 싶지만 사정상 서버에 직접 설치해서 운영 중이다. 이번에 다른 목적으로 WEB 서버 6대가 추가되었는데, 6개의 콘솔을 열어서 설정파일을 수정하고 재기동하는건 말도 안 되게 귀찮기 때문에 Bash 스크립트를 작성했다.
ssh 키 쌍 생성하여 패스워드 입력 없이 서버 연결 설정
# 1.키 쌍 생성
$ ssh-keygen -t rsa
# Enter file in which to save the key : 엔터 (기본 경로 ~/.ssh 사용)
# Enter passphrase : 엔터 (패스워드 없이 사용)
# Enter same passphrase again : 엔터
# 2. 생성된 공개키를 대상 서버에 복사
$ ssh-copy -id -p 22 username@remote.server.ip
# 3. 연결 확인
$ ssh -p 22 username@remote.server.ip
ssh 연결하여 명령 실행
# 한 개의 명령 실행
$ ssh -p 22 username@remote.server.ip "touch test"
# 여러 개의 명령 실행(세미콜론으로 구분)
$ ssh -p 22 username@remote.server.ip "touch test; mv test tset"
스크립트 작성
- 설정 파일의 수정이 있을 때
파일명.YYYYMMDD
형태로 파일을 백업한다. - conf.d의 ssl.conf, vhost.conf, workers.properties 위주로 수정한다.
스크립트 작성의 전제 조건이다.
#!/bin/bash
APACHE_CONFD_PATH=/etc/httpd/conf.d
DATE=`date +%Y%m%d`
# 오늘 날짜로 수정된 파일명
MODIFIED_CONF_LIST=`ls -1 ${APACHE_CONFD_PATH} | grep ${DATE} | sed 's/\.[^.]*$//`
# 대상 서버 목록
SERVERS="192.168.0.2 192.168.0.3 192.168.0.4 192.168.0.5 192.168.0.6"
# 수정된 파일별로 반복
for CONF in ${MODIEFIED_CONF_LIST}
do
# 대상 서버별로 파일 전송
for SERVER in ${SERVERS}
do
scp -P 22 ${APACHE_CONFD_PATH}/${CONF} apache@${SERVER}:${APACHE_CONFD_PATH}/${CONF}
scp -P 22 ${APACHE_CONFD_PATH}/${CONF}.${DATE} apache@${SERVER}:${APACHE_CONFD_PATH}/${CONF}.${DATE}
done
done
# 아파치 재기동
for SERVER in ${SERVERS}
do
ssh -n -p 22 apache@${SERVER} "sudo /home/apache/apache_restart.sh"
sleep 5
done
sudo /home/apache/apache_restart.sh
기존에는 apache_stop.sh
과 apache_start.sh
를 따로 실행해서 재기동을 했으나, 한 번의 명령으로 재기동 하기 위해 각 서버에 apache_restart.sh
를 추가 작성했다.
#!/bin/bash
# 아파치 종료
sh /home/apache/apache_stop.sh
while true
do
# 프로세스에 httpd가 없으면(내가 실행한 grep 하나만 나오면) 탈출
if [ `ps -ef | grep -c httpd` -eq 1 ]
then
break
fi
sleep 1
done
# 아파치 시작
sh /home/apache/apache_start.sh