Ansible/01. IaC, Ansible 란? & 설치

코드형 인프라 (IaC), Ansible 개념 & 설치

Jaden Park 2021. 7. 19. 17:42

IaC 개념

IaC 장점

  • 비용 절감
  • 빠른 속도
  • 안정성
  • 코드화 및 버전 관리
  • 재사용성

 

IaC 도구 및 특징 비교

  • 구성 관리 / 배포
  • 가변 인프라 / 불편인프라
  • 절차적 / 선언적 언어
  • 마스터 및 에이전트 유무

 

 

 

Ansible 이란?

용어

  • 제어 노드
  • 관리 노드
  • 인벤토리
  • 플러그인
  • 모듈
  • 작업
  • Ad-hoc 명령
  • 플레이
  • 플레이북

 

아키텍쳐

 

 

 

Ansible 설치

 


IaC 개념

IaC(Infrastructure as Code: 코드형 인프라)는 인프라를 웹 인터페이스 대화형식의 도구를 사용해 수동적으로 인프라를 구성하는 것이 아닌, 시스템이 읽을 수 있는 인프라 정의 파일을 통해 인프라의 구성 관리 및 배포를 자동화하는 것을 일컫습니다.

인프라는 물리적 하드웨어 뿐만 아니라 가상 컴퓨터, 클라우드 등 관련 리소스를 IaC를 통해 구성 관리 및 배포할 수 있습니다.

 

 

IaC 장점

비용 절감

사람의 노력적인 측면에서 인프라 관리를 수동적으로 하지 않음으로 다른 생산적인 작업에 노력을 집중할 수 있습니다.

 

빠른 속도

인프라 구성 관리 및 배포를 자동화 함으로 신속한 실행을 가능하게 하고, 효율적으로 작업할 수 있는 가시성을 제공합니다.

 

안정성

수동으로 구성할 때와 같은 사람의 실수와 관련 위험을 제거할 수 있습니다.

 

코드화 및 버전관리

표준화된 포맷과 규칙으로 작성된코드 문서를 통해 누구나 읽을 수 있고 확인할 수 있습니다. 또한 코드는 변경 사항 이력을 남길 수 있어 추후 문제 발생 시 어떤 부분이 변경되어 발생한 문제인지 확인하기 쉽습니다.

 

재사용성

인프라를 코드화 하고 관련 리소스를 그룹 및 모듈화 하여 필요 시 필요한 부분을 재사용 할 수 있습니다.

 

 

IaC 도구 및 특징 비교

IaC 도구는 다양하며 각각 추구하는 목표가 조금씩 다릅니다. 다양한 IaC 도구의 특징을 비교해보겠습니다.

 

구성 관리 / 배포

 

구성 관리(Configuration Management) 도구

베어메탈 시스템, 가상 컴퓨터 및 클라우드 인스턴스 내에서 패키지 설치

애플리케이션 구성, 운영체제 관련 구성 및 구성 변경을 관리하는 도구

 

배포(Provisioning) 도구

새로운 인프라 리소스를 배포하고 이미 배포된 인프라 리소스의 생명 주기를 관리하는 도구

 

구성 관리 도구  :  Ansible, Chef, Puppet, SaltStack  ...

배포 도구          :  AWS CloudFormation, OpenStack Heat, Terraform ...

 

최근에는 구성 관리 도구 및 배포 도구의 기능상 차이를 정확히 구별하는 것이 점점 어려워지고 있습니다.

 

가변 인프라 / 불변 인프라

가변(Mutable) 인프라는 여러 관리 대상 인프라가 독립적으로 관리되며 별도의 변경 사항을 가지는 형태를 일컫습니다.

Ansible, Chef, Puppet, Saltstack 등 대부분 구성 관리 도구 가변 인프라에 초점을 맞추고 있습니다.

 

가상화, 컨테이너, 클라우드 컴퓨팅이 널리 퍼지기 이전에 서버 인프라는 물리(Baremetal) 서버를 중심으로 구성되었습니다.

정기적인 업데이트, 핫 픽스, 패치, 수동적인 변경 등 수 많은 변경이 발생하고, 각 서버는 인프라 전체에서 동일하지 않고 고유의 독립된 개체로 관리됩니다.

 

불변(Immutable) 인프라는 인프라가 배포된 후 절대로 변하지 않는 인프라를 일컫습니다.

클라우드 인스턴스 이미지나 컨테이너 이미지처럼 변하지 않는 이미지를 배포하는 것과 같습니다.

그렇게 만들어진 인프라 검증이 완료되면 서비스에 투입되고 기존 서버는 더 이상 사용하지 않습니다.

 

좋은 예로 도커가 있습니다. 도커는 애플리케이션 뿐만 아니라 실행 환경 자체를 이미지화해서 컨테이너를 실행할 때 기반이 되게 함으로 실행환경 자체를 버저닝하고 관리할 수 있습니다.

 

