본문 바로가기

로컬 환경 구성/로컬 개발환경 구성

9. Ansible을 이용한 Docker 이미지 관리 with Jenkins

# 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 사용하기

 

8. Jenkins과 Ansible 연동 및 Ansible Playbook 사용하기

# Jenkins과 Ansible을 연동하기 1. Jenkins의 시스템 설정으로 이동한다. 하단으로 이동하면 ssh 서버를 등록하는 메뉴가 존재한다. 거기에 추가 아이콘을 클릭하여 Ansible 서버를 등록해 준다. 아래와

may9noy.tistory.com

- 위의 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로 먼저 접근 후 위의 명령어를 실행하여 작업이 진행됨을 알 수 있다.

 

- 끝 -