IaC - Terraform, Ansible

jsbak·2023년 5월 15일
0

Cloud

목록 보기
45/59

Infrastructure as Code

IaC (코드형 인프라) 란?

  • IaC: Infrastructure as Code - 코드로 인프라 관리
    • 파일의 내용에 따라 인프라가 만들어진다.
  • 코드(스크립트)를 작성 및 실행하여 인프라를 생성, 배포, 수정, 정리하는 것
    • 서버를 물리적으로 설치하는 등의 하드웨어 측면을 포함하여 운영의 모든 측면을 소프트웨어적으로 생각하는 중대한 사고 전환을 보여줌.
  • 코드형 인프라의 핵심은 서버, 데이터베이스, 네트워크, 로그 파일, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등 거의 모든 것을 코드(스크립트)로 관리 가능
  • 코드현 인프라 도구로는 애드혹 스크립트, 구성 관리 도구, 서버 템플릿 도구, 오케스트레이션 도구, 프로비전 도구 등이 있다.

애드혹 스크립트

  • 수행할 작업을 단계별로 나누고 배시(Bash)와 같은 언어를 사용하여 각 단계를 코드로 정의하고 작성된 스크립트를 서버에서 수동으로 실행하는 것
    • 자동이라기 보다는 수동
  • 코드를 직접 작성하여 매번 수동으로 맞춤 코드를 작성해야 되기 때문에 간단한 설치에 적합
  • 예시
#!/bin/bash
yum install -y httpd
systemctl enabled --now httpd
echo "Hello World" > /var/www/html/index.html

구성 관리 도구(Configuration)

  • 셰프(aws), 퍼핏(openstack), 앤서블, 솔트스택 등은 모두 구성 관리 도구로써 대상 서버에 소프트웨어를 설치하고 관리하도록 설계
    • 서버 자체를 만들지는 않으나 여러 서버를 일괄적으로 관리하고 싶은 경우
    • 파이썬SSH를 이용
  • 배시 스크립트와 비슷해 보이나 애드혹 스크립트를 사용할 때와 다른 여러 가지 장점 존재
    1. 코딩 규칙
      구성 관리 도구는 문서화, 파일 레이아웃, 명확하게 이름 붙여진 매개 변수, 시크릿 관리 등을 포함하는 코딩 규칙으로 일관되고, 예측 가능한 구조를 제공
    2. 멱등성
      구성 관리 도구는 실행 횟수에 관계없이 설정 파일을 사용하여 소프트웨어가 설치되지 않았을 경우에만 설치하고 소프트웨어가 동작하지 않는 경우에만 동작 - (실행 횟수와 관계 없이 매번 동일한 결과를 볼 수 있는 가, 한번 수행한 것은 스킵)
    3. 분산형 구조
      애드혹 스크립트는 단일 로컬 머신에서만 실행되도록 설계되어 있지만 앤서블과 같은 구성 관리 도구는 원격의 수많은 서버를 관리하기 위해 특별히 설계된 것
      관리가 필요한 서버들의 IP를 정리한 hosts 파일을 생성하고 플레이북을 정의하여 실행
      플레이북 - 모든 워크플로우, 표준화된 업무 프로세스, 필요한 조치, 비즈니스 목표 등을 기술한 문서

💦 서버 템플릿 도구

  • 도커, 패커, 베어그런트와 같은 서버 템플릿 도구는 여러 서버를 시작하고 각각 동일한 코드를 실행하여 서버를 구성하는 기존 방식과 다르게 운영체제, 소프트웨어, 파일 및 기타 필요한 모든 내용을 포함하고 있는 스냅샷으로 ❗이미지❗를 생성하여 모든 서버에 이미지를 설치 가능
    • 베어그런트; VM 배포를 도움
  • 실행은 서버에 이미지를 배포한다고 볼 수 있다.
  • 💤 구성 관리 도구와의 차이는 없는 서버를 만든다는 차이가 있다.

오케스트레이션 도구

  • 서버 템플릿 도구는 VM이나 컨테이너를 생성하기에는 좋은 도구이지만 ❗ 관리 부분 ❗이 부족하기 때문에 오케스트레이션 도구가 필요
  • 오케스트레이션 도구는 VM 과 컨테이너 배포, 효율적 업데이트 및 롤백, 자동 복구(치유), 자동 확장(조정), 로드 밸런싱, 서로 식별하고 통신할 수 있게 서비스 검색 기능을 제공
    • 오케스트레이션 도구 = 컨테이너 관리 도구
  • 쿠버네티스를 사용하면 도커 컨테이너를 어떻게 관리할지 코드로 정의 가능
  • 오케스트레이션 도구의 종류 로는 온-프레미스에서 클러스터를 구축할 수 있는 쿠버네티스, 마라톤/메소스, 도커 스웜, 노마드 등이 있으며 퍼블릭 클라우드에서는 AWS EKS, Azure AKS, GCP GKE 존재
  • 구글에서 쿠버네티스를 만듬.