마이크로 서비스 아키텍쳐(MSA) 환경에서 불변 인프라의 필요성은 더욱 증가합니다. 이전에 모놀리식 아키텍쳐에서는 불변 인프라가 필요하지 않습니다. 왜냐하면 하나의 환경에 애플리케이션 전체가 구성이 되었기 때문에 단일환경만 잘 설치해놓고 장애를 준비해 놓으면 되었기 때문입니다.

 

불변 인프라 요약

  • 어떤 시점의 서버 상태를 저장해 복제할 수 있게 하자는 개념
  • 한번 설정된 서버는 수정없이 파기되므로 멱등성을 신경 쓸 필요가 없다
  • 버전관리 기능
  • 서버를 쉽게 삭제하고 늘릴 수 있음
  • 인프라 환경의 변경이 쉬워짐
  • 서버를 Configuration Drift 없이 깨끗하게 유지할 수 있음
    • 컨피그레이션 드리프트 : 손으로 직접 수정한 업데이트와 전반적인 엔트로피 증가로 인해 인프라 서버들이 시간이 갈수록 점점 서로 다른 상태가 되는 현상

 

절차적 / 선언적 언어

절차적인 언어는 원하는 최종 상태에 도달하기 위해 코드가 단계별로 정의되고 실행되는 형태를 일컫습니다.

대표적으로 Ansible , Chef 도구가 절차적인 형태를 따릅니다.

 

선언적인 언어는 최종적으로 원하는 형태를 정의만 하면 필요한 절차는 내부적으로 알아서 진행되는 형태를 일컫습니다.

대표적으로 AWS CloudFormation, OpenStack Heat, Puppet, SaltStack, Terraform 도구가 선언적인 형태를 따릅니다.

 

 

마스터 및 에이전트 유무

마스터 서버가 있음으로 중앙 집중화 된 관리 및 모니터링이 가능한 장점이 있지만, 추가적인 리소스의 필요, 마스터의 관리, 장애 등 단점이 존재합니다.

대표적으로 Chef, Puppet, SaltStack 도구는 인프라의 정보와 구성 관리 및 배포를 위한 정보를 가지고 있는 마스터 서버가 있습니다.

 

Chef, Puppet, SaltStack 도구는 서버가 관리할 인프라에 에이전트 소프트웨어의 설치 및 관리가 필요합니다.

 

 


 

Ansible 이란?

Ansible은 파이썬 기반으로 작성되었으며, module과 명령어를 사용하여 애플리케이션 및 IT 인프라를 자동화 할 수 있는 도구 입니다.

호스트를 구성하고, 소프트웨어를 배포하고, 지속적인 배포 및 다운 타임 없는 롤링 업데이트 등 고급 IT 작업을 조율할 수 있습니다. Ansible 의 주요 목적은 IT 장비 관리를 자동화하는 것 입니다.

 

컨트롤 노드(관리노드)는 리눅스나  유닉스 시스템만 가능합니다.

관리 노드는 어떠한 시스템이든 상관없습니다.

 

Ansible playbook 이라는 스크립트를 통해 IT 애플리케이션 infrastructure 를 정확하게 묘사할 수 있는 언어 입니다.

 

원래는 무료 오픈소스 프로젝트였으나 레드헷이 인수했습니다.

그래서 RHEL에서는 서브스크립션을 구매해야 사용할 수 있습니다. 하지만 커뮤니티 버전도 있어 무료로 사용할 수 있습니다.(단, 기술지원은 받을 수 없습니다)

Ansible은 1년에 약 2번 새로운 릴리스를 배포합니다.

 

Ansible의 장점

- SSH 기반이므로 원격 노드에 에이전트를 설치할 필요가 없음
- YAML 언어를 사용하기 때문에 쉽게 배울 수 있음
- 플레이북 구조는 간단하고 명확하게 구조화되어 있음
- 변수 기능을 사용하여 같은 작업에 대해서 다른 구성으로 쉽게 구성할 수 있음
- 다른 도구보다 훨씬 간소화 된 코드 기반

 

 

Ansible의 단점

- 다른 프로그래밍 언어를 기반으로 하는 도구보다 덜 강력
- 변수 등록은 기본적인 기능조차도 요구되기 때문에 더 쉬운 작업을 더 복잡하게 만들 수 있음
- 플레이 내 변수의 값을 확인하기가 어려움이 있음
- 입력, 출력, 구성 파일의 형식 간에 일관성이 없음
- 때때로 성능 속도가 저하됨

 

 

용어

제어 노드(Control Node)

Ansible이 설치된 모든 호스트 입니다.

제어 노드에서는 ansible 또는 ansible-playbook 명령을 이용하여 작업을 실행할 수 있습니다.

python이 설치된 모든 호스트를 제어 노드로 사용할 수 있습니다. 노트북, 데스크탑 및 서버 모두 Ansible을 실행할 수 있습니다. (관리만 하면 되므로 고사양을 요구하지 않습니다)

