Profile picture

[Ansible] 앤서블(Ansible) 이란? (+ 설치)

JaehyoJJAng2023년 03월 21일

▶ 개요

IaC(Infrastructure as Code)는 코드형 인프라 라고 불리며,

인프라 전반을 수동으로 관리하는 것이 아닌 코드를 통해 인프라를 관리하고, 프로비저닝하는 것을 뜻한다.

IaC 를 사용하면 인프라 사양을 담은 구성 파일이 생성되기 때문에 구성을 편집하고, 배포하기가 훨씬 편해진다.

또한, 매번 동일한 환경을 프로비저닝하도록 보장할 수도 있다.


또한 버전 제어는 IaC가 가지고 있는 중요한 부분 중 하나이다.

다른 소프트웨어 소스 코드와 마찬가지로 구성 파일 또한 소스 제어가 필요하다.

코드로 인프라를 배포한다는 것은 인프라를 모듈식 구성 요소로 분할하고, 자동화를 통해 다양한 방식으로 결합이 가능하다는 뜻이기도 하다.


마지막으로 IaC로 인프라 프로비저닝을 자동화하게 되면 애플리케이션을 개발하거나 배포할 때마다

서버 관리자가 직접 서버, 운영체제, 스토리지 등의 인프라 구성 요소들을 수동으로 관리할 필요가 없어진다.

물론 이러한 작업은 관리자 재량에 따라 수동으로 관리하거나, Ansible과 같은 자동화 툴을 이용해도 된다.


▶ Ansible 도입의 이점

만약 관리자가 인프라를 아래와 같이 수동으로 관리하고 있다고 가정해보자.
image
IaC가 도입되기 이전에는 관리자가 단말기나, 콘솔을 통해 직접 서버에 접속하여 관리해줘야 한다.

만약 특정 서버가 작동 불능 정도의 문제가 발생하게 되면 해당 서버를 떼어낸 후, 새로운 서버를 도입해야 한다.

또 새로운 서버에는 기존 서버의 모든 설정들을 수동으로 다시 설정해줘야하는 문제가 발생한다.


하지만 Ansible과 같은 코드형 인프라 자동화 도구를 도입하게 되면 Ansible과 서버를 직접 연동 시켜주고, 서버의 목록(Inventory)와 서버들을 관리함에 있어 필요한 작업들의 절차를 담아 놓은 File(Play Books)를 지정해주게 된다.
image

만약 서버 한 대가 사용 못할 정도의 문제가 발생하게 되었을 때,

문제가 생긴 서버를 떼어내고, 또 다른 새로운 서버를 구축할 때 필요한 설정이나 환경들을 자동으로 구성할 수 있게되는 것이다.

또한 Ansible은 Agent 를 따로 설정할 필요가 없다는 특징이 있다.

각각의 서버에 파이썬이 설치되어 있다면 파이썬이 가지고 있는 Network Module을 통해 관리용 서버와 통신할 수 있다.


Ansible은 언제 사용되는가?

앤서블은 리눅스, MacOS, WSL을 지원하는 윈도우에 파이썬과 Ansible Core만 설치하면

어디에서나 플레이북(YAML 형식의 작업들을 순서대로 작성해놓은 파일)을 작성하고 이를 실행할 수 있다.

앤서블은 앤서블 코어가 설치되고 플레이북을 작성하여 실행할 수 있는 제어 노드

플레이북이 실행되어 애플리케이션 설치나 클라우드 시스템의 가상 서버 생성과 같은 작업이 수행되는 관리 노드 로 구성된다.

물론 앤서블은 제어 노드에만 설치되고 관리 노드에는 설치되지 않는다.

제어 노드에는 앤서블 코어가 설치되며,

사용자에 의해 정의된 PlayBook과 관리 노드를 정의해놓은 Inventory 파일에 의해 SSH 프로토콜을 사용하여 다양한 환경의 관리 노드 업무 자동화를 수행할 수 있게된다.


앤서블 아키텍쳐

image
앤서블 아키텍처는 제어 노드와 관리 노드 두 가지 유형의 시스템으로 구성된다.

앤서블은 제어 노드에 설치되어 실행되며, 앤서블이 실행되기 위해서는 제어 노드에 파이썬이 설치되어 있어야 한다.


제어 노드

앤서블이 설치되는 노드로 운영체제가 리눅스라면 제어 노드가 될 수 있다.

앤서블은 파이썬 모듈을 사용하므로 앤서블을 설치하고 실행하려면 시스템에 파이썬이 필수로 설치되어 있어야 한다.


관리 노드

