인프런
Jenkins + IaC와의 연동
date
slug
CI-CD-Pipeline-with-Jenkins-4
status
Public
tags
Jenkins를 이용한 CI/CD Pipeline 구축
author
summary
[Jenkins를 이용한 CI/CD Pipeline 구축] 강의 정리
type
Post
thumbnail
updatedAt
Jan 18, 2025 04:12 AM
category
인프런
📝 강의 정리Server Structure[1]. Ansible 기본 구성SSH Key 생성[2]. Ansible 모듈 테스트[2-1]. ping모듈[2-2]. shell 모듈[2-3]. copy 모듈[2-4]. yum 모듈[3]. Ansible Playbook[3-1]. blockinfile[3-2]. copy[3-3]. 다운로드[4]. Jenkins + Ansible Playbook[4-1]. Jenkins 시스템 구성[5]. Ansible을 이용한 Docker 이미지 관리[5-1]. docker hub 로그인[5-2]. playbook.yml 작성[6]. Jenkins + Ansible Playbook + Dockerhub[6-1]. Jenkins 프로젝트 생성[6-2]. 해당 프로젝트에 command 작성📎 출처
📝 강의 정리
Server Structure

[1]. Ansible 기본 구성
SSH Key 생성
- Ansible 컨테이너에서 다른 컨테이너로의 접근이 많기 때문에, 권한 정보를 저장해주기 위해 ansible 컨테이너에서 ssh key를 생성해준다.
ssh-keygen
- 생성된 키를 접근할 컨테이너들에 copy
ssh-copy-id root@
[
IP ADDRESS
]
[2]. Ansible 모듈 테스트
- -i : 적용될 스트들에 대한 파일 정보
- -m : 모듈 선택
- -k : 관리자 암호 요청
- -K : 관리자 권한 상승
- --list-hosts: 호스트 목록
- Ansible의 특징:
멱등성
→ 같은 설정을 여러 번 적용하더라도 결과가 달라지지 않는 성질
[2-1]. ping모듈
ansible [groups] -m ping
결과

[2-2]. shell 모듈
ansible [groups] -m shell -a “리눅스 명령어”
결과

[2-3]. copy 모듈
ansible [groups] -m copy -a “src= dest=”
결과
- 원본(src) 파일이 dest(복사할 위치)에 복사된다

[2-4]. yum 모듈
ansible [groups] -m yum -a “”
결과
- 명령어 실행 전

- 명령어 실행 후

이처럼 ansible을 활용하면 등록되어진 모든 타겟서버를 제어할 수 있다.
[3]. Ansible Playbook
사용자가 원하는 내용을 미리 작성해 놓은 파일
- 다수의 서버에 반복 작업을 처리하는 경우
→ 설치, 파일 전송, 서비스 재시작 등
-- playbook.yml - name: Ansible_vim hosts: localhost tasks: - name: Add ansible hosts blockinfile: path: /etc/ansible/hosts block: | [mygroup] 172.~~~
[3-1]. blockinfile
[3-1-1]. yml 작성
--- - name: Add an ansible hosts hosts: localhost tasks: - name: Add an ansible hosts blockinfile: path: /etc/ansible/hosts block: | [mygroup] 172.17.0.5
[3-1-2]. playbook.yml 파일 실행
ansible-playbook [playbook파일명].yml
결과
- playbook.yml 파일 내의 block 부분이 hosts에 추가되었다 !

❗️여러번 실행한다면?
- 앞서, ansible은 멱등성의 특징을 가진다고 했다.
따라서, playbook을 여러 번 실행하더라도 실행할 때마다 같은 내용의 블록이 추가되지는 않는다.
[3-2]. copy
- name: Ansible Copy Example Local to Remote hosts: devops tasks: - name: copying file with playbook copy: src: ~/sample.txt dest: /tmp owner: root mode: 0644
[3-3]. 다운로드
--- - name: Download Tomcat9 from tomcat.apache.org hosts: devops tasks: - name: Create a Directory /opt/tomcat9 file: path: /opt/tomcat9 state: directory mode: 0755 - name: Download Tomcat using get_url get_url: url: https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.98/bin/apache-tomcat-9.0.98.tar.gz dest: /opt/tomcat9 mode: 0755 checksum: sha512:https://downloads.apache.org/tomcat/tomcat-9/v9.0.98/bin/apache-tomcat-9.0.98.tar.gz.sha512
[4]. Jenkins + Ansible Playbook
[4-1]. Jenkins 시스템 구성
[4-1-1]. playbook 실행에 필요한 파일 작성
- 인벤토리 파일 →
hosts
- playbook.yml파일 →
first-devops-playbook.yml
[4-1-2]. SSH Publishers에 Ansible server 추가

[5]. Ansible을 이용한 Docker 이미지 관리
[5-1]. docker hub 로그인
[5-2]. playbook.yml 작성
- hosts: all # become: true tasks: - name: stop current running container command: docker stop my_cicd_project ignore_errors: yes - name: remove stopped container 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 pull YOUR_REPOSITORY/cicd-project-ansible args: chdir: /root - name: create a container using cicd-project-ansible image command: docker run -d -p 8080:8080 --name my_cicd_project YOUR_REPOSITORY/cicd-project-ansible
- playbook 실행 시, -i hosts 옵션으로 인해 이미지 PUSH가 불필요하게 여러 번 수행된다. 따라서
--limit [IP ADDRESS]
옵션으로 명령을 수행할 서버만 지정한다.
[6]. Jenkins + Ansible Playbook + Dockerhub
[6-1]. Jenkins 프로젝트 생성
[6-2]. 해당 프로젝트에 command 작성
ansible-playbook -i hosts --limit [ANSIBLE_SERVER_IP_ADDRESS] create-devops-cicd-image.yml; ansible-playbook -i hosts --limit [DOCKER_SERVER_IP_ADDRESS] create-devops-cicd-container.yml;