1. ansible server 등록
ansible server를 등록하기 위해 주소를 확인한다.
20022번 포트로 연결된 ansible server에 접속하여 hostname -i 명령어를 입력하면 알 수 있다.
ansible server Hostname-> [127.17.0.4]
위치 : Jenkins 관리 > System > SSH Server
해당 위치로 들어가 정보를 입력한다.
2. 빌드 후 조치 설정
젠킨스에서 war 파일을 빌드 후 어떤 조치를 취해줄 것이냐를 결정하는 곳이다.
나는 젠킨스에서 빌드한 war 파일을 ansible 서버로 보낼 것이다.
ansible server로 war 파일을 전송하기 위해 새로운 item을 만들어 주면서 마지막 '빌드 후 조치'에서 'Send build artifacts over SSH'를 선택한다.
1. 에서 만들어 준 ansible-server로 추가한다.
어떤 파일을 전송할 것인지를 Transfer Set에서 설정한다.
이렇게 Item을 만들어 준 후 지금 빌드를 눌러주면, ansible server로 젠킨스에서 빌드된 war 파일이 전송된다.
3. 도커 이미지 파일 생성하는 playbook 만들기
관리하는 서버 전체에 원하는 도커 이미지 파일을 생성하는 playbook.yml 파일을 만들 것이다.
// 1) playbook 파일 확인
ls *.yml
//2) 새로운 playbook 파일 생성
vi first-devops-playbook.yml
//3) playbook 내용 추가
- hosts: all
# become: true
tasks:
- name: build a docker image with deployed war file
command: docker build -t cicd-project-ansible .
args:
chdir: /root
모든 host에 [cicd-project-ansible]이라는 이름의 도커이미지를 생성한다는 뜻이다.
작업 디렉토리는 root이다.
여기서 도커 이미지를 빌드하기 위해서는 Dockerfile이 있어야 한다.
Dockerfiled은 tomcat9.0을 가지고 war 파일을 webapps라는 폴더에 복사하는 작업을 지시해 놓은 파일이다.
4. host 파일 생성
어떤 host 서버를 관리할 것인지를 써놓은 파일이다.
현재는 ansible-server (나자신)에게 해당 작업을 실행해볼 것이기 때문에 ansible-serber의 hostname을 작성한다.
5. playbook 파일 실행
내가 타겟한 host 전체 (현재는 ansible-server만)에게 도커 이미지 파일을 생성하도록 작성해 놓은 playbook.yml 파일을 실행할 것이다.
ansible-playbook -i hosts first-devops-playbook.yml
실행 시 이러한 명령어가 뜬다면, key를 생성해주거나 known_hosts 파일을 제거해주면 된다.
rm /root/.ssh/known_hosts
또 이러한 에러가 떴다면, docker server가 dead 상태인 것이다. 기동시키면 된다.
Yeah~~ 성공!!
playbook이 정상적으로 실행되었다면, 도커 이미지를 만들라는 명령어를 이행하였을 것이다.
docker images
6. 도커 컨테이너 생성 playbook으로 추가하기
만들어진 도커 이미지를 가지고 도커 컨테이너까지 생성하는 playbook으로 수정해볼 것이다.
- hosts: all
# become: true
tasks:
- name: build a docker image with deployed war file
command: docker build -t cicd-project-ansible .
args:
chdir: /root
- name: create a container using cicd-project-ansible image
command: docker run -d --name my_cicd_project -p 8080:8080 cicd-project-ansible
first-devops-playbook.yml 기존 파일에 아래 2줄을 추가하면 된다.
컨테이너 이름은 'my_cicd_project'이고, 방금 생성한 'cicd-project-ansible' 도커 이미지를 가지고 컨테이너를 실행시킨다.
*여기서 잠깐!*
현재 도커 자체에 설정되어 있는 port들은 macOS에서 8080, 8081, 8082로 각각 jenkins-server, docker-server [현재는 manager라고 명명], ansible-server로 접속하겠다고 한 것이다.
따라서 ansible-server의 docker를 이용해 내부 컨테이너를 생성할 때는 외부에서 사용중인 port와 상관없이 8080으로 생성해도 된다.
7. playbook 파일 실행
ansible-playbook -i hosts first-devops-playbook.yml
도커 이미지 파일을 만드는 작업과 컨테이너를 만드는 작업
총 2가지 작업이 완료되는 것을 확인할 수 있다.
8. 젠킨스에 반영하기
도커 이미지를 만들고, 만들어진 이미지를 이용해 컨테이너를 생성하는 과정을 담은 playbook을 젠킨스에서 수행할 수 있도록 만들면 끝이다. 5. 7. 2가지 과정은 바로 젠킨스에 command를 써주면 몰랐을 사실들을 하나하나 짚기 위해 수행했던 일이다.
일단 젠킨스의 hosts 파일에 관리하고 있는 호스트 중 ansible-server도 포함되어 있어 playbook 파일을 실행하면 이미 생성되어 있는 이미지와 컨테이너가 있어 제대로 수행되었는지 확인할 수 없다.
그렇기에 일단 지금까지 만들어진 이미지와 컨테이너를 삭제해보도록 하겠다.
8-1) ansible-server 이미지, 컨테이너 삭제
//1. 컨테이너 기동 중지
docker stop my_cicd_project
//2. 컨테이너 삭제
docker rm my_cicd_project
//3. 이미지 삭제
docker rmi cicd-project-ansible
8-2) 조치 후 빌드 수정
Exec command에 playbook을 실행시키는 명령어를 작성하면 된다.
적용 및 저장하고 지금 빌드를 해주면 hosts 3곳에 바로 적용되는 모습을 확인할 수 있다.
삭제하는 과정부터 젠킨스에서 '지금 빌드' 후 다시 생성되기까지가 위 이미지에 담겨있다.
9. 중복 이미지, 컨테이너 에러 해결
똑같은 도커 이미지와 컨테이너를 또 생성하고자 시도한다면 분명 에러가 날 것이다.
이 문제를 playbook에 만들고자 하는 이미지와 컨테이너와 같은 이름을 삭제하고, 다시 생성하는 작업으로 추가 및 수정할 것이다.
- 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 cicd-project-ansible
ignore_errors: yes
- name: build a docker image with deployed war file
command: docker build -t cicd-project-ansible .
args:
chdir: /root
- name: create a container using cicd-project-ansible image
command: docker run -d --name my_cicd_project -p 8080:8080 cicd-project-ansible
first-devops-playbook.yml 기존 파일에 이미지와 컨테이너를 삭제하는 명령어 3가지를 기존 task 앞에 추가하면 된다.
'INFRA > CICD' 카테고리의 다른 글
CICD Pipeline 시각화 (0) | 2024.07.27 |
---|---|
minikube - 쿠버네티스 (1) | 2024.07.22 |
Ansible Playbook 명령어 [파일복사 / 프로그램 다운] (0) | 2024.07.04 |
Docker 컨테이너로 Ansible 실행 (0) | 2024.06.30 |
[젠킨스 설정] 다른 서버에 war 파일 복사 후 기동 (0) | 2024.06.24 |