DevOps

CI/CD 파이프라인 구축하기 - 4.1 (Ansible 서버 구축 및, Jenkins, Docker 통합)

우잉~ 2024. 12. 16. 22:52

아래 포스팅에서 이어집니다!

https://wooinge.tistory.com/142

 

CI/CD 파이프라인 구축하기 - 3.2 (Docker 컨테이너 자동 빌드 및 자동 배포)

아래 포스팅에서 이어집니다!https://wooinge.tistory.com/141 CI/CD 파이프라인 구축하기 - 3.1 (Docker 설정 및 Jenkins SSH server 설정하기)CI/CD 파이프라인 구축하기 - 2에서 이어집니다!https://wooinge.tistory.com/139

wooinge.tistory.com



 

지난 포스팅에서는 Jenkins와 Docker를 통합하여 Apache Tomcat 이미지를 이용한 컨테이너 배포를 진행하였다.

빌드 결과물이 생성되면 ssh 서버로 배포하게 되고, 배포 시 명령어를 이용하여 컨테이너를 자동으로 생성하는 과정까지 모두 완료하였다.

이번에는 Ansible을 이용하여 이미지를 생성하고 Dockerhub에 업로드한 뒤, 이 이미지를 가져와 컨테이너를 실행하는 과정을 진행할 것이다.

 

Ansible이 대체 뭔데?

IT 자동화 도구 중 하나로, Python 기반의 오픈 소스 코드형 인프라 솔루션이다.

서버를 설정하거나, 애플리케이션 배포 등 인프라 구성을 관리하는 데 사용된다.

Ansible은 yaml 기반 문법을 사용하여 간단한 면이 있고, 에이전트가 따로 필요 없다는 것이 특징이다.

 

코드형 인프라 솔루션을 쓰는 이유는 무엇일까?

이번 CI/CD 파이프라인을 구축하는 실습을 진행하면서 실습하면서 제일 체감되는 최고의 장점은 반복 작업이 감소한다는 부분인 것 같다. 한 번 만들거나 설정해두면 요소별로 템플릿화되어 재사용할 수 있는 것이 아주 많아 실제로도 효율적으로 복잡한 인프라를 관리할 수 있을 것 같다.

 

 

CI/CD Pipeline 구성

 

[CI/CD 파이프라인 구축 실습 목표]

  • Ansible 서버 구축하기
  • Ansible에 Docker 통합하기
  • Jenkins에 Ansible 통합하기
  • Ansible 서버에서 이미지 빌드와 도커 컨테이너 생성하기
  • playbook을 이용한 이미지와 컨테이너 생성하기
  • Docker hub repository에 이미지 올리기
  • Ansible에 이미지를 빌드하는 Jenkins 프로젝트 생성하기
  • 빌드 및 배포 자동화하기

 

 

 

1. Ansible 서버 생성 및 설정

[EC2 Instance 생성]

  • 이름: ansible-server
  • AMI: Amazon Linux 2
  • 인스턴스 유형: t2.micro
  • 기존 키페어 연결: devops-project-key
  • 기존 보안 그룹 설정: devops-sg

 

우선 호스트 이름을 변경해준다.

 

 

useradd, passwd 명령을 이용하여 Ansible 관리자 계정을 생성한다. 이름은 ansadmin이라고 했다.

 

visudo 명령을 이용해 ansadmin에게 패스워드 입력 없이 서버를 사용할 수 있도록 권한을 부여한다. 

암호 없이 모든 작업할 수 있도록 설정(visudo)

 

패스워드 기반 인증을 할 수 있도록 /etc/ssh/sshd_config 파일을 수정한다.

sshd 재시작

 

새로운 세션 열어서 ansadmin 계정으로 로그인을 시도하면 패스워드 기반 인증을 허용했기 때문에 아이디와 비밀번호를 입력하여 손쉽게 로그인할 수 있다.

ansadmin 로그인

 

현재 Ansible 서버를 구축하는 이유는 코드를 이용하여 간편하게 Docker Container를 배포하기 위해서이다.

결국 ansible-server는 dockerhost에 원격으로 접속할 수 있어야 하는데, 원격 접속을 위해서는 ssh key가 필요하다.

그래서 ssh-keygen 명령을 이용해 public key와 private key를 생성할 것이다.

기본 설정으로 할 것이기 때문에 모두 엔터를 누르면 된다.

 

ssh-keygen 명령 실행 및 저장 경로 확인

 

yum 명령을 사용해서 ansible을 설치해보려 했으나, 패키지가 없다고 해서 amazon-linux-extras install ansible2 명령을 사용한다.

yum 명령어 실패
amazon-linux-extras 이용한 ansible ver 2 설치

 

ansible은 python 기반 코드형 인프라 솔루션이기 때문에 python도 설치가 되는 것을 확인할 수 있다.

ansible2를 설치했기 때문에 python도 버전 2가 설치된 것을 확인할 수 있다.

ansible, python 설치 완료

 

 

2. ansible-server에서 dockerhost와 통신하기

기존에 사용하던  dockerhost 세션을 열어준다.

ansible과 구분하기 위해 색상을 Solarized dark로 변경하였다.

색상 변경 1

 

색상 변경 2
dockerhost 로그인

 

