[Ansible] 앤서블(Ansible) 개념과 설치/사용법 (w/ CentOS 7.6)

2020. 3. 10. 18:52Engineering/Cloud

Content

1. Ansible 이란?
2. Ansible 용어
3. Ansible 설치와 초기 설정 (w/ CentOS 7.6)
4. Ansible 사용법


 

Ansible 무엇인지 이해하고, 직접 설치하고 사용하는 방법을 익힌다.


 

1. Ansible 이란?

Ansible 인프라 관리를 코드 기반으로 자동화하는 도구 입니다.

 

 

 

Infrastructure as Code (IaC) 들어보셨나요?

이름 그대로 IT 인프라를 코드 기반으로 자동 설치 구축/관리/프로비저닝 하는 프로세스 말합니다.

IaC 도구들이 있기 , 인프라 구축을 위해서는

관리자들이 다양한 IT 인프라들에 직접 접속하여 필요한 프로그램을 설치하고 셋팅해왔습니다.

수동으로요!

인프라를 구성하는 자원들이 많아질수록 수동적인 인프라 구축 작업은 너무나 고된 일이 되죠.

 

 

그런데 IaC라는 컨셉이 등장하고 관련 도구들이 나오면서 자동화된 인프라 구축 가능해졌습니다.

코드 스크립트를 실행하기만 하면 코드가 알아서 해주게 된거죠.

관리자들은 이상 인프라 자원에 접속할 필요도, 설치와 설정을 수동으로 수행할 필요도 없어졌습니다.

 

 

Ansible은 이런 IaC를 지향하는 오픈소스 기반의 자동화 관리 도구 입니다.

자동 구축/관리 하려는 원격 인프라에언가 명령을 전달하는 방식으로 동작 합니다.

 

 

다른 IaC 솔루션들 대비 Ansible이 갖는 특징들은 아래와 같습니다.

 

1) Agentless

Chef/Puppet 같은 기존 IaC 솔루션들 원격 서버에 에이전트를 설치할 필요 있었습니다.

따라서 명령을 내려주는 Controller 서버와 원격 서버에 설치된 Agent들이 명령을 주고 받는 방식으로 동작했죠.

그러나 앤서블(Ansible) SSH기반으로 원격 서버에 명령을 전달하기 때문에 에이전트가 필요 없습니다.

 

Agent 필요 없다는 , 원격 서버에 접속해서 agent 설치해줄 필요가 없다는 것이죠!

agent 설치 단계를 제거하여 인프라 구축을 자동화에 가깝게 만든 것입니다.

 

 

2) 접근 용이성

앤서블은 Controller 서버가 원격 서버들에게 무언가 명령을 전달하도록 동작한다고 했죠?

물론 Controller 서버에서 명령어를 입력해도 되지만,

이러한 행위는 자동화의 의미와는 거리가 멉니다.

 

진정한 의미의 자동화를 위해서는 명령어들을 모아서 한번에 처리할 있어야 합니다.

스크립트 파일을 실행만 시키면 스크립트 파일 내에 있는 모든 명령이 주르륵 실행 되듯이 말이죠.

 

앤서블은 이러한 명령 모음집(뒤에서 소개할 playbook)YAML형식의 파일로 관리 합니다.

YAML 파일의 훌륭한 가독성 덕분에 사용자들이 느끼는 앤서블의 진입장벽이 낮습니다.

 

 

3) 멱등성 (idempotence)

멱등성이란 여러번 수행해도 같은 결과를 뱉는 성질 말합니다.

앤서블은 YAML 관리되는 명령집 여러번 수행하더라도 언제나 같은 결과가 나올 있도록 여러가지 관리를 합니다.

 

 

 

2. Ansible 용어

1) Controller 서버*

*Ansible에서 사용하는 용어는 아닙니다.

*이번 글에서 설명을 용이하게 하고자 정의한 용어 입니다.

Ansible 설치되는 서버로!

Ansible 명령을 여러 원격 서버에 전달하는 주체 되는 서버를 말합니다.

 

ansible의 Agentless 특징 잊지 않으셨죠?

이 특징 덕분에 Controller 서버에만 ansible을 설치하면 됩니다.

 

2) 인벤토리(Inventory) (=Ansible hosts 라고도 함)

Controller 서버가 명령을 전달할 원격 서버들의 목록 말합니다.

/etc/ansible/hosts 파일에 이 원격 서버들 목록이 저장되어 있으며, 이 파일을 인벤토리라고 합니다.

 

 

3) 플레이북(Playbook)

원격 서버에 전달할 명령들을 모아둔 명령집 입니다.

스크립트 파일이라고 생각하시면 편할 같네요!

 

 

 

아래 그림으로 정리해볼까요?

가운데 앤서블 로고가 Ansible 설치된 Controller 서버에 해당합니다.

Controller 서버는 본인이 관리할 원격 서버들 목록을 인벤토리 파일에 저장하고 있습니다.

