Ansible 연구하기(개념 및 설치)

반응형

Ansible Concept

안녕하세요 김민욱입니다.

 

이번 포스팅에서는 서버 배포 및 구성 자동화 툴인 Ansible에 대해 연구하고 설치 및 테스트까지 진행해 보고자 합니다. Ansible에 대해 아시는 분들이 훨씬 많으실테지만, 기본적으로 제가 연구하고 공부했던 내용들을 정리하였습니다.

 

기존 리눅스 환경에서 다수의 서버들을 구성하기 위해서는 일반적으로 Bash 쉘 스크립트를 사용합니다. 물론 지금도 스크립트는 많이 쓰여지고 있으며, Flask와 같은 파이썬 라이브러리를 이용해 스스로 원하는 자동화 툴을 구성하기도 합니다. 따라서 이들을 통해 패키지 설치, 의존성, 설정 구성 등을 일괄적으로 처리하기 위해 스크립트를 작성하고 각 로컬에서 실행할 수 있습니다. 

 

그러나 점차 관리해야 할 서버 수가 증가하고 클라우드 컴퓨팅 기술의 안정적인 도입으로 가상머신, 컨테이너와 같이 서버가 급증함에 따라 Bash 쉘 스크립트는 분명히 한계가 있을 수 있습니다. 따라서 다수의 서버 환경을 구성하고, 설치 등 필요한 동작들을 코드로 정의해 사용하는 Infrastructure as a Code 의 개념이 도입되었고, 이번 포스팅에서는 대표적인 자동화 프로젝트인 Ansible에 대해 포스팅합니다. 

 

그림 1. Ansible 로고

 

가상화 기술이 발전함에 따라 이를 기반으로 하는 클라우드 기술은 인프라 운영에 필수적인 기술로 자리 잡았습니다. 앞서 말씀 드린대로, 관리해야 하는 서버의 수가 증가하면서 자동화 툴은 현 인프라 분야에서 필수적인 도구입니다.

 

그 중 자동화 툴 중에서 가장 인기가 많은 자동화 툴인 Ansible은 현재 Redhat이 주도하여 운영되고있습니다. 그만큼 기능적인 상태나, 커뮤니티의 규모가 크다고 볼 수 있습니다. 개인적인 생각으로 다른 자동화 툴에 비해 Ansible은 Angetless 즉 대상에 필요한 데몬을 설치하고 구성한 뒤 상시 통신하는 방식이 아닌 SSH를 통해 서버를 구성합니다. 상용 환경에서 사용시, Agent 기반의 방법에 자주 야기되는 보안 문제 및 데몬 관리 그리고 고객의 입장에서 장비에 Agent를 설치한다는 것에 대한 거부감이 들 수 있습니다. 

 

따라서 Ansible은 Agentless 방식 기반으로하여 안정적이고 강력한 서버 구축 기능을 제공합니다. 물론 이것은 개인적인 기준에 의한 판단이며 상황에 따라서 다른 자동화 툴이 더 알맞을 수 있습니다. 

 

그림 2. Ansible Architecture

 

그림 2는 Ansible을 구성 요소를 나타냅니다. Ansible의 구성요소는 크게 3가지로 나뉩니다. 인벤토리(대상 혹은 어디서), 플레이북(무엇을), 모듈(어떻게)는 각각 어떤 대상에게 어떤 명령을 어떻게 수행하는지를 의미합니다.

 

* Inventory

인벤토리는 제어할 대상 즉 명령을 수행할 대상이 되는 서버의 목록과 그룹을 작성한 파일입니다. 다양한 서버들을 리스트화하고, 그룹명을 지정하여 그룹으로 묶을 수 있습니다. 또한 그룹마다 변수를 적용할 수 도 있으며 연속 된 서버들의 경우 172.30.1.[10:20]과 같이 리스트와 비슷하게 명시할 수 있습니다. 모든 서버들은 all 그룹에 포함되며 두개 이상의 그룹에 포함 될 수도 있습니다. (Inventory에 대한 문법은 추후 다루겠습니다.)

 

* Playbook

플레이북은 Yaml 파일로 인벤토리에서 정의한 서버들이 해야할 행동 혹은 작업들에 대해 정의합니다. Task 즉 작업들은 인벤토리에서 정의한 그룹별로 일괄적으로 수행할 수 있습니다. 이때 현재 호스트에서 명령을 수행하거나 파일을 복사하기 위해 현재 호스트에서 파일을 읽고 이를 대상 서버에 파일을 출력하는등 다양한 서버를 Playbook을 통해 관리 할 수 있습니다. (Playbook에 대한 문법 및 사용법은 추후 다루겠습니다.)

 

* Module

모듈은 Task로 하나의 명령어를 구현한 모듈을 의미합니다. 예를 들어 파일을 원격지로 복사할 때에느느 Copy,File 등의 모듈 등을 사용하고 패키지 설치를 사용할 때는 apt를 사용하기도 합니다. 모듈들은 모듈리스트에서 확인할 수 있으며 이는 Ansible 커뮤니티에서 활발하게 개발중입니다.

 

*Role

이 외에도 Ansible에느 Role라는 개념이 있습니다. Role은 여러개의 Task와 그에 따른 구조를 정의한 일종의 패키지로 플레이북 내에서 Include 하는 것이 가능합니다. Role은 여러 개의 Task를 구조적으로 프로젝트 구성에 필요한 데이터와 변수를 구조적으로 패키지화 합니다. 따라서 kubernetes, openstack 구성과 같은 복잡성이 높은 프로젝트에 대해서도 레포지토리 설정, 의존성, 구성 변경, 중복성 제거 등을 깔끔하게 체계화하여 자동화가 가능합니다.  이 역시 앤서블 갤럭시에서 Role을 다운받아 플레이북으로 간편하게 구성할 수 있습니다.