Ansible의 역할은 Jenkins의 빌드가 끝나면 이를 이용하여 dockerhost에 컨테이너를 배포하는 것이다.

그렇기 때문에 dockerhost에서도 직접 배포할 관리자를 생성해야 한다.

이름은 ansible-server의 관리자와 똑같은 ansadmin으로 생성한다.

똑같이 권한을 부여한다. 패스워드 인증 기반은 저번 Docker 구축 포스팅에서 이미 해뒀기 때문에 파일을 수정하지 않아도 된다.

배포 관리자 생성

 

ansadmin에게 권한 부여
패스워드 기반 인증 허용

 

ansible이 dockerhost와 통신할 수 있도록 /etc/ansible/hosts 파일에 dockerhost의 ip를 저장한다.

/etc/ansible/hosts은 ansible이 접근할 수 있는 인벤토리(호스트 목록)이다. 이를 참조하여 다른 호스트들과 통신할 수 있다. 

 

기존에 있던 주석처리된 모든 내용을 삭제하고 docker host 프라이빗 ip를 입력한 뒤 저장한다.

 

이제 원격 접속을 위해 ssh key를 dockerhost에 복사한다.

아까 ssh-keygen 명령을 사용하여 개인키(id_rsa), 공용키(id_rsa.pub)를 생성했다.

생성된 키는 /.ssh에 저장되었다.

ssh key 저장 위치
키 확인

 

ssh-copy-id 명령을 이용하여 공용키를 dockerhost에 복사하여 ansible이 원격 접속할 수 있도록 한다.

ssh key 복사

 

명령이 성공적으로 수행되면 dockerhost에 ssh key가 복사된 것을 확인할 수 있다.

이름은 authorized_keys로 지정되어 있다.

복사된 key 확인

 

ansible-server의 공용키와 dockershot의 공용키 내용을 살펴보면 동일한 것을 확인할 수 있다.

 

드디어 dockerhost와 원격 연결이 가능해졌다!

정말 가능한지 ansible all -m ping 명령어를 이용하여 통신 상태를 확인한다.

 

성공적인 ping 통신

 

다른 명령어도 사용해본다.

 

커맨드 결과 같은지 확인

 

 

3. 빌드 산출물 전달을 위한 jenkins 서버와 ansible 통합하기

 

이제 ansible 서버에 빌드 파일을 전달하기 위한 작업을 진행할 것이다.

우선 ansible-server의 관리자 계정 정보를 등록해야 한다.

jenkins 설정 > system configuration - systems

 

 

 

새로운 젠킨스 프로젝트를 생성한다.

기존에 만들어둔 컨테이너 빌드 및 배포 프로젝트를 복사하여 빠르게 프로젝트를 생성한다.

 

프로젝트를 복사했기 때문에 SSH Server 설정이 dockerhost로 되어있을 것이다.

ansible-server로 변경한다.

 

 

빌드 산출물 복사할 디렉토리(/opt/docker)를 생성한다.

해당 디렉토리 권한이 root로 되어 있으므로 ansadmin으로 권한을 변경한다.

/opt/docker 디렉토리 생성
디렉토리 권한 ansadmin으로 변경

 

기존에 작성되어 있던 이미지와 컨테이너 자동 배포 코드는 ansible 서버에서 직접 관리할 것이기 때문에 모두 삭제해준다!

 

 

* 실패한 빌드는 Tomcat server의 ec2 인스턴스를 중지하고 다시 시작했기 때문에 ip가 변경된 것이 문제였다.

빌드 성공

 

ansible-server에 복사된 빌드 산출물

 

 

4. Ansible 서버에서 docker image 및 컨테이너 생성하기

다음은 Ansible에 Docker를 설치할 것이다.

현재 진행할 부분

 

yum install docker 명령을 이용하여 docker를 설치한다.

 

도커를 설치하면 /etc/group에 docker가 생성된 것을 확인할 수 있다. 원활한 도커 컨테이너 배포를 위해 ansadmin에게 docker 그룹을 추가해준다.

cat etc/group

 

ansadmin에 docker 그룹 추가

 

도커 실행

 

 

이전 포스팅에서 만들어 둔 Dockerfile을 복사하여 ansible-server에 만든다.

Dockerfile 내용 복사
ansible-server Dockerfile 생성

 

이제 Dockerfile을 이용하여 이미지를 생성한다.

하지만 /var/run/docker.sock 파일에 대한 권한이 거부되었다면서 에러가 발생한다.

 

현재 권한 600으로 되어 있기 때문에 에러가 발생하였다.

접근할 수 있도록 777로 변경 ※ 원래는 777로 하면 절대절대 안 됨~~~! ㅜㅜㅜ 굉장히 보안이 안 좋아짐~~! ㅜㅜ 660이 가장 적당한 것 같다.

접근 권한 허용
권한 확인

 

 

이제 다시 이미지를 빌드하면 정상적으로 진행이 될 것이다.

해당 이미지를 이용하여 컨테이너가 잘 실행되는지 확인하고, 실행이 된다면 브라우저에 접속한다.

이미지 목록 조회
컨테이너 실행 명령
/webapp 페이지 접속 성공

 

 

분량이 너무 많아서,,, ansible을 이용한 컨테이너 배포 자동화는 다음 포스팅에서 이어해야겠다.