암묵적 'localhost'

암묵적 'localhost'

인벤토리에 localhost가 정의돼 있지 않은데도 localhost를 참조하려 하면, Ansible이 대신 암묵적(implicit) localhost를 만들어 줘요. 예를 들어 모든 호스트에 대한 로그 파일이 로컬 머신에 있는지 확인하는 작업을 delegate_to: localhost로 위임하는 경우가 그런 상황이에요.

- hosts: all
  tasks:
    - name: check that i have log file for all hosts on my local machine
      stat:
        path=/var/log/hosts/{{inventory_hostname}}.log
        delegate_to: localhost

이런 경우(또는 local_action)에 Ansible이 'localhost'에 접근해야 하는데 인벤토리에 없는 호스트라면, 우리 대신 하나를 만들어 주는 거예요. 이 호스트는 인벤토리에 있는 것과 동등한 다음 연결 변수로 정의돼요.

# ...
[localhost]
localhost ansible_connection=local ansible_python_interpreter="{{ansible_playbook_python}}"

이렇게 하면 작업을 로컬에서 실행할 때 올바른 연결 방식과 Python 인터프리터를 사용하게 됩니다.

출처: 문서

본문

암묵적 localhost 재정의

인벤토리에 localhost 호스트 항목을 만들어 넣으면 내장된 암묵적 버전을 재정의할 수 있어요. 그 시점부터 모든 암묵적 동작은 무시되고, 인벤토리의 localhost는 그냥 다른 호스트처럼 취급됩니다. 그룹·호스트 변수와 함께 ansible_python_interpreter 설정이 포함된 연결 변수도 적용되고, 이는 delegate_to: localhost와 그 별칭인 local_action에도 영향을 줘요.

알아둘 점

  • 이 암묵적 호스트는 어떤 그룹으로도 타깃할 수 없지만, host_varsall 그룹의 변수는 사용해요.
  • 암묵적 localhost는 요청할 때만(예: "{{ hostvars['localhost'] }}") 호스트변수(hostvars) 매직 변수에 나타나요.
  • 암묵적 localhost에는 inventory_file·inventory_dir 매직 변수를 쓸 수 없어요 — 이들은 각 인벤토리 호스트에 의존하기 때문이에요.
  • 127.0.0.1이나 ::1(각각 localhost의 IPv4·IPv6 표현)을 써도 이 암묵적 호스트가 트리거돼요.
  • 만드는 방법은 여러 가지지만, 암묵적 localhost는 항상 하나뿐이고 처음 만드는 데 쓴 이름을 사용해요.
  • connection: local을 설정하는 건 암묵적 localhost를 트리거하지 않아요 — 그냥 inventory_hostname의 연결 방식을 바꾸는 것뿐이에요.

더 알아보기 (Learn more)

delegate_tolocal_action의 동작을 더 자세히 다루는 플레이북 위임 문서를 함께 보면 좋아요. 인벤토리에 호스트를 정의하는 규칙에 대해서는 인벤토리 기본 문서를 참고하세요.