그리고 ansible 사용자가 작성한 플레이북을 바탕으로 원격 서버들에 여러가지 작업을 수행합니다.

 

 

 

3. Ansible 설치와 초기 설정 (w/ CentOS 7.6)

1) Ansible 설치 (w/ centOS 7.6) 

ansible 설치는 controller 서버에만 하면 되겠죠? 

controller 서버에 접속하시고,

가장 먼저 EPEL yum 레포지토리를 추가합니다. 

$ yum install -y epel-release

 

 

 

EPEL 레포지토리가 정상적으로 추가 되었는지 레포 목록을 확인해봅니다.

$ yum repolist

 

 

네, EPEL 레포가 보이네요.

그럼 이제 yum을 통해 ansible을 설치합니다. 

$ yum install -y ansible 

 

Ansible이 잘 설치가 되었는지 확인해봅니다.

$ ansible --version

 

 

2) SSH key 생성

Ansible은 SSH 접속을 기반으로 원격 서버들에게 명령을 전달합니다. 

따라서 Controller 서버와 원격 서버간 SSH key가 공유되어야 합니다. 

Controller 서버에서 모든 작업을 완료할 수 있습니다. 

 

Controller 서버에서 ssh key를 하나 생성합니다. 

$ ssh-keygen

 

이제 생성된 key를 원격 서버에 복사 합니다. 

중간에 원격 서버의 계정 비밀번호를 입력하셔야 합니다. 

$ ssh-copy-id [원격서버계정ID]@[원격서버IP]

 

 

정상적으로 ssh key가 복사되었다면,

controller 서버에서 원격 서버로 ssh 접속을 시도할 때,

비밀번호 입력없이 바로 접속이 되어야 합니다.

확인해볼까요?

$ ssh [원격서버계정ID]@[원격서버IP]

 

네, 비번 입력 없이 바로 원격 서버에 접속이 되는것을 확인했습니다.

 

 

3) 인벤토리파일 작성 

/etc/ansible/hosts 가 인벤토리 파일이라고 말씀드렸습니다.

이 파일을 열고, 원격 서버 IP를 작성해주세요!

 

인벤토리 작성 문법은 다양합니다.

여러가지 기능을 활용하고 싶으시면 인벤토리 작성법을 검색해서 참고하세요!

이번 글에서는 간다히 ansible을 테스트만 해볼거라, 가장 기초 기능만 활용하겠습니다. 

 

$ vi /etc/ansible/hosts

 

 

 

인벤토리 목록에 있는 서버들로 접속이 정상적으로 이루어지는지를 확인합니다. 

$ ansible all -m ping

 

위 사진 처럼, 모든 원격 서버 목록이 SUCCESS여야 합니다~!

 

자, 그럼 ansible 사용을 위한 설치와 초기 설정이 모두 완료 되었습니다. 

 

 

 

4. Ansible 명령

여기서는 간단한 기능을 확인하기 위해 플레이북이 아니라,

한 줄 한 줄 명령줄을 입력해보겠습니다.

 

Ansible 명령 구조는 아래와 같습니다. 

 

$ ansible [host 또는 host그룹] options

 

 

[host 또는 host그룹]에 ansible 명령을 전달할 원격 서버들을 설정합니다.

일반적으로 'all'  을 사용하면 인벤토리에 적혀있는 모든 원격 서버에 명령을 전달합니다. 

 

 

 

가장 많이 사용되는 옵션은 '-m' 옵션으로, 

ansible에서 실행할 모듈을 불러오는 옵션입니다. 

모듈마다 필요한 인자값들이 다르니 그때그때 확인하셔야 합니다. 

 

 

 

저희는 Controller 서버에 test.txt라는 파일을 만들어두고,

이 파일을 ansible 을 통해 원격 서버에 복사해보겠습니다. 

아래 명령으로 수행할 수 있습니다. 

$ ansible all -m copy -a "src=~/test.txt dest=~/test.txt"

 

host 값에는 all을 넣어 인벤토리에 있는 모든 원격 서버에 명령을 전달하게끔 했고,

copy라는 모듈을 불러와서 파일 복사 명령을 수행하도록 했습니다. 

'-a' 옵션은 copy 모듈에 필요한 인자값을 전달하는 옵션으로, src file경로와 dest file 경로를 전달해주었습니다.

 

 

Controller 서버에서 위 명령을 수행하면 아래와 같은 화면을 보실 수 있습니다. 

 

이제 원격서버에 test.txt 파일이 잘 복사 되었나 볼까요?

 

네, test.txt 파일이 보이네요. 잘 복사 되었습니다.

 

 

 

이렇게 ansible에 대해 이해하고,

직접 ansible을 설치 및 사용해보았습니다. 

 

 

다음번엔 ansible을 사용해 Openshift 커뮤니티 버전인 OKD를 설치하는 방법을 알아보겠습니다. 

감사합니다!