Module #
Jika playbook adalah rencana dan inventory adalah daftar target, maka module adalah alat yang benar-benar mengerjakan sesuatu. Module adalah unit kerja terkecil dalam Ansible — setiap task dalam playbook memanggil satu module. Ansible menyediakan ratusan module bawaan, mulai dari menginstal paket hingga berinteraksi dengan API cloud. Memahami cara kerja module akan mengubah cara kamu menulis playbook.
Apa itu Module #
Module adalah kode Python yang dikirim ke managed node dan dieksekusi di sana. Setiap module dirancang untuk satu tujuan spesifik: menginstal paket, membuat file, mengelola service, dan sebagainya. Module menerima parameter sebagai input dan mengembalikan status beserta informasi perubahan yang terjadi.
# Setiap task memanggil satu module
- name: Install nginx
apt: # ← ini adalah module
name: nginx # ← ini adalah parameter module
state: present
Module apt di atas akan mengecek apakah nginx sudah terinstal. Jika sudah, tidak ada yang dilakukan. Jika belum, module akan menginstalnya. Hasilnya selalu konsisten — inilah prinsip idempotency yang menjadi fondasi desain semua module Ansible.
Idempotency dalam Module #
Module Ansible dirancang untuk idempoten — menjalankan module yang sama berkali-kali menghasilkan kondisi akhir yang sama, tanpa efek samping yang tidak diinginkan.
# ANTI-PATTERN: menggunakan shell/command untuk sesuatu yang sudah ada modulenya
- name: Install nginx (cara salah)
command: apt-get install nginx
# Ini TIDAK idempoten — akan error jika nginx sudah terinstal
# atau akan mencoba instal ulang setiap kali dijalankan
# BENAR: gunakan module apt yang dirancang idempoten
- name: Install nginx (cara benar)
apt:
name: nginx
state: present
# Ansible cek dulu apakah nginx sudah ada
# Jika sudah → tidak melakukan apa-apa (changed: false)
# Jika belum → instal nginx (changed: true)
Ansible melaporkan dua status untuk setiap task:
ok— task dieksekusi, tidak ada perubahan (kondisi sudah terpenuhi)changed— task dieksekusi dan membuat perubahan
Kategori Module #
Ansible mengelompokkan module berdasarkan fungsinya. Berikut kategori yang paling sering digunakan:
Package Management #
# apt — untuk Debian/Ubuntu
- apt:
name: nginx
state: present # present, absent, latest
# yum/dnf — untuk RHEL/CentOS/Fedora
- dnf:
name: nginx
state: present
# pip — untuk Python packages
- pip:
name: flask
state: present
File dan Direktori #
# copy — menyalin file dari control node ke managed node
- copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
# template — seperti copy, tapi dengan variabel Jinja2
- template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
# file — membuat/menghapus file atau direktori
- file:
path: /opt/myapp
state: directory # directory, file, absent, touch
mode: '0755'
# lineinfile — memastikan baris tertentu ada di file
- lineinfile:
path: /etc/hosts
line: "192.168.1.100 internal.example.com"
state: present
Service Management #
# systemd — mengelola service systemd
- systemd:
name: nginx
state: started # started, stopped, restarted, reloaded
enabled: true # aktifkan saat boot
daemon_reload: true # reload systemd daemon setelah perubahan unit file
User dan Akses #
# user — mengelola user sistem
- user:
name: deployuser
state: present
groups: sudo
shell: /bin/bash
# authorized_key — menambahkan SSH public key
- authorized_key:
user: deployuser
key: "{{ lookup('file', 'files/deploy.pub') }}"
state: present
Eksekusi Perintah #
# command — menjalankan perintah (tidak melalui shell)
- command: /usr/bin/myapp --init
# shell — menjalankan perintah melalui shell (mendukung piping, redirect)
- shell: "cat /var/log/app.log | grep ERROR | wc -l"
register: error_count
Gunakancommanddanshellhanya jika tidak ada module yang tepat untuk tugasnya. Module-module ini tidak idempoten secara default — kamu harus menambahkan kondisiwhenataucreatessecara manual untuk membuatnya aman dijalankan berulang.
Mengambil Hasil Module dengan register #
Setiap module mengembalikan data — status eksekusi, output, dan informasi perubahan. Kamu bisa menyimpan data ini menggunakan register dan menggunakannya di task berikutnya.
- name: Cek apakah file konfigurasi ada
stat:
path: /etc/myapp/config.yml
register: config_file
- name: Buat konfigurasi default jika belum ada
copy:
src: files/default-config.yml
dest: /etc/myapp/config.yml
when: not config_file.stat.exists
Module Bawaan vs Collection #
Ansible Core menyertakan ratusan module bawaan yang menangani kebutuhan umum. Untuk kebutuhan yang lebih spesifik — AWS, GCP, Azure, Kubernetes, network device — Ansible menggunakan Collections: paket module tambahan yang bisa diinstal terpisah.
# Menginstal collection untuk AWS
ansible-galaxy collection install amazon.aws
# Setelah terinstal, module AWS bisa digunakan
- name: Buat EC2 instance
amazon.aws.ec2_instance:
name: web-server
instance_type: t3.medium
image_id: ami-0c55b159cbfafe1f0
Ini adalah cara Ansible menjaga core tetap ringan sambil tetap mendukung ekosistem yang sangat luas.
Ringkasan #
- Module adalah unit kerja terkecil Ansible — setiap task dalam playbook memanggil satu module.
- Module dirancang idempoten: menjalankannya berkali-kali aman dan menghasilkan kondisi akhir yang sama.
- Ansible melaporkan
ok(tidak ada perubahan) atauchanged(ada perubahan) untuk setiap task.- Gunakan module spesifik (
apt,systemd,file) daripadacommand/shell— module spesifik sudah menangani idempotency secara bawaan.- Gunakan
registeruntuk menyimpan hasil module dan menggunakannya di task berikutnya.- Module tambahan tersedia melalui Ansible Collections untuk cloud provider, network device, dan kebutuhan spesifik lainnya.