인프런

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


notion image
 

[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
결과
notion image
 

[2-2]. shell 모듈

ansible [groups] -m shell -a “리눅스 명령어”
결과
notion image
 

[2-3]. copy 모듈

ansible [groups] -m copy -a “src= dest=”
결과
  • 원본(src) 파일이 dest(복사할 위치)에 복사된다
notion image
 

[2-4]. yum 모듈

ansible [groups] -m yum -a “”
결과
  • 명령어 실행 전
    • notion image
  • 명령어 실행 후
    • notion image
 
💡
이처럼 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에 추가되었다 !
notion image
 
❗️여러번 실행한다면?
  • 앞서, 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 추가
notion image
 
 
 
 

[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;
 
 
 

📎 출처