IaC(Infrastructure as Code)

Ansible Part. 1 (Inventory)

cwchoiit 2024. 3. 17. 17:04
728x90
반응형
SMALL
728x90
SMALL

 

이제 서버 형상 관리 도구인 "Ansible"을 사용해보자. Ansible을 사용하기에 있어 가장 먼저 이해해야 하는 개념은 Inventory이다.

 

Inventory

인벤토리란 Ansible을 사용하는 것은 특정 서버에 대해 형상 관리를 하기 위함인데 그렇다는 것은 특정 서버에 대한 정보가 필요하다. 그 정보를 관리하는 파일을 'Ansible'에서는 Inventory라고 한다.

 

이 Inventory는 그룹 기능을 지원하는데 예를 들어 내가 Linux 운영체제의 배포판 중 하나인 Ubuntu 서버를 3개를 관리하고 있다고 하면 Ubuntu라는 그룹을 만들어서 해당 그룹에 3개의 서버를 모두 할당할 수 있다. 그럼 그룹으로 실행해야 하는 명령어나 상태 체크같은 것들이 가능해지니 효율적인 관리가 될 수 있겠다.

 

이 인벤토리는 크게 두 가지 종류가 있다.

  • Static Inventory
  • Dynamic Inventory

Static inventory는 말 그대로 정적 인벤토리고 변경되지 않는 서버에 대한 관리를 할 때 사용한다고 보면 된다. 가장 기본이 되는 방식이고, Dynamic inventory는 AWS와 같은 클라우드 기반 서버의 IP는 수시로 변경될 수 있고 Auto Scaling과 같은 기능을 사용해서 없던 서버가 새로 생기는 경우도 비일비재하다. 이럴 때 동적으로 관리가 가능하게 해주는 방법이 Dynamic inventory라고 보면 되겠다.

 

Inventory 소스 작성과 이해

그러면 이제 실제로 AWS에 EC2 인스턴스 총 4개를 가지고 연습을 해보자.

우선 이전에 Terraform을 배웠을 때 Network, EC2를 생성하는 코드를 통해 총 4개의 EC2를 만들것이다.

 

이건 이전에 테라폼에 대한 포스팅에 올라와있으니 참고하면 되고 이미 생성됐다는 가정하에 진행하도록 하겠다.

4개 EC2를 테라폼을 통해 만들고 생성한 Outputs 결과는 다음과 같다.

 

이 정보들을 가지고 Inventory 파일들을 만들어보자. 우선 내 디렉토리 구조는 다음과 같이 생겼다. 참고로 인벤토리 파일의 확장자는 필요하지 않다. 그저 구분짓기 위해 작성했다고 보면 된다.

 

amazon.inv

이 파일은 amazon instance의 Public IP가 기록되어 있다.

3.38.149.218
52.78.112.88

 

ubuntu.inv

이 파일은 ubuntu instance의 Public DNS가 기록되어 있다. 이렇게 IP와 DNS를 사용하는 경우 둘 다 가능하다는 것을 보여주기 위해 작성했다.

ec2-3-34-189-200.ap-northeast-2.compute.amazonaws.com
ec2-54-180-160-242.ap-northeast-2.compute.amazonaws.com

 

simple.inv

이 파일은 위에서 말한 그룹 기능을 사용한 파일이다. 대괄호로 그룹을 지정하고 그 하위에 그룹의 대상이 되는 녀석들을 작성하면 된다.

참고로 Ansible inventory에서는 기본으로 가지고 있는 그룹이 있는데 'all' 이라는 그룹이다. 이 그룹은 inventory에 정의되어 있는 모든 그룹을 포함하고 있다고 보면 된다.

[amazon]
3.38.149.218
52.78.112.88
[ubuntu]
ec2-3-34-189-200.ap-northeast-2.compute.amazonaws.com
ec2-54-180-160-242.ap-northeast-2.compute.amazonaws.com

 

alias.inv

이 파일은 IP나 DNS값을 기억하기가 까다롭기 때문에 별칭을 사용해서 해당 값을 치환해 놓은 파일이다. 여기서 별칭은 (amazon1, amazon2, ubuntu1, ubuntu2)가 되고 이 별칭들은 당연히 Unique 값이어야 한다. 그리고 이 별칭에 대해서 ansible_host라는 변수에는 IP나 DNS값이 들어가면 된다. 그럼 이렇게 만들어 놓으면 추후에 3.38.149.218을 지칭하는 대신에 amazon1이라는 별칭으로 표현해주기 때문에 가시성에서 효율적일 수 있다.

[amazon]
amazon1 ansible_host=3.38.149.218
amazon2 ansible_host=52.78.112.88
[ubuntu]
ubuntu1 ansible_host=ec2-3-34-189-200.ap-northeast-2.compute.amazonaws.com
ubuntu2 ansible_host=ec2-54-180-160-242.ap-northeast-2.compute.amazonaws.com

 

vars.inv

이 파일은 변수를 추가하는 파일이다. 그래서 보면 없던 값인 ansible_user라는 값이 있다. 이는 무엇이냐면 Ansible은 Agentless하기 때문에 SSH나 WinRM을 통해 원격으로 명령을 수행하고 특정 작업을 진행한다. 그러려면 접속 유저 정보가 필요하다. Amazon EC2는 기본 사용자가 'ec2-user'이고 Ubuntu는 'ubuntu'이다. 그래서 이런 사용자를 지정하지 않고 만약 Ansible이 어떤 명령을 수행하기 위해 SSH접속을 할 때 로컬 PC의 현재 사용자와 동일한 사용자로 접속하고는 한다. 그러면 문제가 발생하기 때문에 이렇게 ansible_user라는 유저가 필요한 것이다.

[amazon]
amazon1 ansible_host=3.38.149.218 ansible_user=ec2-user 
amazon2 ansible_host=52.78.112.88 ansible_user=ec2-user

[ubuntu]
ubuntu1 ansible_host=ec2-3-34-189-200.ap-northeast-2.compute.amazonaws.com ansible_user=ubuntu
ubuntu2 ansible_host=ec2-54-180-160-242.ap-northeast-2.compute.amazonaws.com ansible_user=ubuntu

[linux:children]
amazon
ubuntu

 

그리고 하위에 작성한 [linux:children]이라는 표기가 있는데 이는 하위 그룹을 의미하는데 Linux라는 그룹이 amazon, ubuntu라는 그룹을 포함한다라는 의미라고 생각하면 된다.

728x90
반응형
LIST

'IaC(Infrastructure as Code)' 카테고리의 다른 글

Ansible Part. 3 (Playbook)  (0) 2024.03.18
Ansible Part. 2 (Adhoc)  (3) 2024.03.17
Packer Part. 5 (Post Processor)  (2) 2024.03.15
Packer Part. 4 (Data Source)  (0) 2024.03.14
Packer Part. 3 (Provisioner)  (0) 2024.03.14