[Ansible] #3.1 Ansible 기본 - 인벤토리

[Ansible] #3.1 Ansible 기본 - 인벤토리

Ansible 의 기본 구성요소인 인벤토리 에 대해서 알아보자.


1. 인벤토리 개념


Ansible 의 구성 파일은 쉽게 말해 설정 파일이다.
인벤토리 , 모듈 , 구성 파일 이 설정되어 있어야 Ad-hoc 이든, 플레이북 이든 사용할 수 있다.

우리가 하는 모든 작업은 제어 노드 에서 하게 되는데, 그 대상은 주로 관리 노드 가 되고, 이는 타겟 , 타겟 호스트 , 관리 대상 시스템 이라고 할 수 있다.

하지만 꼭 제어 노드 의 관리 대상이 관리 노드 가 되는 것은 아니며, 제어 노드관리 노드 가 될 수 있고, 관리 노드제어 노드 도 될 수 있다.

즉, 작업을 관리하는 주체가 다른 노드가 될 필요는 없으며, 자기가 자기를 제어할 수도 있다.

관리 노드 에 접속하기 위해서는 IP 정보가 필수적이다.
관리 노드 에 접속하기 위한 IP 정보 및 각 노드별 특정 정보를 INI 또는 YAML 방식으로 정의할 수 있다.

이를 인벤토리 라고 하는 것이다 !

2. 기본 인벤토리