관리 노드는 앤서블이 제어하는 원격 시스템 또는 호스트를 의미한다.

관리 노드는 위 그림처럼 리눅스가 설치된 노드일 수도 있고, 윈도우가 설치된 노드일 수도 있다.

앤서블은 별도의 에이전트를 설치하지 않으므로, 관리 노드는 제어 노드와 SSH 통신이 가능해야 하며, 파이썬이 설치되어 있어야 한다.


인벤토리

제어 노드가 제어하는 관리 노드의 목록을 나열해놓은 파일.

앤서블은 인벤토리에 사전에 정의되어 있는 관리 노드에만 접근할 수 있다.

또한 인벤토리 목록은 관리 노드의 성격 별로 다음과 같이 그룹핑이 가능하다.

# /ansible/inventory

192.168.10.101

[WebServer]
web1.example.com
web2.example.com

[DBServer]
db1.example.com
db2.example.com

플레이북

관리 노드에서 수행할 작업들을 YAML 문법을 이용해 순서대로 작성해놓은 파일.

앤서블은 이렇게 작성된 플레이북을 활용하여 관리 노드에 SSH로 접근해 작업을 수행한다.

따라서 플레이북은 자동화를 완성하는 가장 중요한 파일이며 사용자가 직접 작성한다.

---
- hosts: webservers
  serial: 5 # 한 번에 5대의 머신 업데이트 하라는 의미.
  roles:
    - common
      - webapp
- hosts: content_servers
  roles:
    - common
    - content

▶ 설치하기

Docker

우선 아래와 같은 Dockerfile을 작성해주자.

FROM ubuntu:latest
USER root

RUN apt-get update -y && apt-get upgrade
RUN apt-get install -y apt-transport-https wget gnupg software-properties-common
RUN apt-add-repository ppa:ansible/ansible
RUN apt-get install -y ansible
RUN useradd -m -s /bin/bash ansible

이미지를 빌드하고

docker build --tag yshrim12/ansible .

실행해주자.

docker run -d -it --name ansible \
-p 2222:22 \
--restart=always \
--hostname ansible \
yshrim12/ansible

컨테이너로 접속하여 ansible이 정상적으로 실행되는지 확인해보자.

docker exec -it ansible /bin/bash

ansible# ansible --version

image
이로써 ubuntu 컨테이너에 ansible 설치가 완료되었다.


마지막으로 SSH Key를 만들어주자. (접속중인 ansible 컨테이너에서 진행)

ssh-keygen -t rsa -f ~/.ssh/id_rsa

Linux

Arch

yay -S ansible

Debian

sudo apt-get install -y software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt-get install ansible -y

Managed hosts 명시

호스트명만으로 managed node 서버에 접근할 수 있도록/etc/hosts 파일에 managed node 별 호스트를 지정해주도록 하자.

for i in {1..5}; do echo "192.168.219.18$i mnode$i" | sudo tee -a /etc/hosts ;done

Managed Node 접근을 위한 SSH 키 복사

  • Ansible Master Node에서 Managed Node에 원활한 접근을 위하여 SSH 키를 복사하도록 하자.

먼저 Master node에서 새로운 SSH Keypair를 생성해주자.

ssh-keygen -t rsa -N "" -f /root/.ssh/forAnsible_id_rsa

다음으로 각 Managed node에 Public key를 복사해주자.

# 공개 키를 관리 노드에 복사
for i in {1..5}; do ssh-copy-id root@mnode$i; done

# 복사 확인
for i in {1..5}; do echo "HOST [$i]"; ssh mnode$i cat ~/.ssh/authorized_keys; echo; done

▶ 간단한 테스트

ansible 서버에서 간단한 Inventory, Playbook을 만들어 테스트해보자.


▸ inventory 파일 작성

먼저 Inventory 파일을 작성하자. 이 파일에는 Ansible이 관리할 호스트들의 정보가 포함된다.

[my_servers]
server1 ansible_host=192.168.219.150

여기서 server은 각 서버의 별칭이며, ansible_host는 각 서버의 real ip 주소이다.


▸ playbook 파일 작성

다음으로 Ansible Playbook을 작성하여 서버 ping을 테스트해보자.

---
- name: Ping test
  hosts: my_servers
  gather_facts: false

  tasks:
    - name: Ping servers
      ping:

image
정상적으로 테스트 완료 되었음.

  • hosts항목에는 방금 생성한 Inventory 파일에서 정의한 [my_servers] 그룹을 지정한다.
  • ping 모듈은 Ansible이 대상 서버에 접속하여 ping을 실행하고, 응답을 확인한다.

Loading script...