Jenkins + Infrastructure as Code 와의 연동

이상훈·2023년 6월 16일
0

CICD

목록 보기
6/10

Iac

  • Infrastructure as Code
  • 시스템, 하드웨어 또는 인터페이스의 구성 정보를 파일(스크립트)을 통해 관리 및 프로비저닝
  • IT infrastructure, bare metal server 등의 물리 장비 및 가상 머신과 관련된 구성 리소스를 관리
  • 버전 관리를 통한 리소스 관리

Iac를 통해 코드(script)로 환경을 구축할 수 있게 되었다. 대표적인 Iac 도구로써 ansible, terraform, aws cloud formation, chef, puppet 등이 있는데 여기서는 ansible을 사용하겠다.


Ansible

  • 여러개의 서버를 효율적으로 관리할 수 있게 해주는 환경 구성 자동화 도구
    • Configuration Management, Deployment & Orchestration tool
    • IT infrastructure 자동화
  • Push 기반 서비스
  • Simple, Agentless

    Agentless : Ansible은 별도로 관리하고자 하는 대상 서버에 추가로 설치할 게 없다. ssh 프로토콜을 이용한다.

ansible을 host pc의 windows에 직접 설치하기에는 어렵다. 따라서 VM or 도커에다가 ansible server를 구동시키는데 여기서는 도커에다가 ansible server를 구동시키겠다. 참고로 연결은 ssh 프로토콜 통신을 사용한다.

ansible client로는 docker-server, ansible-server 두개를 지정하겠다.


  1. ansible docker 이미지 다운

    docker pull edowon0623/ansible

  2. 컨테이너 실행(DooD 방식으로 기동)

    docker run -itd --name ansible-server -p 20022:22 -p 8081:8080 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/ansible:latest /usr/sbin/init

  1. ssh 접속

    ssh root@localhost -p 20022
    password : P@ssw0rd

  1. ansible client 지정

    vi /etc/ansible/hosts에서 client의 ip주소 지정
    ex) [devops]
    172.17.0.3 (ansible-server)
    172.17.0.4 (docker-server)

  2. ssh key 생성을 통한 자동 로그인
    ansible 서버에서 다른 서버로 접속하려면 port forwarding이 아닌 해당하는 컨테이너의 ip address를 이용한다. 접속을 시도할때 id와 pw를 입력해야 하는데 매번 ansible에서 접속을 시도할때 입력하기 번거롭다. 따라서 ansible에서 키를 하나 만들어서 해당하는 키값을 서버들에게 전달하면 자동 접속이 가능하다.

    ssh-keygen
    ssh-copy-id root@172.17.04

Module

실행 옵션

  • -i(--inventory-file) -> 적용될 호스트들에 대한 파일 정보
  • -m(--module-name) -> 모듈 선택
  • -k(--ask-pass) -> 관리자 암호 요청
  • -k(--ask-become-pass) -> 관리자 권한 상승
  • --list-hosts -> 적용되는 호스트 목록

ansible은 기본적으로 멱등성 성질을 지닌다.

멱등성 : 같은 설정을 여러번 적용하더라고 결과가 달라지지 않는 성질

ex1) 연결 테스트

ansible all -m ping

핑 테스트 성공했다. 만약 172.17.0.4번 서버를 중지시키면 172.17.0.4는 Fail이 뜬다.

ex2) 메모리 확인

ansible all -m shell -a "free -h"

ansible client들의 메모리 상태를 확인할 수 있다. 참고로 리눅스에서 free -h 라는 명령어는 메모리를 확인시켜준다.

📌 ansible server는 모듈을 이용해서 파일 전송, 프로그램 설치 등 필요한 환경설정, 제어 작업들을 1번의 명령어로 client server들을 제어할 수 있다.

playbook

 ansible playbook은 사용자가 원하는 작업을 사전에 스크립트 파일 형식으로 작성하여 Ansible을 편리하게 활용할 수 있게 해주는 도구다. playbook은 yaml 형식으로 작성되며, 복잡한 작업을 수행하거나 여러 호스트에 대해 일괄 작업을 수행하는 데 유용하다.

ex1) ansible client 추가
1. playbook 작성

  1. playbook 실행

    참고로 Ansible은 멱등성 성질을 가지고 있어서 playbook을 여러번 실행시켜도 한번만 적용된다.

ex2) 파일 복사
1. playbook 작성

  1. playbook 실행

Jenkins + Ansible

 기존에 github에서 jenkins를 사용하여 코드를 가져와 war 파일로 빌드하고 docker 서버에 ssh를 통해 war 파일을 복사한 다음 실행시켰다. 하지만 기존에 만들어진 컨테이너를 2번 이상 실행했을 때 오류가 발생하는 문제가 있었다.

참고 : SSH + Docker가 설치되어 있는VM(컨테이너) 사용하기

이를 ansible을 이용해서 해결해보자.

  1. jenkins configure system의 publish over ssh에서 ssh 서버 추가

    name : ansible-server
    hostname : 172.17.0.3
    username : root
    password : P@ssw0rd
    port : 22

  1. item 생성
    • post-build actions의 send build artifacts over ssh 선택
      • ssh server
        • Name : [Publish over SSH에서 설정한 이름] ex) ansible-server
        • Transfer set
          • Sources files : target/*.war
          • Remove prefix : target
          • Remote directory : .
          • Exec command : ansible-playbook -i hosts first-devops-playbook.yml

            playbook 실행 명령어

    • 빌드 유발탭의 poll scm Scheduler 등록( * * * * *)
  1. ansible playbook 만들기

    1번 : 현재 작동중인 컨테이너 중지
    2번 : 해당하는 컨테이너 삭제
    3번 : 해당하는 이미지 삭제
    4번 : war 파일로 docker image 생성
    5번 : 이미지로 컨테이너 생성 및 실헹

    기존에 있었던 이미지와 컨테이너를 삭제하고 다시 생성하므로 에러가 발생하지 않는다.

  1. host file 만들기
    다음과 같은 ansible playbook 실행 명령어에서 hosts 자리에 ansible client의 address를 지정해줄 수 있다.
    ansible-playbook -i hosts first-devops-playbook.yml

  2. 결과 확인
    코드를 수정하고 커밋 푸시하면 자동으로 ansible이 war 파일을 가지고 image와 컨테이너를 만들어 실행시켜준다.


image를 dockerhub에 올리기

 만든 image를 docker hub 사이트에 올릴 수 있다.

docker tag cicd-project-ansible [본인 docker 계정]/cicd-project-ansible
docker push [본인 docker 계정]/cicd-project-ansible

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글

관련 채용 정보