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
hostvarshanya berisi facts untuk host yang sudah menjalankanGathering Factsdalam run playbook yang sama. Jika host tersebut belum dieksekusi,hostvarsuntuk 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 melaluiansible_local.- Nonaktifkan dengan
gather_facts: falsedi 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.