인벤토리 구축하기
인벤토리 구축하기 (Building an inventory)
인벤토리는 관리 노드를 중앙 파일에 정리해서 Ansible에 시스템 정보와 네트워크 위치를 제공해요. 인벤토리 파일을 사용하면 단일 명령으로 많은 수의 호스트를 관리할 수 있어요. 이 글에서는 호스트 그룹을 만들고, 검증하고, ping까지 보내는 과정을 따라가 볼게요.
출처: 문서
본문
다음 단계를 완료하려면 하나 이상의 호스트 시스템의 IP 주소나 정규화된 도메인 이름(FQDN)이 필요해요. 데모 목적이라면 호스트가 로컬에서 컨테이너나 가상 머신으로 실행 중이어도 돼요. 또한 각 호스트의 authorized_keys 파일에 공개 SSH 키가 추가되어 있는지 확인해야 해요.
인벤토리를 다음과 같이 구축해 볼게요:
- 이전 단계에서 만든
ansible_quickstart디렉터리에inventory.ini라는 파일을 만들어요. inventory.ini파일에 새[myhosts]그룹을 추가하고 각 호스트 시스템의 IP 주소나 FQDN을 지정해요.
[myhosts]
192.0.2.50
192.0.2.51
192.0.2.52
- 인벤토리를 검증해요.
ansible-inventory -i inventory.ini --list
- 인벤토리에서
myhosts그룹에 ping을 보내요.
ansible myhosts -m ping -i inventory.ini
Note 컨트롤 노드와 관리 노드의 사용자 이름이 다르다면
ansible명령에-u옵션을 전달하세요.
그러면 다음과 같은 성공 출력을 볼 수 있어요.
192.0.2.50 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
192.0.2.51 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
192.0.2.52 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
축하해요! 인벤토리를 성공적으로 구축했어요. 이제 플레이북을 만들면서 Ansible 시작을 이어가 볼게요.
INI 형식 또는 YAML 형식의 인벤토리
인벤토리는 INI 파일이나 YAML로 만들 수 있어요. 관리 노드 수가 적을 때는 앞서 본 예시처럼 INI 파일이 간단하고 읽기 쉬워요. 관리 노드 수가 늘어날수록 YAML 형식으로 인벤토리를 만드는 것이 합리적인 선택이 돼요.
예를 들어 다음은 관리 노드에 고유한 이름을 선언하고 ansible_host 필드를 사용하는 inventory.ini의 YAML 등가물이에요.
myhosts:
hosts:
my_host_01:
ansible_host: 192.0.2.50
my_host_02:
ansible_host: 192.0.2.51
my_host_03:
ansible_host: 192.0.2.52
인벤토리 구축을 위한 팁
그룹 이름은 의미 있고 고유하게 만들고, 대소문자도 구분되므로 주의하세요. 그룹 이름에 공백, 하이픈, 앞자리 숫자는 피하세요(19th_floor 대신 floor_19 사용). 인벤토리의 호스트는 What(무엇), Where(어디), When(언제)에 따라 논리적으로 그룹화해요.
- What — 토폴로지에 따라 호스트를 그룹화해요. 예: db, web, leaf, spine
- Where — 지리적 위치에 따라 호스트를 그룹화해요. 예: datacenter, region, floor, building
- When — 단계에 따라 호스트를 그룹화해요. 예: development, test, staging, production
메타그룹 사용하기
다음 문법으로 인벤토리에서 여러 그룹을 정리하는 메타그룹(metagroup)을 만들 수 있어요.
metagroupname:
children:
다음 인벤토리는 데이터 센터의 기본 구조를 보여줘요. 이 예시 인벤토리는 모든 네트워크 장치를 포함하는 network 메타그룹과, network 그룹과 모든 웹서버를 포함하는 datacenter 메타그룹을 담고 있어요.
leafs:
hosts:
leaf01:
ansible_host: 192.0.2.100
leaf02:
ansible_host: 192.0.2.110
spines:
hosts:
spine01:
ansible_host: 192.0.2.120
spine02:
ansible_host: 192.0.2.130
network:
children:
leafs:
spines:
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
webserver02:
ansible_host: 192.0.2.150
datacenter:
children:
network:
webservers:
그룹은 여러 메타그룹에 속할 수 있어요. 예를 들어 network 그룹은 datacenter와 ops 메타그룹 아래 모두 나타날 수 있어요.
leafs:
hosts:
leaf01:
ansible_host: 192.0.2.100
leaf02:
ansible_host: 192.0.2.110
spines:
hosts:
spine01:
ansible_host: 192.0.2.120
spine02:
ansible_host: 192.0.2.130
network:
children:
leafs:
spines:
datacenter:
children:
network:
ops:
children:
network:
부모 그룹의 group_vars에 정의된 변수는 자식 그룹의 호스트에 적용되지만, 자식 그룹의 group_vars에 정의된 값은 부모 값을 덮어써요. 여러 부모가 허용되더라도 예측 가능한 상속을 위해 각 그룹은 하나의 부모 메타그룹 아래에만 정의하는 것이 좋아요.
변수 만들기
변수는 IP 주소, FQDN, 운영체제, SSH 사용자와 같은 관리 노드의 값을 설정해서, Ansible 명령을 실행할 때마다 그 값을 전달하지 않아도 되게 해 줘요. 변수는 특정 호스트에 적용될 수 있어요.
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
http_port: 80
webserver02:
ansible_host: 192.0.2.150
http_port: 443
변수는 그룹의 모든 호스트에 적용될 수도 있어요.
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
http_port: 80
webserver02:
ansible_host: 192.0.2.150
http_port: 443
vars:
ansible_user: my_server_user
더 알아보기 (Learn more)
- How to build your inventory — YAML 또는 INI 형식의 인벤토리에 대해 더 배우기
- Adding variables to inventory — 인벤토리 변수와 그 문법 알아보기
- Ansible Vault — 비밀번호·키 같은 민감 콘텐츠를 인벤토리에서 암호화하는 방법