Skip to content
isdnetworks
Go back

지금 규약과 어긋난 옛 설정

새 서버를 세우면서 옛 서버의 설정 폴더를 통째로 복사했다. 돌아가긴 했는데 몇 가지가 어긋나 있었다.

Table of contents

Open Table of contents

상황 — 통째로 가져왔다

옮기는 명령은 한 줄이었다.

$ rsync -a old:/etc/app/ /etc/app/

rsync -a 로 옛 서버에서 돌던 그대로 옮기니 빠르고 확실해 보였다.

며칠 뒤 로그가 예상한 자리에 없다는 것을 알게 됐다. 그 사이 규약이 /var/log/<서비스>/ 로 바뀌었는데 옮겨 온 설정은 /app/logs/ 를 가리키고 있었다.

원인 — 항목별 대조

지금 규약과 하나씩 맞춰 봤다.

항목            지금 규약                옮겨 온 것
로그 경로       /var/log/<서비스>/       /app/logs/
설정 파일 이름  <서비스>.yml             config.yml
포트 대역       9000~9099                8080
사용자          앱 전용 계정             root
타임존          UTC 저장                 KST 저장

로그 경로 부터 타임존 까지 다섯 항목이 전부 달랐다.

전부 옛 서버가 만들어질 당시의 방식이었다. 그 뒤에 규약이 정해졌는데 옛 서버는 그대로 두고 있었던 것이다.

복사가 잘못된 것이 아니라 옛 서버가 규약을 안 따르고 있었다. rsync 는 그 상태를 충실하게 옮겼을 뿐이다.

제약 — 복제되는 어긋남

옛 서버를 규약대로 바꾸는 것은 서비스가 붙어 있어 위험해서 미뤄 두고 있었다.

옛 서버 1대   안 맞음
새 서버 1대   안 맞음 (복사해서)

한 대일 때는 예외 하나였는데 rsync 한 번에 두 대가 됐다.

미뤄 둔 것이 그대로 있는 동안 그것을 기준으로 새 서버가 만들어진다. 안 맞는 서버가 이런 식으로 늘어난다.

고치기 어려워서 미룬 것이 복사를 통해 고칠 것을 더 만드는 셈이다.

조치 — 새로 만들 때 맞췄다

새 서버는 아직 아무도 안 쓰므로 지금 맞추는 것이 가장 쌌다.

# /etc/app/order.yml
log_path: /var/log/order/
port: 9012
user: app
timezone: UTC

order.yml 을 옛 것을 참고하되 값을 하나씩 확인하며 새로 썼다.

시간은 더 걸렸다. 대신 무엇이 왜 그 값인지 알고 넣었고 나중에 물었을 때 답할 수 있게 됐다.

같은 작업인데 언제 하느냐에 따라 드는 값이 크게 다르다. 나중에 맞추자고 미루면 그 서버에도 서비스가 붙어 옛 서버와 같은 처지가 된다.

주의 — 딸려 오는 것들

무엇이 함께 넘어왔는지도 봤다.

$ rsync -a old:/etc/app/ /tmp/check/
$ ls -la /tmp/check/
-rw------- 1 root root  ... db_password.txt
-rw-r--r-- 1 root root  ... config.yml.bak-20161104
-rw-r--r-- 1 root root  ... config.yml.old
drwxr-xr-x 2 root root  ... backup/

config.yml.bak-20161104db_password.txt 가 딸려 왔다.

$ grep -rn "password" /tmp/check/ | wc -l
7

password 가 일곱 곳에 있었고 그중 넷은 이미 안 쓰는 값이었다.

안 쓰는 값이라도 유효한 값일 수 있다. 통째로 복사하는 방식은 무엇이 넘어오는지 안 보는 방식이라 이런 것이 그대로 따라온다.

목록을 뽑아 하나씩 보면서 필요 없는 것을 지웠다. 지우기 전에 목록을 남긴 것은 무엇을 지웠는지 나중에 확인하기 위해서였다.

검증 — 심링크가 링크로 남는지

트리 안에 심링크도 있었다.

$ find /tmp/check -type l -exec ls -l {} \;
lrwxrwxrwx ... config.yml -> config.production.yml

옛 서버에서는 config.ymlconfig.production.yml 을 가리키고 있었다.

복사 수단에 따라 링크가 링크로 남기도 하고 가리키는 실체가 복사되기도 한다.

$ rsync -aL   # 링크를 따라가 실체를 복사한다

-L 이 붙으면 링크가 아니라 파일이 되고 scp -r 도 링크를 따라간다.

실체로 바뀌면 새 서버에서 config.yml 을 다른 파일로 돌려도 설정이 안 바뀐다. 원래 상황에 따라 다른 파일을 가리키게 해 둔 것이 한쪽으로 고정돼 버린다.

그래서 옮긴 뒤에 find -type l 로 링크가 링크로 남았는지 세는 것을 절차에 넣었다. 옛 서버도 정리 목록에 올렸는데 목록에 없으면 영영 안 맞는 채로 남고 다음에 또 누가 복사해 간다.

정리


Share this post on:

Previous Post
상태에 머문 것만으로 부과했다
Next Post
대상이 늘면 장비가 늘어야 했다