새소식

⇥ DevOps Tech 🙋🏻‍♀️/✏️ Ansible

Ansible 자동 예약 변수 팩트

  • -
반응형

앤서블 플레이북을 수행하면 앤서블은 관리 호스트에서 자동으로 필요한 변수들을 검색한다. 
말 그대로 자동 예약 변수이며, 수집된 변수 값을 이용하여 서비스 상태 확인, 작업 진행여부 등을 판단할 수 있는 근거가 된다.
다양한 환경 및 상황에 대해서 사용할 수 있는 변수를 저장하고 있어서 조건문, 반복문 등에 사용이 가능한 팩트에 대해서 정리해보려고 한다.

 

팩트란

앤서블은 팩트 기능이 활성화되어 있어 플레이북을 실행할 때 자동으로 팩트가 수집된다. 팩트에는 다음 내용들이 포함될 수 있다.

  • 호스트 이름
  • 커널 정보
  • 네트워크 인터페이스 이름
  • 운영체제 버전
  • CPU 개수
  • 사용 가능한 메모리
  • 스토리지 장치의 크기 및 여유 공간

이렇게 수집된 변수 값을 이용하여 서비스 상태 확인, 다음 작업 진행 여부 체크 등의 동작이 가능하다. 별도의 지정 없이 자동으로 관리 호스트의 정보를 수집해준다는 것은 관리 장비를 효율적으로 사용하게 해줄 수 있는 장점을 가지고 있다.
해당 변수는 ansible_facts 라는 변수를 통해 사용이 가능하다.

 

변수로 사용하는 팩트

팩트 변수 이름
호스트명 ansible_facts.hostname
도메인 기반 호스트명 ansible_facts.fqdn
IPv4 주소 ansible_facts.default_ipv4.address
네트워크 인터페이스 이름 목록 ansible_facts.interfaces
/dev/vda1 디스크 파티션 크기 ansible_facts.device.vda.partitions.vda1.size
DNS 서버 목록 ansible_facts.dns.nameservers
현재 실행중인 커널 버전 ansible_facts.kernel
운영체제 종류 ansible_facts.distribution

자주 사용하게 되는 팩트의 종류를 정리한 표 이다. 기본적으로 hostname, ipv4 역시 자주 사용하며 파티션 크기나 커널 버전, 운영체제의 종류 역시 관리 호스트가 많아지고 이에 따른 분기가 필요할 경우가 생기기 때문에 자동으로 수집해주는 facts 는 다양한 상황에서 조건문, 반복문 등에 응용하여 사용할 수 있다. 
이러한 변수들을 기본적으로 수집 및 제공해주는 것이 엔서블의 큰 장점이 아닌가 생각한다.

* 참고로 앤서블 2.5 버전 이상부터 ansible_facts.* 라는 예약어를 사용하였고 그 이전에는 ansible_* 이라는 예약어를 사용하면서 변화한 점이 있다. 하지만 앤서블이 두 변수 모두 인식하여 사용이 가능하지만 혹여나 사용자가 변수의 이름을 ansible_* 로 사용하여 충돌이 발생할 수 도 있다.
팩트는 우선순위가 높아 사용자가 지정한 변수가 무시되고 팩트의 값을 가지게 되기 때문에 해당 부분은 주의가 필요하다.
기존 ansible_* 표기법을 무시하고 싶다면 ansible.cfg 파일에서 inject_facts_as_vars 매개 변수의 설정을 false 로 설정해주면 된다.

 

팩트 사용 끄기

팩트 수집은 편리하고 다양한 정보를 제공하긴 하지만 수집하는 만큼의 시간이 더 소요된다. 즉 다양한 관리 호스트를 관리하면서 자동화를 개발할 때 모든 관리 호스트에서 gather_facts 단계를 거치게 되고 그만큼 많은 시간이 소요된다는 것을 의미한다. 그리고 부하가 발생할 수 있다. 이로 인해 해당 변수들을 사용하지 않는다면 직접적으로 팩트 수집 기능을 비활성화 하도록 명시할 수 있다.
playbook 에서 hosts 아래에 gather_facts: no 를 명시해주면 된다.

---
- hosts: all
  gather_facts: no
  tasks:
  - name: create_user {{ user }}
  ansible.builtin.user:
  	name: "{{ user }}"
    state: present

gather_facts: no 를 작성해주면 팩트를 수집하는 단계가 스킵되고, ansible_facts 변수를 사용하면 수집하지 않은 값이라고 오류가 발생하게 된다.

그 외에 명시적으로 팩트 수집을 설정하기 위해선 ansible.builtin.setup 모듈을 실행해주면 된다.

---
- hosts: all
  gather_facts: no
  
  tasks:
  - name: gather facts
  ansible.builtin.setup:
  
  - name: create_user {{ user }}
  ansible.builtin.user:
  	name: "{{ user }}"
    state: present

gather_facts: no 를 선언했지만 ansible.builtin.setup 모듈을 실행하면서 명시적으로 gather_facts 단계를 수행하도록 설정하였다.

이처럼 관리 호스트의 정보를 미리 수집해서 가지고 있기 때문에, 플레이북만 알맞게 작성해준다면 상황에 맞는 자동화를 손쉽게 구현할 수 있도록 팩트 기능을 제공한다. 팩트 변수의 우선순위는 추가 변수 > 플레이 변수 > 팩트 > 호스트 변수 > 그룹 변수 순으로 높은 우선순위를 가지고 있기 때문에 고려하여 변수를 선언 및 사용해야 의도한 대로 동작하는 것을 주의해야 하겠다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.