Facts란
Ansible이 플레이북을 실행하면, 타겟 서버에 접속하자마자 서버의 현재 사양을 확인하여 변수화한다.
이 때 하드웨어/OS/리소스/네트워크 인터페이스 정보 등 서버에서 확인할 수 있는 모든 정보를 확인하고, ansible_facts라는 dictionary에 저장한다.
이후 ansible은 ansible_facts에 담긴 각 항목들을 별도의 변수로 선언하는데, 이는 사용자가 간편하게 참조할 수 있게 도와주는 편의기능에 불과하다.
가령, ansbile은 접속한 서버에서 실행되는 python의 버전을 ansible_facts['python_version']에 저장한다.
이 값은 ansible_python_version 이라는 별도의 변수에 한번 더 선언된다.
실제로 서버에서 어떤 값들을 확인하는지, 즉 ansible_facts에 어떤 항목들이 담기는지는 너무 방대해서 생략하고, 대신 관련 공식문서를 첨부한다.
ℹ️ Ansible 공식문서 - Facts
링크
Facts 이중 선언 비활성화
앞서 ansible_facts['python_version']를 ansible_python_version라는 변수에 한번 더 할당한다고 설명했다.
Facts 항목이 좀 많더라도 변수 선언에 얼마나 많은 리소스나 시간을 들이겠나 싶으니 굳이 비활성화할 필요는 없다.
하지만 그다지 쓸모가 커보이는 기능도 아닐 뿐더러,
타겟 서버가 많아졌을 때 쓸모없는 짓을 반복하는 것을 보고 싶지 않아 비활성화 시킨다.
앤서블 설정 파일의 이름은 ansible.cfg 이다.
이 설정 파일을 수정하여 비활성화한다.
ansible.cfg 설정파일 수정
현재 앤서블이 설치된 제어노드는 로컬 MacOS 이다.
ansiblec.cfg는 어디 있는지 몰라서 find 명령으로 조금 찾아보다가 결국 발견하지 못했다.
알아보니 ansible --version 명령으로 버전 확인 시 config file 경로도 출력해준다고 한다.
# ansible --version
ansible [core 2.19.3]
config file = None
(...)config file이 없다고 나온다.
공식 문서에 따르면 다음의 순서대로 config file을 탐색하고, 가장 먼저 마주친 config 한개만 사용한다고 한다.
ANSIBLE_CONFIG(environment variable if set)ansible.cfg(in the current directory)~/.ansible.cfg(in the home directory)/etc/ansible/ansible.cfg
ℹ️ Ansible 공식문서 - Configuration Settings
링크
원하는 비활성화 설정은 전역적으로 걸어두고자 하며, 본래 /etc 디렉터리가 설정파일을 두는 목적이므로, /etc/ansible/ansible.cfg를 새로 작성한다.
# sudo mdir /etc/ansible
# sudo vi /etc/ansible/ansible.cfg
[defaults]
inject_facts_as_vars = False이후 다시 config file 확인하면 적용이 잘 되어있다.
# ansible --version
ansible [core 2.19.3]
config file = /etc/ansible/ansible.cfg
(...)이 기능을 비활성화 했으니 앤서블 스크립트에서 더이상 ansible_python_version 같은 facts vars는 사용 불가하며, ansible_facts['python_version']으로 참조해야한다.
개인적으로는 ansible_facts라는 변수를 직접 참조하는 것이 'facts를 참조한다'는 직관을 더 강하게 줘서 선호한다.
'DevOps' 카테고리의 다른 글
| docker로 ngrinder 구동 (0) | 2025.09.24 |
|---|