티스토리 뷰
[Ansible] Facts란 무엇인가?
Facts란?
Ansible에서 Ansible Node에 맞게 동적으로 할당되는 변수들을 의미합니다. Ansible Node의 OS, IP, Hostname 등 다양한 정보를 변수로 저장합니다.
Facts의 사용방법
Ansible Playbook YML 파일 작성 시 "gather_facts: no"라는 부분을 기본적으로 작성했었습니다.
Facts는 아래와 같이 정의하지 않을 경우 기본적으로 동작하게 됩니다.
"gather_facts: no"를 정의하는 이유는 facts를 수집하지 않음으로써 Ansible의 성능향상을 할 수 있습니다.
[vagrant@ansible-server ~]$ vi fact_check.yml --- - hosts: all #gather_facts: no #Facts를 정의하지 않을 경우 기본적으로 사용 가능 tasks: - name: debug by msg debug: msg: - "{{ ansible_distribution }}" |
Facts 수집 내용
- 아래와 같이 Ansible Node에 대한 다양한 정보를 수집하여 변수에 저장합니다.
[vagrant@ansible-server ~]$ ansible -i inventory all -m setup >> facts 1 192.168.1.201 | SUCCESS => { 2 "ansible_facts": { 3 "ansible_all_ipv4_addresses": [ 4 "10.0.2.15", 5 "192.168.1.201" 6 ], 7 "ansible_all_ipv6_addresses": [ 8 "fe80::a00:27ff:fe0a:142", 9 "fe80::a00:27ff:fef2:ff9e" 10 ], 11 "ansible_apparmor": { 12 "status": "disabled" 13 }, 14 "ansible_architecture": "x86_64", 15 "ansible_bios_date": "12/01/2006", 16 "ansible_bios_version": "VirtualBox", 17 "ansible_cmdline": { 18 "BOOT_IMAGE": "/vmlinuz-3.10.0-862.14.4.el7.x86_64", 19 "LANG": "en_US.UTF-8", 20 "crashkernel": "auto", 21 "quiet": true, 22 "rd.lvm.lv": "centos/swap", 23 "rhgb": true, 24 "ro": true, 25 "root": "/dev/mapper/centos-root" 26 }, 27 "ansible_date_time": { 28 "date": "2018-12-28", 29 "day": "28", 30 "epoch": "1546008178", 31 "hour": "14", 32 "iso8601": "2018-12-28T14:42:58Z", ... ... |
Facts 변수 사용
- 수집된 Facts 변수를 아래와 같이 Ansible Playbook을 작성하여 사용할 수 있습니다.
- 아래의 결과 값을 보면 Ansible Node의 OS 정보를 출력할 수 있습니다.
[vagrant@ansible-server ~]$ vi fact_check.yml --- - hosts: all tasks: - name: debug by msg debug: msg: - "{{ ansible_distribution }}" |
[vagrant@ansible-server ~]$ ansible-playbook -i inventory fact_check.yml PLAY [all] ************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************** ok: [192.168.1.201] ok: [192.168.1.202] ok: [192.168.1.103] ok: [192.168.1.102] ok: [192.168.1.101] ok: [192.168.1.104] ok: [192.168.1.203] ok: [192.168.1.204] TASK [debug by msg] ***************************************************************************************************************************************** ok: [192.168.1.101] => { "msg": [ "Ubuntu" ] } ok: [192.168.1.102] => { "msg": [ "Ubuntu" ] } ok: [192.168.1.103] => { "msg": [ "Ubuntu" ] } ok: [192.168.1.104] => { "msg": [ "Ubuntu" ] } ok: [192.168.1.201] => { "msg": [ "CentOS" ] } ok: [192.168.1.202] => { "msg": [ "CentOS" ] } ok: [192.168.1.203] => { "msg": [ "CentOS" ] } ok: [192.168.1.204] => { "msg": [ "CentOS" ] } PLAY RECAP ************************************************************************************************************************************************** 192.168.1.101 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.102 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.103 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.104 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.201 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.202 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.203 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.204 : ok=2 changed=0 unreachable=0 failed=0 |
수집된 Facts 변수 확인
- Playbook에 작성한 변수 "{{ ansible_distribution }}"를 Facts에서 확인하면 아래와 같이 확인할 수 있습니다.
- Playbook 아래의 빨간색으로 음영처리된 변수를 읽어온 후 msg를 통해 결과를 보여준 것입니다.
279 "sectorsize": "512", 280 "size": "80.00 GB", 281 "support_discard": "0", 282 "vendor": "ATA", 283 "virtual": 1 284 } 285 }, 286 "ansible_distribution": "CentOS", 287 "ansible_distribution_file_parsed": true, 288 "ansible_distribution_file_path": "/etc/redhat-release", 289 "ansible_distribution_file_variety": "RedHat", 290 "ansible_distribution_major_version": "7", 291 "ansible_distribution_release": "Core", 292 "ansible_distribution_version": "7.5.1804", 293 "ansible_dns": { 294 "nameservers": [ 295 "10.0.2.3" 296 ], 297 "options": { 298 "single-request-reopen": true 299 } 300 }, 301 "ansible_domain": "", |
Facts의 응용방법
그렇다면 이렇게 수집된 Facts 정보를 통해 어떠한 작업을 할 수 있을까요?
단편적으로 생각하였을 때 OS 별로 패키지를 설치한다던지, 특정한 IP에 어떠한 작업을 한다던지 등의 작업이 있을 수 있습니다.
이러한 정보를 활용하기 위한 단편적인 예로 아래와 같은 Playbook을 확인할 수 있습니다.
수집된 Facts 변수를 사용하여 OS 정보 표시
- 아래와 같이 when 구문을 응용하여 Facts에서 수집된 정보가 Ubuntu 일때, 또는 CentOS 일때 서로 다른 작업 명령을 실행 할 수 있습니다.
--- - hosts: all tasks: - name: My Name debug: msg: "Ubuntu 입니다." when: ansible_distribution == 'Ubuntu' - name: My Name-2 debug: msg: "CentOS 입니다" when: ansible_distribution == 'CentOS' |
[vagrant@ansible-server ~]$ ansible-playbook -i inventory fact_check.yml PLAY [all] ************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************** ok: [192.168.1.201] ok: [192.168.1.202] ok: [192.168.1.203] ok: [192.168.1.204] ok: [192.168.1.103] ok: [192.168.1.102] ok: [192.168.1.104] ok: [192.168.1.101] TASK [My Name] ********************************************************************************************************************************************** ok: [192.168.1.101] => { "msg": "Ubuntu 입니다." } ok: [192.168.1.102] => { "msg": "Ubuntu 입니다." } ok: [192.168.1.103] => { "msg": "Ubuntu 입니다." } ok: [192.168.1.104] => { "msg": "Ubuntu 입니다." } skipping: [192.168.1.201] skipping: [192.168.1.202] skipping: [192.168.1.203] skipping: [192.168.1.204] TASK [My Name-2] ******************************************************************************************************************************************** skipping: [192.168.1.101] skipping: [192.168.1.102] skipping: [192.168.1.103] skipping: [192.168.1.104] ok: [192.168.1.201] => { "msg": "CentOS 입니다" } ok: [192.168.1.202] => { "msg": "CentOS 입니다" } ok: [192.168.1.204] => { "msg": "CentOS 입니다" } ok: [192.168.1.203] => { "msg": "CentOS 입니다" } PLAY RECAP ************************************************************************************************************************************************** 192.168.1.101 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.102 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.103 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.104 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.201 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.202 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.203 : ok=2 changed=0 unreachable=0 failed=0 192.168.1.204 : ok=2 changed=0 unreachable=0 failed=0 |
'[Server Story] > Management' 카테고리의 다른 글
[Zabbix] Zabbix Server Install - CentOS7 & MySQL & Nginx (0) | 2021.07.27 |
---|---|
[ELK Stack] Elastic(ELK) Stack 구축하기(Beat, Logstash, ElasticSearch, Kibana) (0) | 2019.01.31 |
[Ansible] Authorized_keys 등록하기(SSH Key) (0) | 2018.12.26 |
[Ansible] Known_hosts 등록하기 (0) | 2018.12.24 |
[VAGRANT & ANSIBLE] Windows Ansible WinRM 환경구성 (0) | 2018.08.20 |