프로비전 도구

  • 구성 관리, 서버 템플릿 및 오케스트레이션 도구가 각 서버에서 실행되는 코드를 정의한다면 테라폼, 클라우드포메이션, 오픈스택 히트와 같은 프로비전 도구는 서버 자체를 생성
  • 서버 생성만 하는 것이 아니라 사실상 설정도 하고 있어서 인프라에 관한 거의 모든 부분을 프로비저닝
  • 각종 플랫폼에서 API를 제공하기 때문에 테라폼이 모든 것을 관리할 수 있었다.
    • 구성 관리 도구, 서버 템플릿 도구, 오케스트레이션 도구 겸의 역할을 모두 수행

IaC 장점

  • 수동으로 코드를 변환하지 않아도 되므로 소프트웨어를 효율적으로 배포 가능
  • 데브옵스의 일종으로 이를 도입한 조직은 배포 횟수 200배 증가 오류를 24배 빠르게 개선, 배포 시간을 2,555 배 감소
    1. 자급식 배포
      '마법의 명령어'를 알고 있는 소수의 관리자만 프로덕션 환경에 접속하여 배포를 진행해왔습니다. 하지만 인프라를 코드로 정의하면 전체 배포 프로세스를 자동화할 수 있으며 개발자도 필요할 때마다 자체적으로 배포를 진행할 수 있습니다.
    2. 속도와 안정성
      배포 프로세스를 자동화하면 사람이 진행하는 것보다 훨씬 빠르게 컴퓨터가 배포를 진행할 수 있습니다. 자동화된 프로세스는 일관되고 반복 가능하며 수동으로 진행했을 때 보다 오류가 적게 발생하기 때문에 더 안전
    3. 문서화
      시스템 관리자뿐만 아니라 누구나 읽을 수 있는 소스 파일로 인프라 상태를 나타낼 수 있습니다. 즉 모든 사람이 인프라 구조를 이해하고 업무를 볼 수 있도록 해줍니다.
    4. 버전 관리
      인프라의 변경 내용이 모두 기록된 코드형 인프라 소스 파일을 저장할 수 있으므로 버전을 쉽게 관리할 수 있습니다. 시스템에 문제가 생겼을 때 문제가 발생한 지점을 찾기가 수월합니다. 문제의 내용을 확인한 다음 문제가 없던 이전 코드로 다시 돌리면 문제가 해결됩니다.
    5. 유효성 검증
      인프라 상태가 코드로 정의도어 있으면 코드가 변경될 때마다 검증을 수행하고 일련의 자동화된 테스트를 실행할 수 있습니다.
    6. 재사용성
      인프라를 재사용 가능한 모듈로 패키징할 수 있으므로 모든 제품을 매번 처음부터 배포하는 대신 문서화되고 검증된 모듈로 일관되게 배포할 수 있습니다.

테라폼이란?

  • What is Terraform?
  • HashiCorp Terraform은 버전을 지정하고 재사용하고 공유할 수 있는 사람이 읽을 수 있는 구성파일에서 클라우드 및 온프레미스 리소스를 모두 정의할 수 있는 코드형 인프라 도구
  • 일관된 워크플로를 사용하여 수명 주기 동안 모든 인프라를 프로비저닝하고 관리 가능
  • 컴퓨팅, 스토리지 및 네트워킹 리소스와 같은 하위 수준 구성 요소는 물론 DNS 항목 및 SaaS 기능과 같은 상위 수준 구성 요소 관리 가능

테라폼의 동작방식

  • Terraform은 API를 통해 클라우드 플랫폼 및 기타 서비스에서 리소스를 생성하고 관리
  • 제공자를 통해 Terraform은 액세스 가능한 API를 통해 거의 모든 플랫폼 또는 서비스와 함께 작동 가능
  • Hashi Corp와 Terraform 커뮤니티를 이미 수천가지 유형의 리소스와 서비스를 관리하기 위해 1700개 이상의 공급자를 작성했으며 이 숫자는 계속해서 증가 중
  • AWS, Azure, GCP, Kubernetes, Helm, GitHub, Splunk, DataDog 등을 포함하여 Terraform Registry 에서 공개적으로 사용 가능한 모든 공급자를 찾기 가능

테라폼의 핵심 워크플로 3 단계

  • 쓰기: 여러 클라우드 공급자 및 서비스에 걸쳐 있을 수 있는 리소스를 정의
    • 보안그룹 및 로드 밸런서가 있는 VPC 네트워크 가상 머신에 애플리케이션을 배포하기 위한 구성을 생성
  • 계획: 기존 인프라 및 구성을 기반으로 생성, 업데이트 또는 파괴할 인프라를 설명하는 실행 계획을 생성
  • 적용: 승인 시 리소스 종속성을 고려하여 제안된 작업을 올바른 순서로 수행
    • VPC의 속성을 업데이트하고 해당 VPC의 가상 머신 수를 변경하면 Terraform은 가상 머신을 확장하기 전에 VPC를 다시 생성

