Study/앤서블(Ansible)

변수와 팩트 사용하기 - 자동 예약 변수 팩트

석사한 화이트핸드 2024. 3. 20. 10:53
728x90
반응형

출처 : 앤서블로 시작하는 인프라 자동화

 

 

자동 예약 변수 - 팩트

  • 팩트(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 태스크에서 커스텀으로 생성했던 팩트 내용이 출력되는 것을 확인할 수 있다.

 

 

정리

  • 앤서블에서 변수를 사용할 때는 다음과 같은 우선 순위를 고려한다.
    • 그룹 변수 : 인벤토리에 정의되며, 모든 그룹에서 적용되는 변수
    • 호스트 변수 : 인벤토리에 정의되며, 특정 호스트에만 적용되는 변수
    • 앤서블 팩트 : 플레이북 실행 시 자동으로 호스트에서 수집한 변수
    • 플레이 변수 : 플레이북 실행 시 실행 결과를 저장한 변수
    • 추가 변수 : 플레이북 실행 시 함께 선언되는 변수

 

 

728x90
반응형