본문 바로가기

Engineering/Ansible

[Ansible] 7. Ansible Facts 활용

 

Ansible Facts

팩트는 Ansible이 관리 호스트의 자원 정보를 수집한 변수를 뜻한다. 팩트 변수에는 아래와 같은 정보들이 포함된다.

  • 호스트 이름
  • 커널 버전
  • 네트워크 인터페이스
  • OS 버전
  • CPU 정보
  • 메모리 정보
  • HDD 정보

이 처럼 활용성 높은 많은 정보를 수집하여 운용자는 제어 노드를 관리할 수 있다. 간단한 플레이북을 통해 팩트 변수를 살펴본다.

[root@Ansible-Controller playbook]# cat print_facts.yml 
---
- name: ansible facts
  hosts: node1
  gather_facts: True

  tasks: 
  - name: Print Facts
    ansible.builtin.debug:
       var: ansible_facts

 

 

 

 

 

하지만 팩트 변수는 광범위한 정보를 수집하기 때문에 앤서블 엔진에 불필요한 서비스 부하가 발생할 수도 있고, 이러한 팩트 변수가 필요가 없는 작업이 있을 수도 있다. 이때는 플레이북에서 팩트 수집을 off 해주거나, ansible.cfg 설정에서 팩트를 수집하지 않도록 설정해줄 수 있다.

1. ansible.cfg에 아래 구문을 추가
gathering=explicit

2. playbook 작성 시 아래구문 추가
gather_facts: False

변수로써 팩트 사용

수집한 팩트를 변수로써 선언하여 사용할 수 있다.

Fact ansible_facts.* 표기법 ansible_* 표기법
호스트 명 ansible_facts.hostname ansible_hostname
도메인 기반 호스트 명 ansible_facts.fqdn ansible_fqdn
IPv4 addr ansible_facts.default_ipv4.address ansible_default_ipv4.address
네트워크 인터페이스 목록 ansible_facts.interfaces ansible_interfaces
dns 서버 목록 ansible_facts.dns.nameservers ansible_dns.nameservers
커널 버전 ansible_facts.kernel ansible_kernel
OS ansible_facts.distribution ansible_distribution

 

앤서블 2.5 버전 이전에는 ansible_* 형태로 팩트 변수를 사용하였다. 이러한 형태는 일반변수와 팩트변수 사이에서 종종 collesion을 야기하기 때문에 이후 버전에서 부터는 ansible_facts.* 형태로 팩트 변수를 사용하기를 권장하고 있다. 

현재 앤서블 버전에는 양쪽 표기법 모두 인지를 하여 활용이 가능하다. 만약 ansible_* 표기법을 허용하고 싶지 않다면, ansible.cfg에 아래 구문을 추가해준다.

inject_facts_as_vars=False

 


사용자 정의 팩트 만들기

사용자에 의해 정의된 팩트를 이용하여 환경 설정 파일의 일부 항목을 구성하거나 조건부 작업을 진행할 수 있다.

사용자 지정 팩트는 관리 호스트 로컬에 있는 '/etc/ansible/facts.d' 디렉토리 내에 '*.fact' 확장자로 지정되어야만 이용이 가능하다.

	# /etc/ansible/facts.d 아래 경로에 .fact 파일 생성

[root@Ansible-Controller playbook]# cat /etc/ansible/facts.d/Ansible-Controller-Sysinfo.fact 
[system_info]
os = Rocky Linux 8.8
kernel = 4.18.0-477.10.1.el8_8.x86_64

[users]
user1 = root
user2 = ansible

 

작성한 관리노드의 local fact 를 출력하는 플레이북을 만들고 실행해보자.

[root@Ansible-Controller playbook]# cat print_local_fact.yml
---
- name: ansible facts
  hosts: node1
  gather_facts: True


  tasks: 
  - name: Print Facts
    ansible.builtin.debug:
       var: ansible_facts