IaC/Ansible 실습

Ansible | 개요, 용어, 아키텍처

Greta Lee 2021. 8. 6. 19:15
SMALL

1. Ansible이란?

Ansible은 애플리케이션, IT 인프라 같은 것들을 자동화하는 IaC 도구입니다. 시스템 구성, 소프트웨어 배포, CI/CD, 롤링 업데이트 등 명령어로 할 수 있는 모든 것들을 Ansible도 똑같이 할 수 있습니다.

Ansible은 마스터 서버가 따로 없고 에이전트를 사용하지 않습니다. 에이전트를 사용한다는 것은 관리 대상이 되는 시스템에 별도로 프로그램이 설치되어 있어야 한다는 뜻입니다. 반면 Ansible은 SSH 전송 방식을 이용하여 원격의 시스템 또는 플랫폼을 관리합니다. 현재 대부분의 시스템들은 Unix, Linux를 사용하기 때문에 기본적으로 OpenSSH를 사용합니다. 즉 SSH로 연결이 불가능한 시스템은 없습니다. 그래서 Ansible은 default 통신 방식으로 SSH를 사용하는 것입니다. SSH는 항상 존재하기 때문에 따로 별도의 프로그램을 설치할 필요가 없습니다.

꼭 SSH만 사용해야하는 것은 아닙니다. 쿠버네티스나 도커를 관리하는 경우에는 SSH를 사용하지 않습니다. 다른 연결 방식이 있긴 하지만 기본 연결 방식이 SSH입니다.


2. 용어

1) 제어 노드(Control Node(Host); Controller)

Ansible 또는 Ansible 엔진이 설치된 호스트 시스템을 제어 노드라고 합니다. 제어 노드에서는 ansible 또는 ansible-playbook 등의 명령어를 실행하여 Ansible을 사용합니다. Ansible은 Python으로 만들어졌기 때문에 항상 Python 인터프리터가 필요합니다. 따라서 Python이 설치된 모든 호스트를 제어 노드로 사용할 수 있습니다.

Windows 시스템은 제어 노드로 사용할 수 없습니다. 그 이유는 Ansible의 기본 연결 방식은 SSH인데, 윈도우는 SSH를 지원하지 않기 때문입니다. (Windows10은 SSH를 지원하지만 최근 들어 생긴 이벤트입니다.) Windows는 IaC 즉, Ansible을 실행하는 제어 노드(호스트)는 될 수 없지만, Ansible의 관리 대상이 되는 관리 노드(Managed Nodes)는 될 수 있습니다.


2) 관리 노드(Managed Node)

ansible에 의해 관리되는 시스템을 관리 노드라고 합니다. 베어 메탈, vm, 인스턴스, 네트워크 장비, 보안 장비 등 ssh만 연결되면 어떤 장비든 상관이 없습니다.


3) 인벤토리

인벤토리는 관리 노드의 목록을 가지고 있습니다. 앤서블은 반드시 관리 노드를 인벤토리라는 형태로 관리합니다. 인벤토리에 없는 시스템은 ansible이 관리할 수 없습니다. 그렇기 때문에 반드시 관리 대상이 되는 시스템은 인벤토리에 넣어주어야 합니다. 인벤토리 파일은 /etc/hosts 파일과 비슷하게 생겼습니다.


4) 플러그인

앤서블의 기능 확장을 위해 여러가지 플러그인을 제공합니다.


5) 모듈

모듈은 앤서블의 핵심이라 해도 과언이 아닙니다. 모듈은 앤서블을 실행하는 파이썬 코드입니다. 앤서블은 파이썬으로 만들어져 있습니다. 그렇기 때문에 앤서블 모듈 또한 파이썬으로 만들어져 있습니다.

/usr/lib/python3/dist-packages/ansible은 ansible이 설치되면서 생성되는 디렉토리입니다. /usr/lib/python3/dist-packages/ansible 디렉토리 아래에는 현재 기준 3,387개에 달하는 수많은 모듈들이 존재합니다.

ls /usr/lib/python3/dist-packages/ansible ansible-doc -l | wc -l


많은 모듈 중에는 대표적으로 apt 모듈이 있습니다. apt는 Debian이나 Ubuntu에 패키지를 설치하기 위한 모듈입니다. 설치할 패키지의 이름을 지정하면 해당되는 패키지를 설치하거나 삭제하는 등의 작업을 할 수 있습니다.

앤서블은 거의 모든 기능을 모듈이라는 형태로 만들어 놓고, 각 모듈들은 파라미터라는 변수를 통해 해당되는 변수의 값이 모듈에게 전송되어 원격 시스템에 실행됩니다.

modules 디렉토리에는 다음과 같이 여러 모듈 디렉토리가 카테고리별로 존재하는데, 아래 링크 문서의 Module Index 리스트의 이름과 동일합니다.

https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html

Module Index — Ansible Documentation

© Copyright 2019 Red Hat, Inc. Last updated on Jul 19, 2021.

