Facts

Facts #

Setiap kali Ansible terhubung ke managed node, secara default ia mengumpulkan informasi lengkap tentang sistem tersebut — sistem operasi, versi kernel, IP address, jumlah CPU, ukuran memori, dan ratusan detail lainnya. Informasi ini disebut facts. Facts adalah variabel otomatis yang tersedia tanpa kamu perlu mendefinisikannya — dan mereka sangat berguna untuk membuat playbook yang berperilaku berbeda tergantung kondisi sistem yang dihadapinya.

Bagaimana Facts Dikumpulkan #

Di awal setiap play, Ansible menjalankan task Gathering Facts secara otomatis. Task ini mengeksekusi module setup di managed node, yang mengumpulkan semua informasi sistem dan mengirimkannya kembali ke control node.

Play dimulai
    │
    ▼
TASK [Gathering Facts]
    │
    ├── Ansible menjalankan module setup di managed node
    │
    ├── setup mengumpulkan: OS, kernel, CPU, memory, disk, network, dll.
    │
    └── Semua informasi disimpan sebagai variabel (ansible_*)
    │
    ▼
Task-task playbook bisa menggunakan variabel ansible_* ini

Kamu bisa melihat semua facts yang tersedia untuk sebuah host:

# Tampilkan semua facts untuk host tertentu
ansible -i inventory/ web-01 -m setup

# Filter facts berdasarkan pattern
ansible -i inventory/ web-01 -m setup -a "filter=ansible_distribution*"
ansible -i inventory/ web-01 -m setup -a "filter=ansible_memory*"

Facts yang Paling Sering Digunakan #

Informasi Sistem Operasi #

ansible_distribution         # "Ubuntu", "Debian", "RedHat", "CentOS"
ansible_distribution_version # "22.04", "11", "8.6"
ansible_distribution_major_version  # "22", "11", "8"
ansible_os_family            # "Debian", "RedHat", "Suse", "Archlinux"

Contoh penggunaan:

- name: Install paket (Debian-based)
  apt:
    name: nginx
    state: present
  when: ansible_os_family == "Debian"

- name: Install paket (RedHat-based)
  dnf:
    name: nginx
    state: present
  when: ansible_os_family == "RedHat"

Informasi Hardware #

ansible_processor_count      # Jumlah CPU fisik
ansible_processor_vcpus      # Jumlah vCPU
ansible_memtotal_mb          # Total memori dalam MB
ansible_memfree_mb           # Memori bebas dalam MB
ansible_architecture         # "x86_64", "aarch64", "armv7l"
# Sesuaikan konfigurasi berdasarkan jumlah CPU yang tersedia
- name: Generate konfigurasi nginx
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  vars:
    # Gunakan jumlah worker sesuai jumlah vCPU
    worker_count: "{{ ansible_processor_vcpus }}"

Informasi Jaringan #

ansible_hostname             # Hostname pendek: "web-01"
ansible_fqdn                 # FQDN: "web-01.example.com"
ansible_default_ipv4.address # IP address default
ansible_default_ipv4.interface # Interface default (eth0, ens3, dll.)
ansible_all_ipv4_addresses   # Semua IP address IPv4 (list)
# Gunakan IP address dalam template konfigurasi
- name: Deploy konfigurasi load balancer
  template:
    src: haproxy.cfg.j2
    dest: /etc/haproxy/haproxy.cfg
  # Di template: {{ hostvars[item]['ansible_default_ipv4']['address'] }}

Informasi Tanggal dan Waktu #

ansible_date_time.date       # "2024-03-15"
ansible_date_time.time       # "14:30:25"
ansible_date_time.iso8601    # "2024-03-15T14:30:25Z"
ansible_date_time.epoch      # Unix timestamp

Mengakses Facts Host Lain #

Facts tidak hanya tersedia untuk host yang sedang dieksekusi — kamu bisa mengakses facts dari host lain menggunakan hostvars:

