자동화 쉘 스크립트(1)
오늘은 저번 주에 작성하였던 shell script에 관한 이야기이다.
(참고: https://brunch.co.kr/@qhrhs59/6)
(코드: https://github.com/ByBogon/Postgres_Shell_Script)
이번 주에 다룰 부분은 전체적인 코드 설명이다.
코드 상단의 변수 선언하는 부분
MASTER_IP는 마스터 디비 서버의 주소, 즉 스탠바이 서버에서 curl을 날려서 헬스체크할 주소이다.
POSTGRES_DIR 은 PostgreSQL DB를 설치한 주소인데, 현재 경로는 우리 서버에 적용된 경로라서 나중엔 변수화 시켜서 업데이트할 예정이다. 해당 경로를 기준으로 하위 폴더에서 대부분의 작업이 이루어진다.
ARCHIVE_DIR 은 Log-Shipping으로 백업용 (Replication은 Streaming으로 하고 있음을 전제) WAL 파일을 적재하는 주소이다. 생각해보니 이 주소는 마스터 서버에서 정하는 거라 유저가 직접 입력하게 하거나, 여건이 되면 마스터 서버에 PostgreSQL이 설치된 경로를 입력받아 command 상에서 마스터 서버로 접속하여 conf에 입력되어 있는 WAL 파일 저장 경로를 읽어와 사용해야 할 듯.
RECOVERY_CONF_DIR 은 스탠바이 서버가 마스터로 승격되기 위한 옵션들이 입력되어 있는 conf 파일 경로이다.
TEMP_DIR 은 스크립트 작업 중 awk 언어를 사용하는데 파일 입출력을 사용하고 있어서 해당 TEMP_DIR의 경로에 파일을 생성, 읽기, 수정을 한다.
최초로 헬스체크하는 curl이다.
command 명령을 잠깐 살펴보면,
curl의 s, S, f 옵션을 사용 중인데,
-s는 curl을 silent or quiet mode 즉, progress meter 나 에러 메시지를 보여주지 않는 옵션이다.
-S는 에러 메시지를 보여 주는 옵션이다.
s와 S를 같이 사용하면 progress meter는 보여주지 않고 에러 메시지만 보여준다.
-f는 http 프로토콜에서 curl을 실패하면 리턴되는 아웃풋(html document) 없이 종료된다. 보통 일반적으로 http 서버 통신을 실패하면 html document를 리턴하며 에러 설명을 해준다.
>는 > 부등호 왼쪽에 위치한 command 명령어의 실행 결과 값(아웃풋)을 > 부등호 오른쪽에 위치한 경로로 전달한다.
/dev/null 은 모든 인풋 값을 받고 삭제하는 Pseudo-devices 중 하나이다.
2>&1에서 2와 1은 File descriptor(파일 서술자)의 값들 중 하나이다. 해당 명령어 내에서 &는 & 뒤에 오는 게 어떤 것이든 파일 이름이 아니라 파일 서술자이다라는 부호이다. 파일 서술자는 특정한 파일에 접근하기 위한 추상적인 키이다. 파일이 오픈될 때마다 OS에서 양수 integer를 리턴하는데 그게 파일 서술자이다. 0은 STDIN (인풋 값), 1은 STDOUT (아웃풋 값), 2는 STDERR (에러 값)을 나타낸다.
RESULT=$? 는 RESULT 변수에 값을 넣는데, 해당 값은 해당 코드라인의 상단 부분에서 아웃풋을 리턴하는 코드 중 가장 근접한 값으로 정해진다.
즉 7번 라인을 풀어내면, MASTER_IP의 변수에 들어 있는 값으로 html document 아웃풋 없이 에러 메시지만을 리턴하고, 그 리턴 값을 /dev/null로 전달하고 에러 발생 시, 해당 에러를 일반적인 아웃풋으로 전달한다.
8번 라인은, 7번 라인에서 나온 값을 RESULT 변수 안에 넣는다.
RESULT 값은 위에 세팅한 curl 옵션들 덕분에 숫자로만 리턴 받는다. 성공 시 0이고, 그 외에는 curl 문서중 exit codes의 값들이다.
(현재 마스터 서버의 디비 포트로 curl을 날리고 있어서 특정한 성공 값을 리턴하지 않는다. 그래서 52를 리턴 함.
ex) curl: (52) Empty reply from server
curl: (7) Failed connect to x.x.x.x:x; Connection refused
)
변수 설정 및 최초 curl 호출 코드가 총 7 라인 밖에 안되는데 설명이 너무 길어서 뒤의 코드는 그다음 포스트에 추가해야 할 듯하다.
참조
- https://curl.haxx.se/docs/manpage.html (curl 설명)
- https://en.wikipedia.org/wiki/Device_file#Pseudo-devices (/dev/null 설명)
- https://en.wikipedia.org/wiki/File_descriptor (파일 서술자 설명)