본문 바로가기
Infra/Jenkins

[Jenkins] IaC와 Ansible이란?

by 진꿈청 2024. 7. 20.

포스팅 시작에 앞서

 

이번 포스팅에서는 Jenkins에 관해 다루지 않는다.

 

IaC Ansible이란 무엇인지에 대해 다룬다.

 

 

 

 

IaC의 의미와 필요성

먼저, 설명하자면 IaC로 인프라를 구성하게 되면 기존의 인프라를 수동으로 구성하는 방법보다

훨씬 빠른 구성이 가능하다.

 

IaC

코드형 인프라(Infrastructure as Code), 즉 IaC는 인프라 설정을 코드로 작성하는 것으로,

클라우드 인프라스트럭처의 생성/수정/삭제를 자동화하는 방법이다.

 

이는 서버, 데이터베이스, 네트워크, 배포 프로세스, 테스트 등 거의 모든 것을 코드로 관리할 수 있게 도와준다.

현재와 같은 클라우드 네이티브 환경에서는 물리적 측면이 모두 코드로 대체될 수 있기에 가능하다고 할 수 있다.

 

비슷하게, IaC는 활용에 따라 인프라스트럭처의 설계도가 될 수 있다. 

 

인프라 구성도

 

즉, 코드를 통해 인프라를 관리하고 프로비저닝할 수 있다.

 

 

IaC의 장점

IaC는 다음과 같은 특징 및 장점을 가진다.

  • 인프라를 만드는 과정이 자동화되므로, 오류과 훨씬 덜 발생하며 안전하다.
  • IaC는 쉽게 공유할 수 있고, 버전 관리에도 용이하다.
  • 코드와 현재 상태를 비교하여, 추후 인프라 상태의 변경에 따르는 위험 분석 및 검증이 가능하다.
  • 배포 과정을 소수의 시스템 관리자만 진행하는 것이 아닌, 개발자가 스스로 배포하고 인프라 통제할 수 있는
    환경으로 만들 수 있다.
  • 즉, 코드를 사용하기에 오류/버전/식별이 간편하게 이루어진다.

 

특정 상황에 IaC를 대입해보자

다음 상황들

  • 위 인프라 구성도 그림에서 인프라를 완전히 다른 리전이나 IaaS에 똑같이 복제하고 싶은 경우
  • 특히, 해당 리전이 갑자기 사용할 수 없는 상황에 직면했을 경우
  • 기존과는 다른 새로운 아키텍처를 빠른 시간 내에 적용해야할 경우

 

수동 설정

 

수동 설정은 쉽게 서비스를 제공하고, 아키텍처를 빠르게 실험해볼 수 있다는 점에서는 유리하다.

하지만, 다음과 같은 단점을 가지고 있다.

  • 휴먼 에러 때문에 서비스를 설정할 때에 잘못 설정할 수 있음
  • 설정을 통해 예측되는 상태를 관리 및 식별이 어려움
  • 환경 설정에 관한 내용을 다른 팀 멤버에게 전달하는 것의 어려움

수동 설정이 나쁘다곤 할 수 없지만, 위의 상황들에서 IaC는 아주 큰 역할을 하게 된다.

 

IaC의 종류

절차형 IaC

프로그래밍 언어를 이용하여 직접 순차적으로 인프라를 생성하도록 코드를 작성하는 방법

선언형에 비해 더 강력한 일들을 할 수 있으나, 실제 적용된 결과를 가늠하기 어려우며 코드를 읽기에 직관적이지 않다.

(실제로 EC2를 추가로 생성할 갯수를 입력하는 등)

 

절차형 IaC의 종류

  • Amazon Web Services
    • Cloud Development Kit(CDK)
  • Pulumi
  • Red Hat
    • Ansible

선언형 IaC

선언형 언어 JSON, YAML 등을 사용하는 IaC를 말한다.

실제 인프라가 적용된 결과(기대하는 상태)와 적용할 내용(YAML 등)이 직관적으로 매핑된다.

(최종적으로 원하는 EC2 갯수를 입력하는 등)

 

선언형 IaC의 종류

  • Amazon Web Services
    • CloudFormation
  • Microsoft Azure
    • Blueprint
  • Google Cloud Platform
    • Cloud Deployment Manager
  • Terraform
    • 어떤 클라우드 서비스에도 적용되는 범용 IaC 도구

 