# Mengakses IP address dari server database saat konfigurasi web server
- name: Deploy konfigurasi aplikasi
  template:
    src: app.conf.j2
    dest: /etc/app/app.conf
  vars:
    db_host: "{{ hostvars['db-01.example.com']['ansible_default_ipv4']['address'] }}"
{# Template app.conf.j2 #}
[database]
host = {{ hostvars['db-01']['ansible_default_ipv4']['address'] }}
port = 5432
hostvars hanya berisi facts untuk host yang sudah menjalankan Gathering Facts dalam run playbook yang sama. Jika host tersebut belum dieksekusi, hostvars untuk host itu mungkin kosong atau mengandung data lama dari cache.

Custom Facts #

Selain facts otomatis, kamu bisa mendefinisikan custom facts di managed node. Custom facts berguna untuk menyimpan informasi spesifik aplikasi yang tidak diketahui oleh module setup bawaan.

Custom facts disimpan sebagai file .fact di direktori /etc/ansible/facts.d/ di managed node. Isinya bisa berupa JSON, INI, atau skrip executable yang menghasilkan JSON:

# /etc/ansible/facts.d/application.fact (format INI)
[app]
version = 2.1.0
deployed_at = 2024-03-15
environment = production
// /etc/ansible/facts.d/database.fact (format JSON)
{
  "db_version": "15.2",
  "last_migration": "20240315_001",
  "connection_pool_size": 20
}

Custom facts diakses melalui ansible_local:

- name: Tampilkan versi aplikasi yang terinstal
  debug:
    msg: "App version: {{ ansible_local.application.app.version }}"

- name: Deploy versi baru hanya jika versi lama terdeteksi
  include_tasks: deploy.yml
  when: ansible_local.application.app.version is defined

Untuk mendeploy custom facts:

- name: Buat direktori facts
  file:
    path: /etc/ansible/facts.d
    state: directory
    mode: '0755'

- name: Deploy custom fact untuk aplikasi
  template:
    src: application.fact.j2
    dest: /etc/ansible/facts.d/application.fact
  # Setelah ini, re-run gathering facts untuk membaca custom fact baru
  notify: Refresh facts

handlers:
  - name: Refresh facts
    setup:
      filter: ansible_local

Menonaktifkan Gathering Facts #

Gathering facts membutuhkan waktu — untuk setiap host, Ansible harus SSH, menjalankan setup, dan menerima data. Untuk playbook yang tidak membutuhkan informasi sistem, nonaktifkan gathering facts:

- name: Quick deployment task
  hosts: webservers
  gather_facts: false      # Hemat 1-3 detik per host

  tasks:
    - name: Deploy kode terbaru
      git:
        repo: https://github.com/org/app.git
        dest: /opt/app
        version: "{{ release_tag }}"

Untuk play besar dengan ratusan host, menonaktifkan gathering facts bisa menghemat beberapa menit eksekusi. Tapi pastikan tidak ada task di play tersebut yang bergantung pada facts seperti ansible_distribution atau ansible_default_ipv4.


Caching Facts #

Untuk infrastruktur besar, mengumpulkan facts setiap kali playbook berjalan bisa memakan waktu lama. Aktifkan fact caching untuk menyimpan hasil gathering facts:

# ansible.cfg
[defaults]
gathering = smart           # Hanya kumpulkan facts jika belum di-cache
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts_cache
fact_caching_timeout = 86400   # Cache berlaku 24 jam

Dengan gathering = smart, Ansible hanya menjalankan gathering facts jika cache untuk host tersebut sudah expired atau belum ada.


Ringkasan #

  • Facts adalah variabel otomatis yang dikumpulkan Ansible dari managed node di awal setiap play melalui module setup.
  • Facts yang paling sering digunakan: ansible_distribution, ansible_os_family, ansible_processor_vcpus, ansible_default_ipv4.address.
  • Gunakan hostvars['hostname']['fact_name'] untuk mengakses facts dari host lain dalam satu run playbook.
  • Custom facts di /etc/ansible/facts.d/ memungkinkan kamu menyimpan informasi aplikasi yang bisa dibaca melalui ansible_local.
  • Nonaktifkan dengan gather_facts: false di play yang tidak membutuhkan informasi sistem — hemat waktu eksekusi, terutama untuk infrastruktur besar.
  • Aktifkan fact caching untuk menghindari pengumpulan ulang facts yang sama di setiap run.

← Sebelumnya: Scope & Precedence   Berikutnya: Debugging →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact