아래 포스팅에서 이어집니다!
https://wooinge.tistory.com/142
지난 포스팅에서는 Jenkins와 Docker를 통합하여 Apache Tomcat 이미지를 이용한 컨테이너 배포를 진행하였다.
빌드 결과물이 생성되면 ssh 서버로 배포하게 되고, 배포 시 명령어를 이용하여 컨테이너를 자동으로 생성하는 과정까지 모두 완료하였다.
이번에는 Ansible을 이용하여 이미지를 생성하고 Dockerhub에 업로드한 뒤, 이 이미지를 가져와 컨테이너를 실행하는 과정을 진행할 것이다.
Ansible이 대체 뭔데?
IT 자동화 도구 중 하나로, Python 기반의 오픈 소스 코드형 인프라 솔루션이다.
서버를 설정하거나, 애플리케이션 배포 등 인프라 구성을 관리하는 데 사용된다.
Ansible은 yaml 기반 문법을 사용하여 간단한 면이 있고, 에이전트가 따로 필요 없다는 것이 특징이다.
코드형 인프라 솔루션을 쓰는 이유는 무엇일까?
이번 CI/CD 파이프라인을 구축하는 실습을 진행하면서 실습하면서 제일 체감되는 최고의 장점은 반복 작업이 감소한다는 부분인 것 같다. 한 번 만들거나 설정해두면 요소별로 템플릿화되어 재사용할 수 있는 것이 아주 많아 실제로도 효율적으로 복잡한 인프라를 관리할 수 있을 것 같다.
[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에게 패스워드 입력 없이 서버를 사용할 수 있도록 권한을 부여한다.
패스워드 기반 인증을 할 수 있도록 /etc/ssh/sshd_config 파일을 수정한다.
새로운 세션 열어서 ansadmin 계정으로 로그인을 시도하면 패스워드 기반 인증을 허용했기 때문에 아이디와 비밀번호를 입력하여 손쉽게 로그인할 수 있다.
현재 Ansible 서버를 구축하는 이유는 코드를 이용하여 간편하게 Docker Container를 배포하기 위해서이다.
결국 ansible-server는 dockerhost에 원격으로 접속할 수 있어야 하는데, 원격 접속을 위해서는 ssh key가 필요하다.
그래서 ssh-keygen 명령을 이용해 public key와 private key를 생성할 것이다.
기본 설정으로 할 것이기 때문에 모두 엔터를 누르면 된다.
yum 명령을 사용해서 ansible을 설치해보려 했으나, 패키지가 없다고 해서 amazon-linux-extras install ansible2 명령을 사용한다.
ansible은 python 기반 코드형 인프라 솔루션이기 때문에 python도 설치가 되는 것을 확인할 수 있다.
ansible2를 설치했기 때문에 python도 버전 2가 설치된 것을 확인할 수 있다.
2. ansible-server에서 dockerhost와 통신하기
기존에 사용하던 dockerhost 세션을 열어준다.
ansible과 구분하기 위해 색상을 Solarized dark로 변경하였다.
Ansible의 역할은 Jenkins의 빌드가 끝나면 이를 이용하여 dockerhost에 컨테이너를 배포하는 것이다.
그렇기 때문에 dockerhost에서도 직접 배포할 관리자를 생성해야 한다.
이름은 ansible-server의 관리자와 똑같은 ansadmin으로 생성한다.
똑같이 권한을 부여한다. 패스워드 인증 기반은 저번 Docker 구축 포스팅에서 이미 해뒀기 때문에 파일을 수정하지 않아도 된다.
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-copy-id 명령을 이용하여 공용키를 dockerhost에 복사하여 ansible이 원격 접속할 수 있도록 한다.
명령이 성공적으로 수행되면 dockerhost에 ssh key가 복사된 것을 확인할 수 있다.
이름은 authorized_keys로 지정되어 있다.
ansible-server의 공용키와 dockershot의 공용키 내용을 살펴보면 동일한 것을 확인할 수 있다.
드디어 dockerhost와 원격 연결이 가능해졌다!
정말 가능한지 ansible all -m ping 명령어를 이용하여 통신 상태를 확인한다.
다른 명령어도 사용해본다.
커맨드 결과 같은지 확인
3. 빌드 산출물 전달을 위한 jenkins 서버와 ansible 통합하기
이제 ansible 서버에 빌드 파일을 전달하기 위한 작업을 진행할 것이다.
우선 ansible-server의 관리자 계정 정보를 등록해야 한다.
jenkins 설정 > system configuration - systems
새로운 젠킨스 프로젝트를 생성한다.
기존에 만들어둔 컨테이너 빌드 및 배포 프로젝트를 복사하여 빠르게 프로젝트를 생성한다.
프로젝트를 복사했기 때문에 SSH Server 설정이 dockerhost로 되어있을 것이다.
ansible-server로 변경한다.
빌드 산출물 복사할 디렉토리(/opt/docker)를 생성한다.
해당 디렉토리 권한이 root로 되어 있으므로 ansadmin으로 권한을 변경한다.
기존에 작성되어 있던 이미지와 컨테이너 자동 배포 코드는 ansible 서버에서 직접 관리할 것이기 때문에 모두 삭제해준다!
* 실패한 빌드는 Tomcat server의 ec2 인스턴스를 중지하고 다시 시작했기 때문에 ip가 변경된 것이 문제였다.
4. Ansible 서버에서 docker image 및 컨테이너 생성하기
다음은 Ansible에 Docker를 설치할 것이다.
yum install docker 명령을 이용하여 docker를 설치한다.
도커를 설치하면 /etc/group에 docker가 생성된 것을 확인할 수 있다. 원활한 도커 컨테이너 배포를 위해 ansadmin에게 docker 그룹을 추가해준다.
이전 포스팅에서 만들어 둔 Dockerfile을 복사하여 ansible-server에 만든다.
이제 Dockerfile을 이용하여 이미지를 생성한다.
하지만 /var/run/docker.sock 파일에 대한 권한이 거부되었다면서 에러가 발생한다.
현재 권한 600으로 되어 있기 때문에 에러가 발생하였다.
접근할 수 있도록 777로 변경 ※ 원래는 777로 하면 절대절대 안 됨~~~! ㅜㅜㅜ 굉장히 보안이 안 좋아짐~~! ㅜㅜ 660이 가장 적당한 것 같다.
이제 다시 이미지를 빌드하면 정상적으로 진행이 될 것이다.
해당 이미지를 이용하여 컨테이너가 잘 실행되는지 확인하고, 실행이 된다면 브라우저에 접속한다.
분량이 너무 많아서,,, ansible을 이용한 컨테이너 배포 자동화는 다음 포스팅에서 이어해야겠다.
'DevOps' 카테고리의 다른 글
CI/CD 파이프라인 구축하기 - 5.1 (파이프라인 구축 전 kubectl, eksctl 설정 및 yaml 파일 작성하기) (1) | 2024.12.17 |
---|---|
CI/CD 파이프라인 구축하기 - 4.2 (Ansible Playbook을 이용한 Docker 컨테이너 배포) (0) | 2024.12.16 |
CI/CD 파이프라인 구축하기 - 3.2 (Docker 컨테이너 자동 빌드 및 자동 배포) (0) | 2024.12.13 |
CI/CD 파이프라인 구축하기 - 3.1 (Docker 설정 및 Jenkins SSH server 설정하기) (0) | 2024.12.13 |
[문제 해결] Dockerfile에서 tar 명령어 실행 안 될 때 해결 방법 (0) | 2024.12.13 |