docs.ansible.com

  • 클라우드 모듈 : SSH 형태 연결하는 것은 아닙니다. AWS, GCP, AZURE, OPENSTACK, DOCKER, PODMAN, 배포 관련 모듈
  • 클러스터링 모듈 : K8S
  • 커맨드 모듈 : shell
  • 데이터베이스 모듈 : mysql, mssql, postgresql. mysql로 mariaDB도 관리할 수 있습니다.
  • 파일 모듈 : copy, lineinfile(파일 수정) , blockinfile(파일 수정) , unarchive(압축 해제), archive(압축)
  • 네트워크 모듈 : 네트워크 장비
  • 패키징 모듈 : 운영체제 관련 패키지(maven_artifact(java), gem(ruby), python, pip, npm(nodejs)), apt, yum
  • 소스 컨트롤 모듈: git, github, gitlab
  • 스토리지 모듈 : Glusterfs(미니쿠베할때 나옴)
  • 시스템 모듈 : cronjob, filesystem, firewalld(방화벽), hostname, group, iptables, intefaces_file, known_hosts, lvg(lvm 관리), mount, open_iscsi, systemd, reboot, selinux, user, ufw(방화벽)
  • 웹 인프라 모듈 : apache, nginx
  • 윈도우 : 윈도우용은 기본적으로 ssh 사용하지 않기 때문에 윈도우 관리를 위해 특별히 따로 만들어졌습니다.


모듈 디렉토리를 타고 타고 들어가보면 파이썬으로 작성된 모듈들을 확인할 수 있습니다. 다음은 mysql 관련 모듈입니다.


Ansible은 이러한 모듈을 이용해서 관리 노드를 관리합니다. 좀 더 구체적으로 말하면, 관리 노드에 모듈을 ssh로 전송시켜 복사하여 관리 노드에서 실행합니다. 이것이 ansible의 기본적인 메커니즘입니다.


6) 작업(task)

앤서블의 작업 실행 단위를 작업(task)이라고 합니다. 작업은 Ad-hoc 명령과 ansible-playbook이라는 두 가지 형태로 실행할 수 있습니다. 하나의 작업은 하나의 모듈을 가지고 실행됩니다. 하나의 모듈은 하나의 작업을 실행할 수 있습니다. 즉 작업과 모듈은 항상 1:1의 관계입니다.


7) Ad-hoc 명령

앤서블 명령어를 이용해서 딱 하나의 단일 작업을 실행합니다. Ad-hoc은 '임시의'라는 의미를 가지고 있습니다. 하나의 작업은 하나의 모듈로 선언합니다.


8) 플레이북

멀티 태스크, 여러 작업을 정의하여 실행합니다. 플레이북은 YAML 형식의 파일입니다. 플레이북을 작성하여 ansible-playbook을 실행합니다.


9) 플레이

플레이는 앤서블 플레이북에 지정된 작업 목록을 말합니다.


정리하면, 하나의 모듈은 하나의 작업을 실행하고, 이러한 작업이 모여 플레이가 되고, 플레이가 모여 플레이북이 됩니다.


3. 아키텍처

  • Ansible Automation Engine : 앤서블이 설치된 컨트롤 노드입니다. 여기에는 인벤토리, 모듈, 플러그인과 원격 관리를 위해 REST API가 제공됩니다.
  • 사용자 : 현재 구성된 시스템 입장에서 devops 사용자가 됩니다. devops 사용자는 직접 엔진으로 가거나 플레이북으로 가는데, 전자의 경우 Ad-hoc 명령어를 실행하여 단일 작업을 수행하고, 후자의 경우 플레이북 파일을 작성하여 ansible-playbook 명령어로 작업을 실행합니다.
  • 호스트 : 한마디로 시스템입니다. 베어 메탈이든 VM이든 클라우드 인스턴스든 SSH로 연결만 가능한 시스템이라면 상관 없습니다.
  • 네트워크 : 네트워크 장비를 의미합니다. 네트워크 장비도 SSH로 연결하여 관리할 수 있습니다.
  • 퍼블릭/프라이빗 클라우드 및 CMDB : 원격으로부터 관리할 대상의 목록을 가지고 오는 것을 동적 인벤토리라고 합니다. 대부분의 클라우드나 컨테이너 환경의 경우, 관리할 대상이 자주 바뀝니다. 금방 새로운 VM이 만들어졌다가도 금방 지워지는 것이 자주 반복됩니다. 즉 라이프 사이클, 라이프 타임이 상당히 짧습니다. 물론 실제 운영 환경에서는 덜 하겠지만, 관리할 대상 호스트가 고정되어 있지 않습니다. (예전 베어메탈 환경에서는 거의 고정되어 있습니다.) 따라서 클라우드에서 플러그인 형태로 구성하여 인벤토리 정보를 가져오는 형태도 있고, CMDB(구성관리 데이터베이스; 회사의 자산 목록을 가지고 있는 DB)로부터 관리할 대상의 인벤토리 목록을 가져올 수도 있습니다. 이러한 형태를 동적 인벤토리라고 합니다.


사용자가 Ad-hoc 커맨드나 플레이북을 이용하여, 모듈로 하나 이상의 작업을 호스트나 네트워크 장비에 실행하여 시스템을 관리하는 것이 Ansible의 아키텍처입니다.

예) 워드프레스 하나를 배포하기 위해 apt update, 패키지 설치, 서비스 실행, 구성파일 변경 등 이런 절차적인 것들을 플레이북에 선언하고 플레이북을 선언하게 되면 해당되는 호스트나 네트워크 장비에 작업이 실행됩니다.

요약하면 이렇습니다. 컨트롤러(또는 컨트롤 노드)에 ansible이 설치되어 있고, ansible에 있는 모듈을 관리 노드에 전송시켜 실행하는 것입니다. 그렇기 때문에 반드시 컨트롤 노드와 관리 노드에 파이썬이 필요합니다.

SMALL