패턴: 호스트와 그룹 타깃팅하기

패턴: 호스트와 그룹 타깃팅하기

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가 치환돼요. 그러나 -00이에요.

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_ENABLEDTrue로 설정돼 있으면 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 커뮤니케이션 가이드 방문