앤서블 컨트롤러 노드 서버가 명령을 전달할 원격 서버들의 목록을 작성해놓는 곳으로 앤서블을 이용하여 작업을 진행할 서버의 정보와 작업 내용, 작업에 사용할 변수 정보 등을 저장해두는 곳을 인벤토리라고 한다.
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
[ ] 를 이용해 용도별로 그룹을 지정할 수 있으며, 특정 서버는 여러 그룹에 속할 수 있고, 모든 서버는 all 그룹에 속해있다.
all:
hosts:
mail.example.com:
children:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
all 밑에 children이라는 지시어를 이용해 그룹들을 만들어준다.
만약 web 그룹으로 묶으려는 매니지드 노드들이 host1~4까지 있다면 어떻게 선언할 수 있을까??
vi inventory
[web]
host1
host2
host3
host4
물론 이렇게 하는 방법도 있지만 간결하게 작성하는걸 좋아하니까 범위 지정을 이용해 간결하게 작성해 보자!
vi inventory
[web]
host[1..4]
이렇게 작성하면 단 한줄로 똑같은 결과를 낼 수 있다!!!
[web]
host1
host2
[db]
host3
host4
인벤토리에 호스트들의 그룹이 이렇게 묶어져 있다할 때 web 그룹과 db 그룹을 linux 그룹으로 중복해서 묶고 싶다면 어떻게 해야할까??
[web]
host1
host2
[db]
host3
host4
[linux]
host[1..4]
물론 아까 공부한 범위 지정을 이용해 web과 db에 있는 호스트들을 묶을 수도 있지만, 하위 그룹을 이용해 설정 할 수도 있다.
[linux:children]
web
db
이렇게 지정하면 중첩 그룹으로 설정한 결과와 똑같은 결과가 나타난다.
-i
옵션으로 인벤토리 파일을 지정할 수 있다.
ansible-playbook -i inventory.yaml
cfg 파일에 inventory
옵션에 파일 경로를 지정하면 됩니다. 인벤토리 파일은 콤마를 이용하여 여러 개를 지정할 수 도있다
[default]
inventory = inventory.yaml,common.yaml
인벤토리에 호스트 설정을 마치면 ad-hoc의 ansible --list-hosts
명령어로 인벤토리가 잘 작동하는지 확인한다.
ansible --list-hosts -i inventory localhost # inventory에 localhost라는 호스트가 존재하는지 확인
ansible --list-hosts -i inventory web # web그룹의 호스트들을 출력
ansible --list-hosts -i inventory all # 인벤토리에 있는 모든 호스트들 출력
ansible --list-hosts -i inventory ungrouped # 그룹이 없는 호스트 출력
ansible --list-hosts -i inventory 'web db' # web 그룹과 db 그룹의 호스트 출력
ansible --list-hosts -i inventory 'web:&db' # web 그룹과 db 그룹 모두에 포함된 호스트 출력(and)
ansible --list-hosts -i inventory 'linux:!db' # linux 그룹에 속하고 db 그룹에 속하지 않는 호스트 출력(not)