# Ansible을 이용한 Docker 이미지 관리하기
1. docker image를 docker hub에 push하기
- 현재 컨테이너에 tag를 부여한다.
docker tag cicd-project-ansible may9noy/cicd-project-ansible
- Docker login을 수행한다.
docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: may9noy
Password:
- 등록한 tag를 기반으로 docker hub에 push를 수행한다.
docker push may9noy/cicd-project-ansible
Using default tag: latest
The push refers to repository [docker.io/may9noy/cicd-project-ansible]
c60f8dd6180a: Pushed
6ed69f146a1e: Mounted from library/tomcat
0d6507393d4b: Mounted from library/tomcat
74d620724878: Mounted from library/tomcat
57b27cfbd6e6: Mounted from library/tomcat
b421f864ecf0: Mounted from library/tomcat
b09de1b6a666: Mounted from library/tomcat
b8a36d10656a: Mounted from library/tomcat
latest: digest: sha256:5c6dd92afa7060e695ee06775b0d7418ea7e1165135ea9d2ae4e6dc22554a8ff size: 1999
- docker hub로 이동하여 푸쉬된 이미지를 확인한다.
2. 위의 작업을 Ansible Playbook 으로 등록하여 활용하기
파일을 아래와 같이 생성 후 내용을 등록한다.
vi create-cicd-project-image-playbook.yml
- 내용은 아래와 같다.
내용을 별게 없다. 위에서 작업한 내용을 command: 명령어에 등록만 해준것이 전부이다.
- hosts: all
# become: true
tasks:
- name: create a docker image with deployed waf file
command: docker build -t may9noy/cicd-project-ansible .
args:
chdir: /root
- name: push the image on Docker Hub
command: docker push may9noy/cicd-project-ansible
- name: remove the docker image from the ansible server
command: docker rmi may9noy/cicd-project-ansible
ignore_errors: yes
- 위에서 생성한 yml 파일을 실행하면 아래와 같다.
ansible-playbook -i hosts create-cicd-project-image-playbook.yml
PLAY [all] *************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [172.17.0.4]
TASK [create a docker image with deployed waf file] ********************************************************************
changed: [172.17.0.4]
TASK [push the image on Docker Hub] ************************************************************************************
changed: [172.17.0.4]
TASK [remove the docker image from the ansible server] *****************************************************************
changed: [172.17.0.4]
PLAY RECAP *************************************************************************************************************
172.17.0.4 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 만약 아래와 같은 오류가 발생하면 해결을 해야한다. 오류가 발생하는 원인은 ip 주소가 변경 되었거나, 네트워크 정보가 수정되어 ssh로 접근이 불가능할 경우에 아래의 오류가 발생한다.
ERROR: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ERROR: @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
ERROR: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ERROR: IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
ERROR: Someone could be eavesdropping on you right now (man-in-the-middle attack)!
ERROR: It is also possible that a host key has just been changed.
ERROR: The fingerprint for the ECDSA key sent by the remote host is
ERROR: SHA256:X82h/+aOax6z+LiGEzWKytj01arY35Id76tcR1SSZ10.
ERROR: Please contact your system administrator.
ERROR: Add correct host key in /root/.ssh/known_hosts to get rid of this message.
ERROR: Offending ECDSA key in /root/.ssh/known_hosts:1
ERROR: ECDSA host key for 172.17.0.4 has changed and you have requested strict checking.
ERROR: Host key verification failed.
- 해결방법 : 기존에 존재하는 ssh 키 정보를 초기화 하여 신규로 발급 받도록 하는 작업이다.
ssh-keygen -R [접속할 서버의 ip]
# ssh 정보를 초기화 하여 기존의 ssh 키정보를 초기화 하는 작업이다.
- 위의 작업을 수행 후 ssh-keygen 및 ssh-copy 등을 통해 신규로 ssh 정보를 발급 및 복사를 해야한다.
3. 컨테이너를 실행하는 작업을 playbook으로 만들어보자.
파일생성 명령어 : vi create-cicd-project-container-playbook.yml
- 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 may9noy/cicd-project-ansible
ignore_errors: yes
- name: pull the newest docker image from Docker Hub
command: docker pull may9noy/cicd-project-ansible
- name: create a container using cicd-project-ansible image
command: docker run -d --name my_cicd_project -p 8080:8080 may9noy/cicd-project-ansible
- ansible playbook을 실행하기 전에 현재 구동중인 docker container 및 이미지의 프로세스를 중지 및 삭제한다.
프로세스의 중지 및 삭제가 완료되면 위의 작성에 스크립트를 실행해 준다.
- docker-server에서 도커 이미지를 실행하기 위한 작업을 진행한다.
docker-server의 ip는 172.17.0.3 이므로 해당 hosts 파일에 해당 ip 주소를 추가한다. (네트워크 wifi 환경의 변화로 인해 기존의 ansible-server의 ip와 docker-server의 ip가 서로 바뀌었다.)
- docker- server로 이동하여 현재 docker 프로세스 상태와 이미지 상태를 확인한다. 위에서 작성한 내용의 이미지와 동일한 도커 프로세스가 실행중이거나 이미지가 존재한다면 삭제를 수행한뒤 아래의 작업을 진행한다.
- 여기서 hosts에 등록된 ip address의 주소가 2개 이므로 2개에 docker 서버에 위의 스크립트 내용이 수행될 것이므로 1개의 서버에만 실행되도록 하는 명령어는 아래와 같다.
# 172.17.0.4 서버에만 적용 (ansible 서버)
ansible-playbook -i hosts create-cicd-project-image-playbook.yml --limit 172.17.0.4
# 172.17.0.3 서버에만 적용 (docker 서버)
ansible-playbook -i hosts create-cicd-project-container-playbook.yml --limit 172.17.0.3
- 각각 실행된 결과는 아래와 같다.
ansible 서버에서의 실행 결과는 아래와 같다.
ansible-playbook -i hosts create-cicd-project-image-playbook.yml --limit 172.17.0.4
PLAY [all] *************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [172.17.0.4]
TASK [create a docker image with deployed waf file] ********************************************************************
changed: [172.17.0.4]
TASK [push the image on Docker Hub] ************************************************************************************
changed: [172.17.0.4]
TASK [remove the docker image from the ansible server] *****************************************************************
changed: [172.17.0.4]
PLAY RECAP *************************************************************************************************************
172.17.0.4 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
docker-server의 결과는 아래와 같다.
ansible-playbook -i hosts create-cicd-project-container-playbook.yml --limit 172.17.0.3
PLAY [all] *************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [172.17.0.3]
TASK [stop current running container] **********************************************************************************
changed: [172.17.0.3]
TASK [remove stopped cotainer] *****************************************************************************************
changed: [172.17.0.3]
TASK [remove current docker image] *************************************************************************************
changed: [172.17.0.3]
TASK [pull the newest docker image from Docker Hub] ********************************************************************
changed: [172.17.0.3]
TASK [create a container using cicd-project-ansible image] *************************************************************
changed: [172.17.0.3]
PLAY RECAP *************************************************************************************************************
172.17.0.3 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
4. 변경된 사항을 Jenkins에서 수행하기
2023.05.10 - [로컬 환경 구성/로컬 개발환경 구성] - 8. Jenkins과 Ansible 연동 및 Ansible Playbook 사용하기
- 위의 URL을 참고하여 생송한 Ansible-Server를 복사 한뒤 Playbook-Project라고 명명한다.
그리고 불러온 프로젝트 정보에서 아래의 내용만 수정한다.
기존의 exec커맨드에서는 아래와 같이 설정이 되어 있을 것인데, 아래의 설정을 변경해 보자.
- 변경
- 변경 커맨드는 아래와 같다.
ansible-playbook -i hosts create-cicd-project-image-playbook.yml --limit 172.17.0.4,
ansible-playbook -i hosts create-cicd-project-container-playbook.yml --limit 172.17.0.3
- 위와같이 설정하면 jenkins에서 설정된 ssh로 먼저 접근 후 위의 명령어를 실행하여 작업이 진행됨을 알 수 있다.
- 끝 -
'로컬 환경 구성 > 로컬 개발환경 구성' 카테고리의 다른 글
10. Minikube를 활용한 k8s 환경 구축하기 (0) | 2023.05.12 |
---|---|
8. Jenkins과 Ansible 연동 및 Ansible Playbook 사용하기 (0) | 2023.05.10 |
7. Ansible Playbook 사용하기 (1) | 2023.05.10 |
6. Ansible Module (0) | 2023.05.09 |
5. Ansible 구성 (0) | 2023.05.09 |