Installation

앞서  Ansible에 대해 알아보았습니다. 지금부터는 Ansible을 설치해보고 정상동작 테스트 및 유용한 플레이북을 활용하여 테스트를 진행해보겠습니다.  먼저 기본적으로 패키지를 업데이트하여 줍니다.  그 다음 sshpass를 설치해주어야하는데 설치를 하지 않고 대상들에게 명령을 수행하도록 할 경우 그림 3과 같은 에러가 발생합니다.

root@ansible-server:~# apt-get update && apt-get dist-upgrade -y
root@ansible-server:~# apt-get install -y sshpass

그림 3. sshpass 에러 예

 

다음은 Ansible을 설치해주어야 하는데 아래와 같이 apt를 이용해 아주 쉽게 설치가 가능합니다.

root@ansible-server:~# sudo apt install ansible -y

설치가 완료 되었다면,  vi 명령어를 통해 ansible.cfg 파일을 수정해야합니다. 이는 1.2.1 이후 버전부터는 호스트 키 확인 과정이 기본으로 활성화 되기 때문에 known_hosts 파일에 다른 키가 등록되면 충돌이 발생하고 이를 방지하기 위한 과정입니다. 

root@ansible-server:~# vi /etc/ansible/ansible.cfg

[defaults]
host_key_checking = False 

여기까지가 아주 쉽고 간편한 ansible 설치 및 부가적인 옵션들을 수정하는 과정입니다. 이후 Test에서는 인벤토리, 플레이북을 만들어보는 실제 Test를 진행해보도록 하겠습니다.

 

Test

쉽게 Ansible의 설치를 마치셨다면, 다음은 기본적으로 Ping 명령을 여러 서버에게 보내고 응답을 받는 Test를 진행해 보겠습니다. 먼저 기본으로 사용하는 공통 인벤토리를 사용해 보겠습니다. 만약 -i 와 같은 옵션으로 인벤토리를 지정해주지 않는다면 /etc/ansible/hosts에서 불러오게 됩니다. 

 

vi 에디터를 이용하여 hosts 파일을 수정해줍니다. 이번 테스트에서는 3개의 kubernetes 노드에게 각각 Ping을 보내고 응답을 받는 시나리오입니다. 먼저 kubernetes  그룹(이름은 임의대로 정하셔도 됩니다.)에  ip주소를 추가해줍니다. 각각 ip 주소 외에도 user, password 등을 더 입력해주셔도 됩니다. 

root@ansible-server:~# vi /etc/ansible/hosts


[k8sclusters]
172.30.1.101 ansible_user=ubuntu
172.30.1.102 ansible_user=ubuntu
172.30.1.103 ansible_user=ubuntu

명령수행 시 ansible_user는 user 아이디를 뜻합니다. 만약 그렇지 않다면 root로 접속을 시도할 수가 있기 때문에 각 대상의 아이디를 작성해 주었습니다. 만약 작성하지 않는다면 명령어 실행 시 옵션 -u를 이용하여 아이디를 넣어주어야합니다.  아래의 명령어를 이용해 k8sclusters이라는 그룹에게 ping(-m) 명령어를 보냅니다. 이때 패스워드를 입력을 받기 위한 -k 옵션을 추가해줍니다. 만약 패스워드를 입력받기 싫고 hosts에 입력하고 싶으시다면, ansible_password= [비밀번호]을 user 이름 뒤에 추가해주시면 됩니다. 

root@ansible-server:~# ansible k8sclusters -m ping -k

그림 4. 명령어 에러 발생

그림 4와 같이 /usr/bin/python: not found라는 에러가 발생한다면 앞서 입력했던 명령어에 아래와 같이 python 경로를 입력해주도록 합니다. 

root@ansible-server:~# ansible k8sclusters -m ping -k -e 'ansible_python_interpreter=/usr/bin/python3'

그림 5. Ping test 결과화면

그림 5와 같이 해당 명령어를 입력하면 SSH 패스워드를 묻습니다. 입력한 뒤 정상적으로 클러스터를 구성하는 Node들에 대한 Ping 테스트가 정상적으로 수신 되는 것을 확인할 수 있습니다. 

 

만약 -e 옵션을 계속주어 import 시키는 것이 불편하다면 hosts 파일에서 영구적으로 추가 시켜줄 수 있습니다. 

[k8sclusters:vars]
ansible_python_interpreter=/usr/bin/python3

k8sclusters라는 그룹 변수로 vars를 추가하고 아래에 -e의 인터프리터를 입력해 줍니다. 이제 -e 옵션을 입력할 필요가 없습니다.  

 

결론

이번 포스팅에서는 Ansible에 대해 알아보았습니다. 기본적인 개념과 설치 그리고 간단한 테스트를 알아보았고 이후 포스팅에서는 인벤토리 작성법, 유용한 플레이북 등을 알아보도록 하겠습니다. 

혹 궁금하시거나 틀린 부분이 있으시다면 말씀주시면 감사드립니다.

감사합니다. 

인용글

----------------------------------------------------------------------------------------------------------------------------

업데이트로그

------------------------------------------------------------------------------------------------------------------------------

해당 글은 스스로 연구한 내용을 통한 주관적인 이해를 바탕으로 작성 되었습니다. 수정 할 부분이 있거나, 다른 의견이 있으시다면 언제든지 말씀해주시면 반영하도록 하겠습니다. 읽어 주셔서 감사합니다. 끝으로 불법으로 복제하는 것은 금합니다.

 

반응형

댓글

Designed by JB FACTORY