인벤토리
- Ansible에서 관리할 호스트의 모음을 정의한 것이다.
- 호스트명만 정의하는 것을 넘어서, 그룹도 정의할 수 있고 여러가지 정보를 추가로 넣을 수도 있다. (호스트나 그룹에 적용되는 변수 설정 등)
- 인벤토리는 2가지 종류로 나뉜다.
- 정적 인벤토리 : 단순하게 사용자가 직접 텍스트 파일로 정의한다.
- 동적 인벤토리 :필요에 따라 외부 정보 provider를 사용해 스크립트나 기타 프로그램으로 인벤토리를 생성한다.
- 이러한 인벤토리 파일에 기록되는 호스트명은 각 서버의 /etc/hosts에 있는 내용에 의존된다.
정적 인벤토리란?
- 이 파일은 기본적으로 ini 형식을 사용하며, yaml 형식도 사용할 수 있다.
- 기본 경로는 /etc/ansible/hosts 이지만 일반적으로 이 기본경로는 사용하지 않으며 직접 따로 만들어서 사용한다.
- 한줄에 하나씩 호스트 또는 ip주소를 나열하면 된다. 그룹은 대괄호를 사용해서 그룹명을 명시하고, 그 아래에 구성원을 명시한다.
- 아래 예시 참고
test1
test2
192.168.1.201
localhost
[webservers]
web1.example.com
web2.example.com
localhost
192.168.1.201
[dbservers]
db1.example.com
db2.example.com
[east_datacenter]
web1.example.com
db1.example.com
[west_datacenter]
web2.example.com
db2.example.com
[production]
web1.example.com
web2.example.com
db1.example.com
db2.example.com
[development]
localhost
192.168.1.201
[all_datacenters:children]
east_datacenter
west_datacenter
호스트 그룹
- 위 예시와 같이 대괄호로 그룹을 지정할 수 있다.
- 여러개의 그룹에 동일한 호스트가 각각 들어갈 수 있다.
- 실제로 호스트를 여러 그룹으로 구성하면, 호스트의 역할, 물리적 위치, 운영/테스트 장비 여부 등의 따라 다양한 방법으로 구성할 수 있다.
- 그룹 이름에서는 특수문자는 _(언더바) 만 허용한다. 다른 특수문자를 쓰면 WARNING이 뜰 수 있다.
- 따로 명시하지 않아도 기본적으로 항상 존재하는 호스트 그룹이 2가지 있다.
- all : 인벤토리에 명시된 모든 호스트를 포함한다.
- ungrouped : 인벤토리에 명시되었으나 그룹에 속하지는 않은 모든 호스트를 포함한다.
localhost
- ansible을 실행하는 제어노드 본인을 의미한다.
- 이 말은, 제어노드도 ansible의 클라이언트로서 ansible의 컨트롤을 받게 할 수 있다는 것이다.
- localhost는 all 호스트그룹에는 포함되지 않는다.
중첩 그룹
그룹 안에 그룹을 포함할 수 있다. :children 접미사를 사용한다. 위 예시에 명시된 all-datacenters를 선택하면, 실제로는 총 4개의 호스트가 선택되는 것이다. (web1.example.com, db1.example.com, web2.example.com, db2.example.com)
범위를 사용하여 호스트 간소화하기
- [start:end] 형식을 사용하여, 많은 수의 호스트를 간단하게 명시할 수 있다. 아래 예제를 보자.
192.168.[4:6].[0.255]
: 192.168.4.1~255, 192.168.5.1~255, 192.168.6.1~255 모두의 아이피를 포함한다.
server[01:20].example.com
: server01.example.com ~ server20.example.com 까지 총 20개를 모두 포함한다.
[a:c].dns.example.com
: a, b, c 총 3개의 a.dns.example.com, b.dns.example.com ... 을 명시한다.
2001:db8::[a:f]
: a~f까지를 각각 명시하여 2001:db9::a, 2001:db9::b, 2001:db9::c ... 총 6개가 나온다.
- 숫자 범위 앞에 0이 포함된 경우 0이 패턴에 그대로 사용된다. 두번째 예제는 01, 02, 03 등은 패턴이지만 그냥 1,2,3은 안되는 것이다.
정적 인벤토리 파일 사용
- 정적 인벤토리를 사용할 때는 3가지 방법으로 사용된다.
1. 아무데서나 ansible 명령을 입력하는경우 : 기본 경로인 /etc/ansible/hosts가 사용된다.
2. ansible.cfg 파일에 inventory 이름을 명시하고, ansible.cfg 파일이 있는 경로에서 ansible 명령을 입력하는경우 : 명시한 inventory가 사용된다.
3. ansible 명령에 특정 인벤토리를 명시하는 경우 : 명령에 명시한 특정 인벤토리 파일이 사용된다.
명령 실행 시 --inventory 경로/파일명 또는 -i 경로/파일명 으로 지정할 수 있다.
2번, 3번의 경우 inventory 파일은 사용자가 원하는 위치에 자유롭게 둘 수 있고 파일명도 마음대로 할 수 있다. 또한 기본 경로인 /etc/ansible/hosts에는 인벤토리를 사용하는 구문이나 방식이 상세히 명시되어 있으므로 참고할 수 있다.
인벤토리에 변수 정의하기
- ansible 에서 사용하는 변수 값을 호스트 인벤토리에 정의할 수 있다. 이러한 변수는 특정 호스트, 또는 호스트 그룹에만 적용된다.
- 일반적으로 이러한 인벤토리 변수를 인벤토리 파일에 직접 정의하는 것 보다는 특수 디렉토리에 정의하는게 좋다. 변수 쪽 챕터에서 해당 내용을 상세하게 다룬다.
- 가능하면 권장하지 않는다고 한다.
명령어 : 인벤토리 확인하기
- 인벤토리에 명시된 서버가 통신이 되지 않아도 문제없다. 즉 상태에 상관없이 인벤토리 파일에 있기만 하면 결과는 잘 나온다.
* 형식
ansible.cfg에 인벤토리 파일을 명시하고 ansible.cfg 파일이 있는 위치에서 실행하는 경우
ansible 호스트명(그룹명) --list-hosts
특정 인벤토리를 지정하는 경우
ansible 호스트명(그룹명) -i 인벤토리파일경로 --list-hosts
* 예시
ansible web1.example.com -i /ansible_test/inventory --list-hosts
ansible webservers -i /ansible_test/inventory --list-hosts
ansible all -i /ansible_test/inventory --list-hosts
ansible localhost -i /ansible_test/inventory --list-hosts
ansible all --list-hosts
# 참고
- -i옵션 뒤에 파일이 아닌 디렉토리를 명시해도 그 디렉토리에서 파일을 찾아서 읽는다. 디렉토리 안에 인벤토리 파일이 여러개면 다 가져온다.
- 가져올 때 파일 이름은 상관 없다.
인벤토리의 호스트 패턴
- 호스트 패턴은 playbook 또는 adhoc 명령의 대상이 될 호스트를 지정하는데 사용한다.
- 호스트의 개수가 많은 경우 일일이 다 명시할 수 없으므로, 이러한 패턴을 사용하게 된다.
- 일반적으로 플레이의 작업에 복잡한 조건문을 설정하는 대신, 호스트 패턴을 주의깊게 사용하고 적절한 인벤토리 그룹을 설정하여 플레이로 호스트를 제어하는게 더 쉽고 간편하다.
* 이 섹션의 예시에서 참조하는 인벤토리 내용
web.example.com
data.example.com
[lab]
labhost1.example.com
labhost2.example.com
[test]
test1.example.com
test2.example.com
[datacenter1]
labhost1.example.com
test1.example.com
[datacenter2]
labhost2.example.com
test2.example.com
[datacenter:children]
datacenter1
datacenter2
[new]
192.168.1.245
192.168.1.231
data.example.com
labhost2.example.com
test2.example.com
labhost1.example.com
test1.example.com
labhost2.example.com
test2.example.com
labhost1.example.com
test1.example.com
* 호스트 패턴 사용하는 위치
- ansible-playbook 에서는, hosts 지시문에 호스트 패턴을 명시한다.
- adhoc 명령어 에서는, ansible 명령 바로 뒤에 인수로 호스트 패턴을 명시한다.
* 호스트 패턴으로 사용되는 요소
클라이언트 호스트명 (관리 호스트)
- 가장 기본적인 호스트 패턴으로, 인벤토리에 나열된 각 클라이언트의 호스트 이름들이다.
- 이 클라이언트 호스트명은 인벤토리 안에서 unique해야 한다.
- 클라이언트 호스트명 대신 IP를 명시적으로 나열할 수도 있다. 다른 사용 방법은 모두 동일하다. 그러나 IP는 용도를 기억하기 어려우므로 일반적으로 호스트명을 사용하는 것이 권고된다.
그룹
- 그룹의 그룹도 있으며, 인벤토리에 따로 명시적으로 적혀있지 않은 all, ungrouped라는 특수그룹도 존재한다.
- 이러한 그룹들은 모두 호스트 패턴으로 사용할 수 있다.
와일드카드
- 리눅스에서 사용하는 와일드카드 별표와 동일하게 사용한다.
- 호스트 패턴이 작은따옴표로 묶인 별표의 경우, 인벤토리의 모든 호스트가 일치한다. ( - hosts : '*' 이런식으로 사용)
- 패턴 예시는 다음과 같다.
'*.example.com' 은 .example.com 으로 끝나는 모든 호스트들과 일치한다.
web.example.com
data.example.com
labhost1.example.com
labhost2.example.com
test1.example.com
test2.example.com
'192.168.1.*' 은 192.168.1. 이후 모든 호스트들을 의미한다.
192.168.1.245
192.168.1.231
'datacenter*' 은 datacenter로 시작하는 모든 호스트을 의미한다. (여기서 datacenter*는 그룹)
labhost1.example.com
test1.example.com
labhost2.example.com
test2.example.com
- 기타 추가 예시들
ansible '*.example.com, !*.lab.example.com' -i inventory1 --list-hosts
ansible 'prod,172*,*lab*' -i inventory1 --list-hosts
앰퍼샌드
- 논리 AND와 비슷하게 작동한다.
- 아래 예시는, lab 그룹의 호스트들을 가져오는데 그 중에서 datacenter1 그룹과의 교집합만 가져오게 한다.
hosts: lab,&datacenter1
or
ansible 'lab,&datacenter1' -i inventory1 --list-hosts
- 따라서 결과는 labhost1.example.com 이것 하나만 나온다.
느낌표 (부정을 의미하는 !)
- 아래 예시는 datacenter 그룹을 가져오는데, 그 중 test2.example.com을 빼고 가져오는 것임.
hosts: datacenter, !test2.example.com
(!test2.example.com,datacenter 로 해도 동일)
- 따라서 결과는 아래 3개가 나온다.
labhost1.example.com
test1.example.com
labhost2.example.com
- 추가 예시
- hosts: all,!datacenter1 이러면, datacenter1 그룹만 제외하고 모두이다.
- hosts: '!webservers' 이러면, webservers를 뺀다. 이게 그룹이면 해당 그룹에 있는 모든 호스트들이 다 빠진다.
# 참고
- *별표라던지 !느낌표 등의 문자를 사용할 때, 이런 문자들은 shell에서 사용되는 의미도 있으므로 adhoc 명령에서 문제가 발생할 수 있다.
- 마찬가지로, ansible-playbook에서도 특수 와일드카드 등을 사용할 때 호스트 패턴을 올바르게 구문분석하도록 작은 따옴표로 묶도록 한다. (hosts: '!test1.example.com, development' / 이런식으로 )
# 참고
- 와일드카드 호스트 패턴은 호스트뿐만 아니라 그룹, 그룹의 그룹 등 모든 패턴에 일치하게 된다.
- dns이름에 해당하는 이름, ip주소 또는 그룹을 구분하지 않는다.
- 따라서 아래 예시처럼 결과가 다르게 나오므로 조심해야 한다.
data*
data.example.com
labhost2.example.com
test2.example.com
labhost1.example.com
test1.example.com
datacenter*
labhost2.example.com
test2.example.com
labhost1.example.com
test1.example.com
* playbook에서 사용 예시
호스트지정
- hosts : labhost1.example.com, test2.example.com, 192.168.1.2
그룹지정
- host : lab, datacenter1
# 참고
- 그룹지정에서는아래처럼 test1.example.com이중복인데, 두번이 아닌 한번만 참조하게 된다.
[lab]
labhost1.example.com
labhost2.example.com
[datacenter1]
labhost1.example.com
test1.example.com
와일드카드 혼합
- hosts: lab, data*, 192.168.1.245
아래처럼 총 6개가 지정될 것이다.
data.example.com
labhost1.example.com
test1.example.com
labhost2.example.com
test2.example.com
192.168.1.245
# 참고
- 호스트명을 나열할 때 일반적으로 콤마로 하지만, 콜론: 도 가능하다. 사실 안쓰는게 나은데, 옛날에 사용하던 방법이므로 알아두면 참고가 된다.
동적 인벤토리
- 정적 인벤토리처럼 직접 입력하는 방식이 아닌, 외부 제공하는 정보를 사용하여 동적으로도 생성할 수 있다.
- 예를들어 /etc/hosts에 100대를 등록해야 한다면, 또한 등록한 100대 중 몇대를 수정해야 한다면.. 이런식으로 인벤토리 등록 작업 자체가 복잡하고 양이 많거나, 아니면 지속적으로 인벤토리가 변경되는 경우, 동적 인벤토리가 매우 편리하다.
- 오픈소스 커뮤니티에서는 업스트림 앤서블 프로젝트에서 사용할 수 있는 수많은 동적 인벤토리 스크립트를 만들었다. 또한 직접 작성할수도 있다.
- 동적 인벤토리는 정적 인벤토리와 비교하여 매우 복잡하므로 다른 섹션에서 다룬다.
* 동적 인벤토리 예시
- 핑으로 장비를 찾아서 응답이 오면 인벤토리에 등록을 하거나, 아니면 ssh 접속을 해서 되는지 여부를 확인한다는지 등 여러가지 방식을 사용해 인벤토리를 스캔하고 등록까지 할 수 있다.
- 동적 인벤토리 프로그램에서 amazon ec2 계정에 접속하여 ec2에 있는 가상머신들의 정보를 사용하여 ansible 인벤토리를 자동으로 생성할 수 있다. ansible 실행 시 동적 인벤토리 프로그램에서 이 작업을 수행하므로, 호스트 추가/제거 변경을 항상 최신정보로 적용할 수 있다.
이러한 구문을 파이썬 등의 언어로 만들 수 있다.
참조 링크
인벤토리 설명서
http://docs.ansible.com/ansible/2.7/user_guide/intro_inventory.html
패턴 사용 ansible 설명서
https://docs.ansible.com/ansible/2.7/user_guide/intro_patterns.html
'Ansible' 카테고리의 다른 글
6장. ansible에서 모듈 사용하기 (0) | 2021.02.19 |
---|---|
5장. ad-hoc 명령 (0) | 2021.02.19 |
4장. ansible.cfg 파일 톺아보기 (0) | 2021.02.06 |
2장. Ansible 설치하기 (0) | 2021.02.06 |
1장. Ansible 소개 (0) | 2021.02.06 |