Ansible Inventory

조민철·2024년 6월 23일
1
post-thumbnail

Ansible Inventory 란?

ansible 인벤토리은 목록 또는 목록 그룹 을 사용하여 인프라의 노드의 작업을 자동화 하게 된다.
명령줄에서 호스트 이름을 일일이 전달할 수 있지만 대부분은 Inventory를 사용하여 여러 호스트에서 동시에 자동화 작업을 실핼할 수 있도록 그룹을 사용하여 자동화하는 관리형 노드를 정의하게 된다

Inventory 구성

가장 간단한 인벤토리는 호스트 및 목록이 포함된 단일 파일이다. 이 파일의 기본 위치는 /etc/ansible/hosts 이다.
또한 -i <path> inventory 명령어를 사용해서 다른 인벤토리 파일을 지정할 수 있다.

Inventory 의 기본 사항

보유하고 있는 인벤토리 플러그인에 따라 다양한 형식 중 하나로 인벤토리 파일을 생성할 수 있다. 가장 일반적인 형식은 INI & YAML 형식이다

mail.example.com

[webservers] # 그룹 이름
foo.example.com # 호스트 이름
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

인벤토리 파일의 그룹을 정의하지 않더라도 Ansible 두 개 기본 그룹인 all ungrouped 그룹 all에는 모든 호스트가 포함 되고 ungrouped에는 외에 다른 그룹이 없는 모든 호스트가 포함된다.

그룹의 상위/하위 관계

인벤토리파일의 그룹간에 상위/하위 관계를 만들 수 있는데 상위 그룹은 중첩된 그룹 또는 그룹의 그룹이라고도 한다.

mail.example.com

[webservers] # 그룹 이름
foo.example.com # 호스트 이름
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

[dbservers:children] 
mysql # dbservers 그룹은 mysql 그룹 을 포함시키고 있다

호스트 범위

유사한 패턴을 가진 호스트가 많은 경우 대신 범위로 추가할 수 있습니다. [ ] 대괄호를 사용하여 번호 사이를 지정할 수 있다.

[webservers]
www[01:50].example.com # www.01.example.com , 02, 03 , 04

여러 인벤토리 소스 전달

명령줄에서 여러 인벤토리 매개변구를 제공할 수 있다. 즉, 하나의 인벤토리 파일이 아닌 여러개의 인벤토리 파일을 매개변수로 넣을 수 있다

ansible-playbook get_log.yaml -i example01 -i example02

디렉토리에서의 인벤토리 구성

여러 인벤토리 소스를 단일 디렉토리에도 통합이 가능하다. 하나의 파일이 너무 많이 길어지면 유지 관리가 어려워지는데 이를 해결하기 위해 하나의 파일을 여러 파일로(팀 단위, 부서 단위, 등등) 나눌수가 있다.

inventory/
	openstack.yaml
    dynaminc-inventory.py
    on-prem
    parent-groups

이 인벤토리 디렉토리를 대상으로 지정할려면

ansible-playbook example.yaml -i inventory

로 지정이 가능하다.

인벤토리에 변수 추가

특정 호스트 또는 그룹과 관련된 변수 값을 인벤토리에 저장할 수 있다.