기본 인벤토리 파일은 INI 형식의 /etc/ansible/hosts 파일이다.
기본적으로 모두 주석처리(#) 되어있다.
즉 예시로 ‘이렇게 사용하세요~’ 되어 있는거고, 빈 파일이나 다름없다고 보면 된다.

기본 인벤토리 파일 외에 인벤토리 파일을 지정하려면, Ansible 관련 명령에 다음 옵션을 지정한다.

-i path/to/inventory

위 옵션으로 인벤토리 파일의 경로를 지정할 수 있다.

자 이제 관리 노드 의 목록을 /etc/ansible/hosts 파일에 넣으면 된다고 생각할 수 있지만, 사실은 그렇지 않다.
일반적으로 Ansible 을 사용할 때는 /etc/ansible/hosts 파일을 사용하지 않는다.
실제로 Ansible 을 사용할때는 여러명이 사용하기 때문에, 계정이 다 다를 것이다(현재 사용중인건 vagrant 계정).
하지만 /etc/ansible/hosts 는 모두에게 적용되는 파일이기 때문에, 각자 관리하는 대상이 다른 사용자들이 모두가 공유하는 시스템 전체에 걸쳐서 사용되는 해당 인벤토리 파일을 사용하는 것은 적절하지 않다.

즉 !!! 일반적인 회사에서는 따로 인벤토리 파일을 만들어서 관리해야 한다.

추가로, 관리 노드 가 로컬 호스트(자기 자신)인 경우에는 인벤토리 없이 그냥 로컬 호스트로 지정할 수 있다.

2

이렇게 할 수 있는 이유가 무엇일까 ?
/etc/hosts 파일에서 127.0.0.1localhost 로 지정되어 있기 때문이다.

관리 노드 가 혼자 쓰는 로컬 호스트(자기 자신)인 경우, 예외적으로 인벤토리 가 필요하지 않다.
반대로 말하면, 이 경우를 제외하고는 모두 인벤토리 가 필요하다.

3. 인벤토리 - INI 형식


인벤토리 파일은 INI (‘이니’ 라고 읽는다) , YAML 형식으로 정의할 수 있기 때문에 둘 중 하나를 선택하면 되는데, 관습적으로 ! INI 형식을 사용한다.
YAML 형식보다 INI 형식이 더 간단하다.
그런 이유도 있고, 처음에 Ansible 이 나왔을 때는 YAML 형식으로 인벤토리 를 만들 수 없었다.
그런데 플레이북YAML 로 만들 수 있는데 인벤토리 가 안되는건 이상하다 해서 YAML 로 만들수 있게 되었지만, 기존에 사용하던 대로 사용하는게 굳어졌다.

여기서 헷갈리지말자 !!!!!
아직 플레이북 에 대해서는 안배웠지만, 플레이북INI 형식으로 만들 수 없다.
무조건 YAML 형식이다.

1

자 다시 돌아와서, 인벤토리 는 기본적으로 ssh 통신이 가능한 주소를 적어주는게 보통이다.
그런데 위 사진에서 proxyserver 를 보자.

DNS 서버 가 있다면 서버가 리졸빙을 해주기 때문에 이름으로 통신할 수 있겠지만, 우리는 없기 때문에 이런 식으로 이름을 지정한 경우, Ansible 에서 IP 를 표현하는 변수인 ansible_host 변수로 IP(192.168.10.11)를 반드시 지정해야 한다(key=value 형식).

물론 이렇게 말고, /etc/hosts 파일에 지정한다면 가능하긴 하다.

뒤의 ansible_userssh 접속 계정을 말한다.
만약 지정하지 않으면, 현재 사용자가 접속 계정이 된다.

[webservers]
...

[dbservers]
...

[webservers] , [dbservers] 처럼 대괄호([]) 로 묶인 것을 Array 혹은 List 라고 하며, 우리말로 하면 목록 정도가 되겠다.
이를 Ansible 에서는 그룹 이라고 한다.
그래서 이를 호스트 그룹 이라고 한다.
참고로 호스트 = 노드 이다.

이렇게 그룹 으로 묶음으로서 시스템을 그룹화 할 수 있다.
물론 위 사진처럼 사용하려면, foo.example.com 같은 식으로 사용하려면 DNS 가 있어야한다.

나중에 모듈을 실행시켜서 작업을 수행하려고 할 때, 관리 노드 로 각각의 개별 호스트(192.168.10.10 , proxyserver) 를 지정할 수도 있지만, 그룹 을 지정할 수도 있다.
그러면 그 그룹 에 속한 모든 시스템이 작업 의 대상이 된다.

여기서 또 주의, 모든 노드는 all 이라는 그룹에 속하게 된다.
위에서 개별 호스트들처럼 아무 그룹에도 속하지 않은 것 처럼 보이는 호스트들과, 그룹에 속한 호스트들 모두 all 이라는 그룹에 자동으로 속하게 된다는 뜻이다.

또한 개별 호스트들은 all 그룹 뿐만 아니라, ungroupped 라는 그룹에 자동으로 속하게 된다.

이렇게 호스트를 그룹화 함으로서, 수백 대의 호스트들을 간단하게 대상으로서 지정할 수 있게 된다.

여기까지 INI 방식이었다.

4. 인벤토리 - YAML 형식


3

위 형식이 YAML 형식이다.
또한 위 INI 와 완전히 동일한 내용이다.

최상단에 all 이라는 그룹이 위치함을 알 수 있다.
즉, 모든 호스트들은 all 그룹에 속한다.

그리고 hostschildren 이 있는데, 지금은 그냥 그런게 있구나 하고 넘어가자.

간단하게 hosts 밑은 그룹 이 없는 호스트(물론 all, ungroupped 에는 속한다)이고, ansible_host , ansible_userINI 와 마찬가지로 변수라고 한다.
차이라고 하면 INIkey=value 형식이지만, YAMLkey: value 형식이라는 정도이다.

children 밑은 그룹 이다.

5. 인벤토리 관련 명령


  • 그룹을 그래프로 표현
    ansible-inventory [-i path/to/inventory] --graph
    
  • 그룹을 JSON , YAML 로 표현
    ansible-inventory [-i path/to/inventory] --list --yaml
    

상술했듯 인벤토리 를 직접 작성해서 사용하게 되는데, 이 때 반드시 -i 옵션을 사용해서 인벤토리 를 지정해야 한다.

4

명령어 사용법을 익히기 위해 hosts.ini 라는 인벤토리 파일을 생성했다.

이제 아래 명령어를 실행해보자.

ansible-inventory --graph

5

자 뭔가 이상하다.
사실은 하나도 안이상하지만 … hosts.ini 가 있는 경로에서 해당 명령어를 실행해도, 대상은 hosts.ini 가 아닌 기본 인벤토리 파일이 지정된다.
즉, 저 명령어의 결과는 내가 사전에 이미 수정한 기본 인벤토리 파일을 나타낸 것이다.

그래서 hosts.ini 를 명령어의 대상으로 지정하기 위해, 명령어를 아래와 같이 수정한다.

ansible-inventory -i hosts.ini --graph

6

자 이제 성공적으로 hosts.ini 에 대한 명령어 결과가 출력되었다 !
대충 눈치챘겠지만, 이 명령어는 그룹 을 그래프로 표현해준다.

이제 다음 명령어를 대상을 hosts.ini 로 지정하여 실행해보자.

ansible-inventory -i hosts.ini --list

7

--listJSON 형식으로 그룹을 계층적으로 표현해준다.

ansible-inventory -i hosts.ini --list --yaml

8

여기서 추가로 --yaml 을 붙이면, YAML 형식으로 출력한다.

--graph--list 의 차이는, --list변수 를 보여주지만, --graph 는 보여주지 않는다는 점에 있다.

어쨌든 해당 명령어들로 인벤토리그룹 구성을 한 눈에 파악할 수 있다.

6. 실습용 인벤토리 생성


9

홈 디렉토리에 hosts.ini 파일을 생성하고, 내용을 위와 같이 작성하였다.
iac-node1IP 를 node1 호스트로 지정하고, mgmt 라는 그룹에 속하도록 하였다.


© 2022. All rights reserved.