변수와 팩트 사용하기 - 자동 예약 변수 팩트
출처 : 앤서블로 시작하는 인프라 자동화
자동 예약 변수 - 팩트
- 팩트(Facts)는 앤서블이 관리 호스트에서 자동으로 검색한 변수이다.
- 팩트에는 플레이, 조건문, 반복문, 관리 호스트에서 수집한 값에 의존하는 기타 명령문의 일번 변수처럼 사용 가능한 호스트별 정보가 포함되어 있다.
- 관리 호스트에서 수집된 일부 팩트에는 다음 내용들이 포함될 수 있다.
- 호스트 이름
- 커널 버전
- 네트워크 인터페이스 이름
- 운영체제 버전
- CPU 개수
- 사용 가능한 메모리
- 스토리지 장치의 크기 및 여유 공간
- 팩트에 의해 수집된 변수 값을 이용하여 서비스 상태를 확인하고 나면 다음 작업 진행 여부를 판단할 수 있다.
팩트 사용하기
- 앤서블은 팩트 기능이 활성화되어 있어 플레이북을 실행할 때 자동으로 팩트가 수집된다.
- 팩트는 ansible_facts 라는 변수를 통해 사용할 수 있다.
vi facts.yml
---
- hosts: db
tasks:
- name: Print all facts
ansible.builtin.debug:
var: ansible_facts
vi 에디터를 사용해 facts.yml 을 생성하고 위 내용을 입력한다.
ansible.builtin.debug 모듈을 사용해 ansible_facts 라는 변수의 모든 내용을 출력한다.
ansible-playbook --syntax-check facts.yml
ansible-playbook 명령어의 --syntax-check 옵션을 사용해 문법적 오류가 있는지 확인한다.
ansible-playbook facts.yml
ansible-playbook 명령어를 이용해 facts.yml 플레이북을 실행한다.
실행하면 db 그룹의 호스트인 tnode-ubuntu에서 수집한 시스템 정보를 모두 출력한다.
cp facts.yml facts1.yml
vi facts1.yml
팩트를 통해 수집된 변수는 특정 값만 추출하여 사용할 수 있다. facts.yml 파일을 facts1.yml 파일로 복사한 다음 vi 에디터로 수정한다.
---
- hosts: db
tasks:
- name: Print all facts
ansible.builtin.debug:
msg: >
The default IPv4 address of {{ ansible_facts.fqdn }}
is {{ ansible_facts.default_ipv4.address }}
debug 모듈을 이용하여 메시지를 출력하는 예제로, 메시지 출력 시 ansible_facts의 값을 함께 출력한다.
ansible-playbook --syntax-check facts1.yml
ansible-playbook facts1.yml
문법 오류가 있는지 확인한 다음 facts1.yml 플레이북을 실행한다. 실행하면 위 그림과 같은 메시지가 출력된다.
변수로 사용할 수 있는 앤서블 팩트
팩트 | 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.distribution |
현재 실행중인 커널 버전 | ansible_facts.kernel |
팩트 수집 끄기
- 팩트 수집을 위해 해당 호스트에 특정 패키지를 설치해야만 하는 경우가 있다.
- 특정 이유로 패키지를 설치할 수 없는 경우에는 앤서블도 팩트 수집을 할 수 없게 된다.
- 사용자가 팩트 수집으로 인해 호스트에 부하가 걸리는 것을 원치 않을 수 있다.
- 이런 경우를 위해 팩트 수집 기능을 비활성화할 수 있다.
vi facts3.yml
---
- hosts: db
gather_facts: no
tasks:
- name: Print all facts
ansible.builtin.debug:
msg: >
The default IPv4 address of {{ ansible_facts.fqdn }}
is {{ ansible_facts.default_ipv4.address }}
vi 에디터로 facts3.yml 파일을 만들고 위 내용대로 작성한다.
아니면 facts1.yml 파일을 복사하고 hosts 아래에 gather_facts: no 를 작성한다.
ansible-playbook --syntax-check facts3.yml
ansible-playbook facts3.yml
에러 체크를 하고 facts3.yml 플레이북을 실행한다. 그러면 위 그림과 같이 에러가 발생한다.
팩트를 수집하지 않았는데 팩트에서 수집한 변수를 사용하려고 하기 때문이다.
cp facts3.yml facts4.yml
vi facts4.yml
---
- hosts: db
gather_facts: no
tasks:
- name: Manually gather facts
ansible.builtin.setup:
- name: Print all facts
ansible.builtin.debug:
msg: >
The default IPv4 address of {{ ansible_facts.fqdn }}
is {{ ansible_facts.default_ipv4.address }}
facts3.yml 파일을 복사해 facts4.yml 파일을 만들고 vi 에디터로 위 코드처럼 ansible.builtin.setup을 추가한다.
ansible-playbook --syntax-check facts4.yml
ansible-playbook facts4.yml
에러 체크를 진행하고 facts4.yml 플레이북을 실행한다. 그러면 정상적으로 출력되는 것을 확인할 수 있다.
사용자 지정 팩트 만들기
- 앤서블은 사용자에 의해 정의된 팩트를 이용하여 환경 설정 파일의 일부 항목을 구성하거나 조건부 작업을 진행할 수 있다.
- 사용자 지정 팩트는 관리 호스트의 로컬에 있는 /etc/ansible/facts.d 디렉토리 내에 *.fact 로 저장되어야만 앤서블이 플레이북을 실행할 때 자동으로 팩트를 수집할 수 있다.
mkdir /etc/ansible/facts.d
vi /etc/ansible/facts.d/my-custom.fact
[packages]
web_package = httpd
db_package = mariadb-server
[users]
user1 = ansible
user2 = zangwoojeon
/etc/ansible/facts.d 디렉토리를 생성하고, 디렉토리 내에 my-custom.fact 라는 파일을 vi 에디터로 열어 위 내용을 작성한다.
vi facts5.yml
---
- hosts: localhost
tasks:
- name: Print local facts
ansible.builtin.debug:
var: ansible_local
vi 에디터로 facts5.yml 파일을 생성하고 위 코드를 입력한다.
ansible-playbook --syntax-check facts5.yml
ansible-playbook facts5.yml
facts5.yml 파일의 문법 체크를 진행한 다음 플레이북을 실행한다.
Print local facts 태스크에서 커스텀으로 생성했던 팩트 내용이 출력되는 것을 확인할 수 있다.
정리
- 앤서블에서 변수를 사용할 때는 다음과 같은 우선 순위를 고려한다.
- 그룹 변수 : 인벤토리에 정의되며, 모든 그룹에서 적용되는 변수
- 호스트 변수 : 인벤토리에 정의되며, 특정 호스트에만 적용되는 변수
- 앤서블 팩트 : 플레이북 실행 시 자동으로 호스트에서 수집한 변수
- 플레이 변수 : 플레이북 실행 시 실행 결과를 저장한 변수
- 추가 변수 : 플레이북 실행 시 함께 선언되는 변수