참고 내용

프로그래밍

Programming

  • imperative
    • Object-oriented
    • Procedural
  • declarative
    • Logic
    • Funcional

절차형 프로그래밍

imperative programming === How to

원하는 결과를 절차를 통하여 얻음

 

절차형 프로그래밍 언어에서는 비선언적 형태를 라이브러리나 프레임워크 등으로 캡슐화하여

선언형 프로그래밍을 흉내낸다.

 

선언형 프로그래밍

declarative programming === What is

원하는 결과를 선언한다.

 

따라서, 선언형 프로그래밍은 작업에 관한 깊은 이해가 높게 요구되지 않는다.

 

 

베어메탈(순수한 하드웨어 자체)

 

 

Ansible

 

 

우리는 위의 내용을 통해 IaC가 무엇이며 왜 필요한지 알아보았다. 그렇다면 IaC의 한 종류인 Ansible은 대체 무엇일까?

 

Ansible은 IaC로써 코드, 스크립트 형태로 인프라를 관리할 수 있게 도와준다.

 

Ansible을 이용하게 되면 우리는 기존에 도커에서 기동되었던 컨테이너를 다시 기동을 하거나 중지할 수 있으며

이미지를 다시 배포할 수 있다. 즉, Configuration Management, Deployment를 관리해주는 것이 가능하다.

 

또한, 프로비저닝이라던가 오케스트레이션 도구에서 사용이 가능하다.

 

 

Terraform vs Ansible

 

Terraform

 

Terraform은 클라우드에 상관없이 다중 클라우드, 다중 환경을 관리할 수 있는 도구이다.

하시코프라는 회사가 만들었으며 하시코프가 자체적으로 사용할 수 있는 언어인 DSL 스크립트 문법을 알아야 한다.

 

인프라들의 구성을 원하는 형태로 유지하기 위해 사용할 수 있는 오케스트레이션 도구이다.

어떤 부분이 문제가 생겼을 경우 해당 부분을 리로드 시켜주거나 삭제하고 새로 만드는 작업을 해준다.

 

해당 작업을 진행하기 위해서는 스크립트 형태로 작성을 해주어야 한다.

작성된 내용을 바탕으로 시스템의 상태를 변경하거나 유지하는 작업들에 사용한다.

 

Terraform프로비저닝 도구로써 사용자 서버에 관한 액세스 권한 관리뿐만이 아니라

필요한 소프트웨어를 설치하는 작업들에서 사용할 수 있다.

 

 

Ansible

Ansible은 기존에 이미 구성되어 있는 서버들의 정보 변경이나 설정등을 원하는 형태로 바꾸는 데 특화되어 있는 IaC도구이다.

(구성관리 도구라고 불리기도 한다.)

 

Ansible을 지원해주는 수천개 이상의 모듈이 존재하기 때문에 우리는 이를 사용할 수 있다.

다양한 서드파티 업체들이 모듈을 계속 내놓고 있기 때문에 그런 모듈과 쉽게 연동하여

다른 IaC에 비해 빠르고 가볍게 필요한 작업을 할 수 있다는 장점을 갖고 있다.

 

Ansible구성 관리 도구라고 불리고 있기에 시스템 자체를 교체하는 작업은 물론 가능하지만,

그런 작업을 주로 사용하는 것보다는 특정 문제점을 해결하는 용도, 어떤 문제가 발견됐을 때 문제의 발생 원인

그리고 그 문제를 복구하기 위해 대응할 수 있는 작업들을 스크립트화해서 기록을 해놓고 작업을 한다.

 

Ansible도 선언적으로 또는 절차적으로 필요한 모든 작업들을 구성할 수 있다.

 

또한, AWS와도 연동이 잘 되어 있어서 S3, EC2, 람다 등 100개 이상의 모듈과 연결을 해서

원하는 구성 정보와 인프라를 관리할 수 있다.

(서버가 갑자기 죽었을 경우 Ansible이 없으면 수동 작업을 해야 하지만, Ansible을 사용하면 스크립트를 통한 자동화 구성이 가능)

 

정리

