패턴: 호스트와 그룹 타깃팅하기
패턴: 호스트와 그룹 타깃팅하기
ad-hoc 명령으로든 플레이북 실행으로든 Ansible을 실행할 때는 어떤 관리 대상 노드나 그룹에 실행할지 선택해야 해요. 패턴(pattern)은 인벤토리에서 특정 호스트나 그룹을 대상으로 명령과 플레이북을 실행하게 해 줘요.
Ansible 패턴은 단일 호스트, IP 주소, 인벤토리 그룹, 그룹 집합, 또는 인벤토리의 모든 호스트를 가리킬 수 있어요. 패턴은 매우 유연해서 — 호스트 부분집합을 제외하거나 요구하고, 와일드카드나 정규식을 쓰고, 더 많은 일을 할 수 있어요. Ansible은 패턴에 포함된 모든 인벤토리 호스트에서 실행돼요.
출처: 문서
본문
패턴 사용하기
ad-hoc 명령이나 플레이북을 실행할 때 거의 언제나 패턴을 써요. 패턴은 ad-hoc 명령에서 플래그가 없는 유일한 요소예요. 보통 두 번째 요소예요.
ansible <pattern> -m <module_name> -a "<module options>"
예:
ansible webservers -m service -a "name=httpd state=restarted"
플레이북에서 패턴은 각 플레이의 hosts: 줄의 내용이에요.
- name: <play_name>
hosts: <pattern>
예:
- name: restart webservers
hosts: webservers
여러 호스트를 한 번에 대상으로 명령·플레이북을 실행하고 싶을 때가 많으므로, 패턴은 종종 인벤토리 그룹을 가리켜요. 위의 ad-hoc 명령과 플레이북 둘 다 webservers 그룹의 모든 머신에 대해 실행돼요.
일반적인 패턴
이 표는 인벤토리 호스트·그룹을 타깃팅하는 일반적인 패턴을 나열해요.
| Description | Pattern(s) | Targets |
| 모든 호스트 | all (또는 *) | |
| 호스트 하나 | host1 | |
| 여러 호스트 | host1:host2 (또는 host1,host2) | |
| 그룹 하나 | webservers | |
| 여러 그룹 | webservers:dbservers | webservers의 모든 호스트 + dbservers의 모든 호스트 |
| 그룹 제외 | webservers:!atlanta | webservers의 모든 호스트 중 atlanta 제외 |
| 그룹 교집합 | webservers:&staging | webservers에 있으면서 staging에도 있는 호스트 |
참고: 호스트 목록을 구분할 때 쉼표(
,)나 콜론(:)을 쓸 수 있어요. 범위와 IPv6 주소를 다룰 때는 쉼표가 선호돼요.
기본 패턴들을 알게 되면 조합할 수 있어요. 이 예시:
webservers:dbservers:&staging:!phoenix
'webservers'와 'dbservers' 그룹에 있으면서 동시에 'staging' 그룹에도 있는 모든 머신을 타깃으로 하고, 'phoenix' 그룹의 머신은 제외해요.
호스트가 FQDN이나 IP 주소로 인벤토리에 이름 지어져 있다면, FQDN이나 IP 주소에 와일드카드 패턴을 쓸 수 있어요.
192.0.*
*.example.com
*.com
와일드카드 패턴과 그룹을 동시에 섞을 수도 있어요.
one*.com:dbservers
패턴의 한계
패턴은 인벤토리에 의존해요. 호스트나 그룹이 인벤토리에 없으면 패턴으로 그것을 타깃할 수 없어요. 패턴에 인벤토리에 없는 IP 주소나 호스트명이 포함되면 이런 에러가 나요.
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern, ignoring: *.not_in_inventory.com
패턴은 인벤토리 문법과 일치해야 해요. 호스트를 별칭(alias)으로 정의했다면:
atlanta:
hosts:
host1:
http_port: 80
maxRequestsPerChild: 808
ansible_host: 127.0.0.2
패턴에는 그 별칭을 써야 해요. 위 예시에서는 패턴에 host1을 써야 해요. IP 주소를 쓰면 다시 에러가 나요.
[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2
패턴 처리 순서
처리는 조금 특별하며 다음 순서로 일어나요.
:와,&!
이 배치는 각 연산 안의 처리 순서만 반영해요: a:b:&c:!d:!e == &c:a:!d:b:!e == !d:a:!e:&c:b
이 모든 것은 다음을 결과로 가져요.
(a 또는 b)에 속한 호스트 AND c 전체에 속한 호스트 AND (d, e) 전체에 속하지 않은 호스트
a:b:!e:!d:&c는 !e가 !d보다 먼저 처리된다는 점이 조금 다르지만, 큰 차이는 없어요.
(a 또는 b)에 속한 호스트 AND c 전체에 속한 호스트 AND (e, d) 전체에 속하지 않은 호스트
고급 패턴 옵션
위에 설명한 일반적인 패턴이 대부분의 필요를 충족하지만, Ansible은 타깃할 호스트·그룹을 정의하는 몇 가지 다른 방법도 제공해요.
패턴에서 변수 사용하기
ansible-playbook에 -e 인자로 그룹 지정자를 전달할 수 있게 변수를 쓸 수 있어요.
webservers:!{{ excluded }}:&{{ required }}
패턴에서 그룹 위치 사용하기
그룹에서의 위치로 호스트나 호스트 부분집합을 정의할 수 있어요. 예를 들어 다음 그룹이 있다면:
[webservers]
cobweb
webbing
weber
webservers 그룹 안에서 개별 호스트나 범위를 선택하는 데 첨자(subscript)를 쓸 수 있어요.
특정 항목에서 슬라이싱
- 연산:
s[i] - 결과: 인덱싱 원점이 0인 s의 i번째 항목
i가 음수면 인덱스는 시퀀스 s의 끝에 상대적이에요 — len(s) + i가 치환돼요. 그러나 -0은 0이에요.
webservers[0] # == cobweb
webservers[-1] # == weber
시작·끝 지점으로 슬라이싱
- 연산:
s[i:j] - 결과: i부터 j까지의 s 슬라이스
i부터 j까지의 s 슬라이스는 i <= k <= j인 인덱스 k를 가진 항목들의 시퀀스로 정의돼요. i를 생략하면 0을 써요. j를 생략하면 len(s)을 써요. i와 j 둘 다 생략한 슬라이스는 유효하지 않은 호스트 패턴이 돼요. i가 j보다 크면 슬라이스는 비어요. i가 j와 같으면 s[i]가 치환돼요.
webservers[0:2] # == webservers[0],webservers[1],webservers[2]
# == cobweb,webbing,weber
webservers[1:2] # == webservers[1],webservers[2]
# == webbing,weber
webservers[1:] # == webbing,weber
webservers[:3] # == cobweb,webbing,weber
패턴에서 정규식 사용하기
패턴을 ~로 시작하면 정규식으로 지정할 수 있어요.
~(web|db).*\.example\.com
패턴과 ad-hoc 명령
명령줄 옵션으로 ad-hoc 명령에 정의된 패턴의 동작을 바꿀 수 있어요. 또한 --limit 플래그로 특정 실행에서 타깃할 호스트를 제한할 수도 있어요.
- 호스트 하나로 제한:
$ ansible all -m <module> -a "<module options>" --limit "host1"
- 여러 호스트로 제한:
$ ansible all -m <module> -a "<module options>" --limit "host1,host2"
- 부정(negated) 제한. bash 보간을 막으려면 작은따옴표를 반드시 사용해야 해요.
$ ansible all -m <module> -a "<module options>" --limit 'all:!host1'
- 호스트 그룹으로 제한:
$ ansible all -m <module> -a "<module options>" --limit 'group1'
패턴과 ansible-playbook 플래그
명령줄 옵션으로 플레이북에 정의된 패턴의 동작을 바꿀 수 있어요. 예를 들어 hosts: all을 정의한 플레이북을 -i 127.0.0.2,를 지정해 단일 호스트로 실행할 수 있어요(끝의 쉼표에 주의). 이는 타깃 호스트가 인벤토리에 정의돼 있지 않아도 동작하지만, 이 방법은 이 호스트에 연결된 변수에 대해 인벤토리를 읽지 않으므로 플레이북이 필요로 하는 변수는 명령줄에서 수동으로 지정해야 해요. 또한 --limit 플래그로 특정 실행에서 타깃할 호스트를 제한할 수도 있는데, 이 경우 인벤토리를 참조해요.
ansible-playbook site.yml --limit datacenter2
마지막으로 파일 이름 앞에 @를 붙여 --limit으로 파일에서 호스트 목록을 읽을 수 있어요.
ansible-playbook site.yml --limit @retry_hosts.txt
RETRY_FILES_ENABLED가 True로 설정돼 있으면 ansible-playbook 실행 후 모든 플레이의 실패한 호스트 목록을 담은 .retry 파일이 생성돼요. 이 파일은 ansible-playbook이 실행을 마칠 때마다 덮어써져요.
ansible-playbook site.yml --limit @site.retry
패턴 지식을 Ansible 명령·플레이북에 적용하려면 "Introduction to ad hoc commands"와 "Ansible playbooks"를 읽어 보세요.
더 알아보기 (Learn more)
- Introduction to ad hoc commands — 기본 명령 예시
- Working with playbooks — Ansible 구성 관리 언어 배우기
- Communication — 질문·도움이 필요하면 Ansible 커뮤니케이션 가이드 방문