[Rundeck] workflow 를 통한 자동화 작업

안녕하세요? 정리하는 개발자 워니즈 입니다. 이번시간에는 런덱의 워크플로우를 정리해보고자 합니다. 필자가 운영중인 프로젝트에서는 RUDNECK을 CD툴로도 사용하지만 주기적인 작업에서도 유용하게 사용하고 있습니다. 가령 어플리케이션의 유지보구 작업이 필요한 시점에 다음과 같은 스텝으로 작업을 진행해왔습니다.

  • ELB에서 A or C존 전체를 Detach
  • 서버의 Application Stop 명령
  • 서버의 Application의 프로세스 체크
  • 유지보수 작업 수행
  • 서버의 Application Start 명령
  • 서버의 Application의 프로세스 체크
  • Front 화면 체크
  • ELB에서 A or C존 전체를 Attach

이전에는 수작업으로 위의 스텝을 진행했습니다. 그러다보니, 확인해야될 사항들이 많았고, 자연스레 인적 장애를 유발할 소지가 다분히 있었습니다.

위의 시나리오를 구성으로, 런덱 워크플로우를 사용해보기로했습니다.

1. Workflow 구성

workflow 를 구성하기에 앞서서, 먼저 이런 생각이 들었습니다. ELB attach/detach 같은 경우는 1회성으로 aws cli를 사용하면 되지 않을까?

  • ELB 는 1회성으로 Rundeck이 설치 되어있는 서버에서 실행
  • Application 에 대한 명령은 각 Node(Server)에서 실행

위의 2가지를 혼재해서 사용할 수 있는 것이 Workflow의 가장큰 장점인 것 같습니다.

위의 그림과 같이 구성하였고, ELB 같은 경우는 1회성 호출이기때문에 Job Reference를 이용해서 Parameter만 넘기는 형식으로 생성하였습니다.

2. Workflow 옵션

Job 생성에 보면, Workflow 라는 탭이 있습니다. 여기를 클릭하게 되면, 다음의 모습과 같이 workflow의 전략을 선택할 수 있게 됩니다.

전략은 총 세가지가 존재합니다.

  • 노드 우선
  • 병렬
  • 순서대로

노드 선택 같은 경우는 노드를 중심으로 모든 스텝이 완성이 되어야 다음의 노드로 넘어가는 구조입니다.

병렬 구조는 말그대로, 병렬로 수행을 하되, 각 노드의 스텝에 상관없이 병렬적으로 진행하게 됩니다.

순서대로는 노드의 각 스텝이 중심이 되어 스텝을 완성해야 다음 스텝으로 넘어가는 구조입니다. 필자가 사용한 전략은 순서대로의 전략을 사용했으며, 앞의 스텝이 완성이 되어야(예를들어 elb가 해제가 되어야) 다음스텝을 진행하는 구조입니다.

3. Workflow 스텝 추가

이제 워크플로우의 스텝을 구성할 차례입니다. 서두에 이야기했던대로, ELB 해제같은 경우는 한번만 실행 되는 구조를 잡고 있기때문에 이부분은 추가적인 JOB으로 구성을 했고, 참조하는 형식으로 만들었습니다.

  • ELB 연결 JOB
  • ELB 해제 JOB
  • Application stop 스크립트
  • Application 유지보수 스크립트
  • Application start 스크립트

준비해놓은것은 위의 보는대로 JOB 2개와 스크립트 3개를 준비했고, 각 JOB을 연결을 해주는 구조로 만들어 볼예정입니다.

먼저 Add a Step을 선택하게 되면, 2개의 텝이 보입니다

  • Node Steps
  • Workflow Steps

2개의 가장 큰차이는 각 스텝을 눌러보면 나오는 문구로 정리가 됩니다

Nodes Step 같은 경우는 해당 워크플로우 내에서 각 노드 만큼 실행 입니다. 즉, 각 노드별로 해당 스텝을 전달하여 수행한다는 말이고, 필자 같은 경우는 Application 스크립트가 각 Node에게 전달이 되어야 하므로, Node Step으로 구성하였습니다.

Workflow Steps 같은 경우는 해당 워크플로우 내에서 한번만 실행 입니다. 즉, 각 노드별로 실행하는 것이 아니라, 단 한번만 수행을 하게 됩니다. 현재의 로컬 경로인 Rundeck이 설치되어있는 부분에서 명령을 실행하는 것이고, 필자 같은 경우는 ELB 해제/연결 JOB을 참조로 하여 스텝으로 구성하였습니다.

  • ELB 해제 JOB 정보

워크플로우 스텝에서 Job 참조로 연결을 하였고, Argument만 전달을 하여 한번만 실행 되게 구성을 하였습니다. 이렇게 되면, 해당 JOB을 수행할때 선택된 서버들(예를들어 ELB A존에 연결된 서버군집)이 연결되어 파라미터로 넘어가게 되고, ELB 해제 job에서는 해당 서버군집을 ELB 해제 하라는 명령어로 해제하게 됩니다.

*ELB 연결도 동일합니다.

  • 스크립트 구성

앞서 이야기한것처럼 Application에 관한 모든 내용을 스크립트로 구성을 하였습니다.

while [ "`ps -ef | grep /aem/publish/tmp | grep -v grep`" != "" ];
do
  echo "retry Stopping Publish"
  sleep 5
done

echo "::: Process stop... :::"

WAIT=0
while [ "0$CRXDE" -eq 200 ];do

        WAIT=$(($WAIT+1))
        if [ "$WAIT" -gt 90 ];then
                echo "Failed..."
                exit 1
        fi

        echo "wait crx/de..."
        sleep 2
        CRXDE=`curl -Is -u $USER:$PASSWD http://localhost:$PORT/crx/de/index.jsp -m 10 | head -n1 | awk '{print $2}'`
done
echo "::: crx/de stop... :::"

WAIT=0
while [ "0$PAGE" -eq 200 ];do

        WAIT=$(($WAIT+1))
        if [ "$WAIT" -gt 90 ];then
                echo "Failed..."
                exit 1
        fi

        echo "wait page loading..."
        sleep 2
        PAGE=`curl -Is -u $USER:$PASSWD http://localhost:$PORT$CONTENT -m 10 | head -n1 | awk '{print $2}'`
done
echo "::: Page Loading stop... :::"

echo "::: Stop successfully... :::"

Application을 중지하고, 프로세스 체크를 하는 스크립트 입니다. 이부분은 Node StepsScript에 집어 넣었습니다.
Application 유지보수/서비스 시작 도 모두 동일합니다.

최종적인 모습은 다음과 같고, 스텝의 앞/뒤로는 ChatOps를 연결하여 실제 작업 상황을 전달 받도록 했습니다.

수동으로 하던 작업을 최종적으로 메시지만 받아 볼수 있게 되어, 더이상 신경을 안써도 될만큼 개선이 되었으며, 장애예방 효과에도 탁월했습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다