Terraform은 인프라를 구축하는 용도로 많이 사용이 되며 인프라의 자체적인 내용을 구성하는데 많이 사용된다.

 

Ansible은 이미 구축되어 있는 서버들의 구성 정보를 변경하거나 관리하는 용도로 사용되는 서비스라고 보는게 좋다.

 


Ansible의 특징

Ansible 아키텍처

 

AnsiblePython언어로 만들어졌다. 또한, 다른 몇몇의 IaC와는 달리 Agent가 필요가 없다.

이 말은 즉슨, 관리하고자 하는 대상 서버에 추가로 설치할 어떤 작업도 필요가 없다는 것을 의미한다.

 

Ansible 사용시 에이전트가 클라이언트 단에 필요가 없기 때문에 파이썬이라는 프로그램 언어가 설치가 되어 있다고 하면

파이썬이 가지고 있는 네트워크 모듈을 통해 서버와 통신을 하게 된다.

 

따라서, 모듈을 통해 서버와 통신을 하므로 추가적인 에이전트는 없다고 보는 것이다.

(리눅스 시스템 같은 경우 기본적으로 파이썬이 설치가 되어있다.)

 

 

Inventory

  • 여러 서버, 다양한 OS를 갖는 서비스들에 관한 개별 제어 및 구성이 가능하다.

 

멱등성

  • 멱등성이란 여러번 수행해도 같은 결과를 뱉는 성질을 말한다.
  • Ansible은 YAML로 관리되는 명령집을 여러번 수행하더라도 언제나 같은 결과가 나오도록 관리한다.

 

 

 

Ansible를 통해 할 수 있는 작업

 

 

할 수 있는 일

  • 설치
    • apt-get
    • yum
    • homebrew(MacOS)
  • 파일 및 스크립트 배포
    • copy
  • 다운로드
    • get_url
    • git
  • 실행
    • shell
    • task

설치/복사/쉘 스크립트 등 다양한 작업을 Ansible 모듈을 통해 가능하다.

 

즉, Ansible 서버에서 대상 서버가 되는 곳에 프로그램을 다운로드 받고 설치 작업을 할 수 있으며,

파일을 복사할 수 있고 쉘 스크립트를 통해 시스템을 제어할 수 있다는 얘기가 된다.

 

이 밖에도 그림을 보면 알 수 있지만 AWS 서비스 제어, 지원하는 OS, 테스트 및 빌드 등 다양하게 가능하다.

 


Ansible 구성

Ansible Server 설치 (Linux)

  • yum install ansible
  • ansible --version

 

환경설정 파일 -> /etc/ansible/ansible.cfg

 

Ansible에서 접속하는 호스트 목록 -> /etc/ansible/hosts

(인벤토리와 관련해서는 따로 -i 옵션을 사용해서 지정이 가능하다)

 

hosts

  • [그룹]
  • IP Address 또는 hostname 식으로 저장이 가능하다.

 

마무리하며

 

이번 포스팅에서 IaCAnsible에 관해 간략하게 알아보았다.

앞으로 진행할 Jenkins 포스팅에서 Ansible이 계속 사용되기에 확실히 정리하고 가기 위함이다.

 

IaC와 Ansible은 아에 처음 접해보기에 많은 학습이 필요할 것으로 보인다!

 

 

 

 

 

 

 

참고 사이트

 

https://velog.io/@jm1225/Infrastructure-as-Code

 

Infrastructure as Code

지금까지 인프라를 수동으로 일일이 구성하였다면, Terraform 같은 IaC로 인프라를 빠르게 구성할 수 있다.

velog.io

https://www.redhat.com/ko/topics/automation/ansible-vs-terraform

 

앤서블과 테라폼 비교: 기능과 장단점 상세 설명

Ansible은 에이전트 없이 구성 관리 및 자동화를 단순화하고, Terraform은 인프라를 코드로 관리하고 배포하는 데 중점을 두며, 모두 오픈소스 자동화 제품입니다.

www.redhat.com

https://docs.ansible.com/

 

Ansible Documentation

Ansible community documentation Ansible offers open-source automation that is simple, flexible, and powerful. Got thoughts or feedback on the new documentation landing pages? We want to hear from you! Join us in the docs channel on Matrix or open a GitHub

docs.ansible.com

 

이도원 강사님의 Jenkins 강의