[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909

인벤토리 별칭

호스트 변수를 이용하여 인벤토리의 별칭을 정의할 수 도 있다.

jumper ansible_port=5555 ansible_host=192.0.2.50

Ansible 실습

Vagrant를 이용해서 여러대의 VM 생성

머저 Vagrant 파일을 수정하여 총 3대의 가상머신을 만들기위해 작성을 한다.

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.ssh.insert_key=false

  config.vm.define "vagrant1" do |vagrant1| # vagrant1 이라는 가상머신
   vagrant1.vm.box = "bento/ubuntu-22.04-arm64"
   vagrant1.vm.network "forwarded_port", guest: 80, host: 8080
   vagrant1.vm.network "forwarded_port", guest: 443, host: 8443
 end

  config.vm.define "vagrant2" do |vagrant2| # vagrant2 이라는 가상머신
   vagrant1.vm.box = "bento/ubuntu-22.04-arm64"
   vagrant1.vm.network "forwarded_port", guest: 80, host: 8081
   vagrant1.vm.network "forwarded_port", guest: 443, host: 8444
 end

  config.vm.define "vagrant3" do |vagrant3| # vagrant3 이라는 가상머신
   vagrant1.vm.box = "bento/ubuntu-22.04-arm64"
   vagrant1.vm.network "forwarded_port", guest: 80, host: 8082
   vagrant1.vm.network "forwarded_port", guest: 443, host: 8445
 end
end

forwarded_port는 host(vm을 돌리고 있는 장치) 에서 guest(가상머신)으로 포트포워딩 하여 접속을 할수있게 만들어 주었다. host의 포트들이 다 다른이유는 같으면 포트 충돌이 일어난다.

vagrant up 명령어를 통해 가상머신을 생성한다.

vagrant ssh-config 명령어를 통해 가상머신들이 잘 생성되었는지 확인을 한다.
vagrnat 1~3 까지 잘 만들어진 모습을 확인할 수 있다.

ansible.cgf 파일에 인벤토리 디렉토리를 지정해놓고 invnetory/hosts 파일에 vagrant1~3 까지 호스트 변수를 지정해 가상머신들의 정보를 넣어준다.

ansible vagrnat2 -a "ip addr show" 명령어를 통해 vagrnat2의 네트워크 정보를 출력한다. vagrant2 는 앞서 인벤토리 디렉토리에 hosts파일에 호스트 변수를 지정해두었기 때문에 vagrant2라는 이름으로 사용이 가능하다.

그룹

config 작업을 할때 보통 개별호스트보다 호스트 그룹에 작업을 하는 경우가 많다. 앤서블은 그룹을 지정하지 않는다면 *,all 이라는 그룹을 자동 정의하게 된다. 이말은 즉 인벤토리에 있는 모든 호스트를 지칭한다.

ansible all -a "date" 모든 호스트의 시계 출력이 된다.
vagrant1~3 까지 모든 호스트의 시간 정보가 출력되는 모습을 확인할 수 있다.

또한 인벤토리 파일에서 그룹을 정의할 수 도 있다.

# inventory/hosts

[vagrant] # vagrant라는 그룹으로 묶기
vagrant1 ansible_host=127.0.0.1 ansible_port=2222 ansible_python_interpreter=/usr/bin/python3
vagrant2 ansible_host=127.0.0.1 ansible_port=2200 ansible_python_interpreter=/usr/bin/python3
vagrant3 ansible_host=127.0.0.1 ansible_port=2201 ansible_python_interpreter=/usr/bin/python3
# inventory/hosts

vagrant1 ansible_host=127.0.0.1 ansible_port=2222 ansible_python_interpreter=/usr/bin/python3
vagrant2 ansible_host=127.0.0.1 ansible_port=2200 ansible_python_interpreter=/usr/bin/python3
vagrant3 ansible_host=127.0.0.1 ansible_port=2201 ansible_python_interpreter=/usr/bin/python3

[vagrant] # 위에 정의되어있는 vagrant1~3 호스트를 vagrant 그룹으로 묶기
vagrant1
vagrant2
vagrant3

동적 인벤토리

서버정보들을 일일이 수동으로 호스트파일에 복제하면 시간이 많이 걸리고 반복되는 작업이 많아진다. 이런 불편함을 줄이고자 동적 인벤토리를 지원한다.
python3 ./vagrant.py --host=hostname
미리 만들어진 파이썬 스크립트를 이용하여 vagrnat에서 실행중인 호스트를 동적으로 json 형태로 가져올 수 있다.

profile
엔지니어로 살아남기

0개의 댓글

관련 채용 정보