그러나 Windows 호스트를 제어노드로 사용할 수는 없습니다.

 

관리 노드(Managed Node)

Ansible로 관리하는 호스트 및 네트워크 장치입니다.

Ansible은 관리 노드에 설치되지 않습니다.

 

인벤토리(Inventory)

관리 노드의 목록으로, 관리 노드에 대한 호스트 이름이나 IP 주소와 같은 정보를 지정합니다.

여러 관리 노드를 그룹으로 조직화 할 수 있고, 중첩 그룹을 사용할 수 있습니다.

 

플러그인(Plugins)

Ansible의 핵심 기능을 확장할 수 있도록 다양한 플러그인을 제공합니다.

Ansible에 추가할 수 있는 코드나 기능입니다. (기능 확장이라고 생각하면 됩니다) 인벤토리 관련 플러그인, 접속 관련 플러그인 등 여러가지가 있습니다.

ex) Action, Become, Cache, Callback, Cliconf, Connection ...

 

모듈(Module)

Ansible을 실행하는 Python 코드 단위입니다.

각 모듈은 호스트에 패키지를 설치 및 관리하고 데이터베이스의 사용자를 관리하고 네트워크 장치의 VLAN 인터페이스를 관리할 수 있는 등 약 3000개의 모듈이 있습니다.

하나의 모듈은 하나의 작업을 실행할 수 있고 플레이북을 이용해 여러 모듈을 선언해 여러 작업을 수행할 수 있습니다.

 

작업(Task)

Ansible의 작업 실행 단위입니다.

하나의 모듈이 하나의 작업이 되며, Ad-hoc 명령을 통해 단일 작업을 수행하거나, 플레이북을 작성해 여러 작업을 실행할 수 있습니다.

 

Ad-hoc 명령

Ansible 명령을 이용하여 단일 작업을 실행할 수 있습니다.

 

플레이(Play)

플레이는 특정 관리 노드를 대상으로하는 순서가 지정된 작업 목록 입니다.

 

플레이북

플레이북(Playbook)은 하나 이상의 플레이를 가지고 있는 YAML 파일 입니다.

ansible-playbook 명령을 이용해 플레이북을 실행할 수 있습니다.

 

 

아키텍처

 

  • 시스템 유형으로 컨트롤 머신과 관리 노드가 있습니다.
  • 컨트롤 노드에 Ansible이 설치되며, 관리 노드들은 컨트롤 머신에 의해 유지되거나 관리됩니다.
  • 관리 노드들은 인벤토리 파일에 나열되어야 하며, 여기에는 호스트이름 또는 IP 주소로 저장됩니다.
  • 인벤토리에 각 관리 노드들의 기능별로 그룹화 시켜서 저장도 가능합니다.
  • 시스템 관리자는 컨트롤 노드에 로그인하여 플레이북 또는 원격 전송 명령을 사용하여 관리 노드를 제어할 수 있고, 이 때 인벤토리에 저장된 관리 노드들을 패턴 형식으로 지정하여 제어할 수 있습니다. 
  • 컨트롤 노드는 기본적으로 SSH를 사용하여 관리 노드와 통신합니다.
  • 플레이북에서 참조한 모듈은 관리 노드에 복사되며, 관리 노드에서 실행합니다
  • 사용되는 모듈의 종류로는 코어(core) 모듈과, 사용자 지정 모듈 등이 있습니다.

 

 

API

특정 프로그램과 연결할 수 있는 인터페이스. Ansible 사이트에서 사용할 수 있는 목록들을 확인할 수 있습니다.

 

 

CMDB

상태를 저장하는 DB. 서버 목록, 서버 구성 정보 등의 상태를 저장합니다. 인벤토리에서 관리대상을 체크하고 그 관리대상의 정보를 CMDB에 저장하고 활용합니다.

 

 


Ansible 설치

 

Ansible 설치는 Ansible 2.9 , Ubuntu 20.04 LTS 기준입니다.

 

요구사항

컨트롤 노드 요구사항

python2.7 or python3.5 이상 설치

RHEL, Debian, CentOS, Ubuntu, masOS, BSD 등 Unix 계열 (Windows 지원 안함)

 

관리 노드 요구사항 

SSH 통신이 가능해야 함

SFTP를 사용할 수 있어야 함 (SFTP를 사용할 수 없는 경우 SCP 사용 가능)
Python2.6 or python3.5 이상 설치

 

Ansible 설치

sudo apt update

sudo apt install -y software-properties-common

sudo apt-add-repository -y -u ppa:ansible/ansible

sudo apt install -y ansible

 

Ansible 자동 완성 명령 쉘

sudo apt install -y python3-argcomplete
sudo activate-global-python-argcomplete3

 

Ansible Lint 설치

sudo apt install -y ansible-lint
exec bash