Module

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
Gunakan command dan shell hanya jika tidak ada module yang tepat untuk tugasnya. Module-module ini tidak idempoten secara default — kamu harus menambahkan kondisi when atau creates secara 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) atau changed (ada perubahan) untuk setiap task.
  • Gunakan module spesifik (apt, systemd, file) daripada command/shell — module spesifik sudah menangani idempotency secara bawaan.
  • Gunakan register untuk menyimpan hasil module dan menggunakannya di task berikutnya.
  • Module tambahan tersedia melalui Ansible Collections untuk cloud provider, network device, dan kebutuhan spesifik lainnya.

← Sebelumnya: Inventory   Berikutnya: Instalasi →

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