Ossian Story
article thumbnail

[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





profile

Ossian Story

@ossians