참고

앤서블 이해하기

  • Ansible 은 여러 개의 서버를 효율적으로 관리할 수 있게 해주는 환경 구성 자동화 도구입니다.
  • 2012년에 마이클 데한이라는 개발자가 만들어 소스코드를 공개한 오픈소스 소프트웨어, 오픈소스 업계의 큰 손인 레드헷이 인수
  • 플레이북이라는 파일에 실행할 구성을 선언해 놓으면, 필요할 때 마다 자동으로 실행 시킬 수 있는 것이 가장 큰 특징
  • 웹 서버의 구성과, DB 서버의 구성을 선언해 놓으면 관리자들은 필요할 때마다 그 구성대로 서버의 설정을 배포할 수 있게 해주는 것
  • 기존 리눅스에서 동일한 환경을 구성하기 위해 Bash 쉘 스크립트에 패키지의 설치, 설정파일 수정 등을 나열하여 이를 실행하는 것이 일반적이다.
  • IT 기술력이 진보함에 따라 인프라 환경도 기존 Data Center 에서 cloud 환경으로 변화되고 있으며, 한 명의 관리자가 관리해야 하는 서버의 숫자가 ⬆
  • 클러스터에 존재하는 많은 서버들에 동시에, 동일한 환경을 배포해야하는 상황이 발생하게 되었고, Bash 쉘 스크립트의 한계점을 갖게 되었으며 이를 위해 고안된 IaC 개념
    • 환경의 배포와 구성을 규격화된 코드로 정희해 사용하는 것을 의미
    • 가능한 자동화 도구를 이용하여 인프라의 상태를 코드로 작성하고 이를 모든 서버에 배포함으로써 특정 환경을 동일하게 유지할 수 있도록 도움.

앤서블의 3가지 요소

  • 인벤토리 : 어디서 수행할 것인가?
  • 플레이북 : 무엇을 수행할 것인지?
  • 모듈 : 어떻게 수행할 것인지?

인벤토리

  • hosts 파일; 관리할 서버 ip 리스트 저장
  • 앤서블에 의해 제어될 대상을 정의
  • hosts.ini 파일에 정의해 사용, 여러 서버들의 SSH 접근 IP, 포트, 리눅스 사용자와 같은 접속 정보를 정의
  • 예시: 서버를 그룹 단위로 관리
    [webserver]
    web1 ansible_host = aaa.app.host
    web2 ansible_host = bbb.app.host
    [db]
    db1 ansible_host = aaa.db1.host
    db2 ansible_host = bbb.db2.host

플레이북

  • 템플릿; 각 서버들을 어떻게 구축할지 정의
  • 인벤토리 파일에서 정의한 대상들이 무엇을 수행할지 정의, yaml 포맷으로 설정
  • 단독으로 사용되는 것이 아닌 인벤토리와 플레이북의 조합으로 같이 사용
  • 예시
# `---` 은 필수는 아니나 앤서블의 플레이북의 시작을 알림.
--- 
- name: nginx install # 이름 지정
  hosts: all
  become: true # root 계정으로 진행하겠다.
  # `yum install -y nginx` 를 표현
  tasks: # 실제 진행 작업
    - name: nginx package install
      yum:
        name: nginx
        state: installed

모듈

  • 플레이북에서 task가 어떻게 수행될지 정의하는 요소
  • 타겟 호스트로 실제 작업을 처리하는 단위로 모듈이라는 개념을 사용
  • Python Code 를 호출하여 실행하기 때문에 Python이 필수적으로 필요, 앤서블 설치피 다양한 모듈이 같이 설치됨.
    • yum stsctl systemd copy git docker_container ... 등.
    • 예를 들어 yum 명령어를 통해 패키지를 설치할 때 yum 모듈을 사용되고 위 플레이북 예시에서 yum 부분이 yum 모듈을 정의하고 이를 사용하겠다는 의미

베이그런트(가상 서버 생성 도구)

  • 가상 시스템 환경을 관리하기 위한 도구
  • 가상 환경 셋팅 시간을 줄이고 개발성과 생산성을 높일 수 있도록 개발 환경 이나 테스트 환경을 자동으로 설정하도록 도움
  • 포터블 가상화 소프트웨어 개발환경의 생성 및 유지보수를 위한 오픈 소스 소프트웨어 제품의 하나
    • 개발환경 : 개발 생산성 증가를 위해 가상화의 소프트웨어 구성 관리의 단순화를 시도하는 버추얼 박스, 하이퍼-V, 도커 컨테이너, VM웨어, AWS 등
  • 루비 언어로 작성되어 있지만 생태계는 몇 가지 언어로 개발을 지원
profile
끄적끄적 쓰는곳

0개의 댓글