ansible 인벤토리은 목록 또는 목록 그룹 을 사용하여 인프라의 노드의 작업을 자동화 하게 된다.
명령줄에서 호스트 이름을 일일이 전달할 수 있지만 대부분은 Inventory를 사용하여 여러 호스트에서 동시에 자동화 작업을 실핼할 수 있도록 그룹을 사용하여 자동화하는 관리형 노드를 정의하게 된다
가장 간단한 인벤토리는 호스트 및 목록이 포함된 단일 파일이다. 이 파일의 기본 위치는 /etc/ansible/hosts
이다.
또한 -i <path> 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
머저 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 형태로 가져올 수 있다.