[CI/CD Pipeline] 2. Docker + Ansible 설정
in CI/CD on Ci/cd
Docker + Ansible
도커 및 앤서블을 활용한 CICD 구성 방법을 알아본다.
Docker 이미지 생성 후 Ansible을 통한 관리를 진행 한다.
Jenkins에서 Docker 이미지로 배포 하기
도커 빌드 파일을 만들어 두고 프로젝트 내의 Post Steps > Add post-build step > Exec command를 작성해 준다.
# 예시
FROM tomcat:9.0
COPY ./hello-world.war /usr/local/tomcat/webapps
# 도커 이미지 빌드
docker build --tag=cicd-project -f Dockerfile .
# 도커 이미지 실행
docker run -d -p 8080:8080 --name mytomcat cicd-project:latest
Ansible 이란?
Ansible은 IT 자동화 도구로, 시스템 관리, 애플리케이션 배포, 설정 관리, 그리고 오케스트레이션 작업을 자동화할 수 있다. Ansible은 에이전트리스 방식으로 작동하며, SSH를 통해 원격 시스템에 접속하여 작업을 수행할 수 있다. YAML 형식의 플레이북을 사용하여 작업을 정의하고, 이를 통해 반복 가능하고 일관된 환경을 조성할 수 있다.
Ansible 설치 및 설정
aws ec2 Amazon Linux 2023 환경에 설치하는 방법을 알아 보자!
- 환경 설정 파일 : /etc/ansible/ansible.cfg
- Ansible에서 접속하는 호스트 목록 : /etc/ansible/hosts
# 시스템 업데이트
sudo dnf update -y
# Python 및 pip 설치: Ansible은 Python 기반이므로 Python과 pip를 설치한다.
sudo dnf install python3 -y
sudo dnf install python3-pip -y
# pip를 사용하여 Ansible 설치: pip를 사용하여 Ansible을 설치한다.
sudo pip3 install ansible
# 설치 확인
ansible --version
# 환경 설정 파일 생성 및 설정
sudo mkdir -p /etc/ansible
sudo touch /etc/ansible/ansible.cfg
sudo vi /etc/ansible/ansible.cfg
# ansible.cfg 파일 기본 설정 추가
[defaults]
# 인벤토리 파일의 경로를 지정한다. 기본적으로 /etc/ansible/hosts를 사용한다.
inventory = /etc/ansible/hosts
# 원격 시스템에 접속할 기본 사용자 이름을 지정한다.
remote_user = your_default_user
# 호스트 키 확인을 비활성화한다. (선택 사항)
host_key_checking = False
# 인벤토리 파일 편집
sudo touch /etc/ansible/hosts
# 예를 들어, 다음과 같이 호스트를 추가할 수 있다.
[webservers]
webserver1.example.com
172.20.10.12
[dbservers]
dbserver1.example.com
Ansible Keygen
앤서블에서 타 서버 접속시 비밀번호 입력 없이 젒속을 하기 위해 key를 생성해 배포해 주자.
# 키생성
ssh-keygen
# 생성된 키 전달
ssh-copy-id <root아이디>@<접속할 서버 IP>
Ansible 명령어
- -i (–inventory-file) > 적용 될 호스트들에 대한 파일 정보
- -m (–module-name) > 모듈 선택
- -k (–ask-pass) > 관리자 암호 요청
- -K (–ask-become-pass) > 관리자 권한 상승
- –list-hosts > 적용되는 호스트 목록
# 모든 서버 핑 테스트
ansible all -m ping
Ansible 멱등성
같은 설정을 여러 번 적용하더라도 결과가 달라지지 않는 성질.
예를 들어 같은 내용의 명령어를 여러 번 적용해도 결과가 같다면 1번만 실행 된다.
Ansible Playbook
사용자가 원하는 내용을 미리 작성해 놓은 파일( ex : 설치, 파일 전송, 재시작.. )
다수의 서버에 반복 작업을 처리하는 경우
# <playbook이름>.yml Playbook을 실행한다.
andible-playbook <playbook이름>.yml
# Playbook 작성 예시
- name: Ansible Copy
hosts: webservers
tasks:
- name: copying file
copy:
src: ~/test.txt
dest: /tmp
owner: root
mode: 0644
# Playbook를 통한 Docker 배포 작성 예시
- hosts: all
# become: true
tasks:
# 중지
- name: stop current running container
command: docker stop my_cicd_project
ignore_errors: yes
# 삭제
- name: remove stopped cotainer
command: docker rm my_cicd_project
ignore_errors: yes
# 이미지 삭제
- name: remove current docker image
command: docker rmi edowon0623/cicd-project-ansible
ignore_errors: yes
# 빌드
- name: pull the newest docker image from Docker Hub
command: docker pull edowon0623/cicd-project-ansible
# 실행
- name: create a container using cicd-project-ansible image
command: docker run -d --name my_cicd_project -p 8080:8080 edowon0623/cicd-project-ansible
jenkins 에서 ansible 사용하기
- 젠킨스 프로젝트의 빌드 후 조치 > Transfer Set > Exec command 에 입력해 준다.
ansible-playbook -i hosts <playbook이름>.yml
# 특정 서버에서만 실행 하게 처리 하기
ansible-playbook -i hosts <playbook이름1>.yml --limit 172.17.0.2;
ansible-playbook -i hosts <playbook이름2>.yml --limit 172.17.0.4