Package

Package #

Instalasi dan pengelolaan package adalah salah satu task paling dasar dalam configuration management. Ansible menyediakan module per package manager (apt, dnf, yum, pip, dll.) dan module universal (package) yang bekerja lintas distribusi. Memilih module yang tepat dan memahami opsinya memastikan instalasi package yang konsisten, idempoten, dan aman di semua server.

apt: Untuk Debian dan Ubuntu #

Module apt adalah pilihan untuk server berbasis Debian:

# Instalasi package tunggal
- name: Install nginx
  apt:
    name: nginx
    state: present

# Instalasi versi spesifik
- name: Install nginx versi tertentu
  apt:
    name: nginx=1.24.0-1~jammy
    state: present

# Instalasi beberapa package sekaligus (lebih efisien dari loop)
- name: Install semua package yang diperlukan
  apt:
    name:
      - nginx
      - postgresql-15
      - redis-server
      - python3-pip
    state: present
    update_cache: true      # apt update sebelum install
    cache_valid_time: 3600  # Hanya update cache jika lebih dari 1 jam

# Hapus package
- name: Hapus apache2 jika ada
  apt:
    name: apache2
    state: absent
    purge: true             # Hapus juga file konfigurasi

# Update semua package ke versi terbaru
- name: Upgrade semua package (hati-hati di production!)
  apt:
    upgrade: dist
    update_cache: true
Hindari upgrade: dist di production tanpa testing terlebih dahulu di staging. Update package yang tidak terkontrol bisa membreak dependency atau mengubah perilaku aplikasi.

dnf/yum: Untuk RHEL, CentOS, dan Fedora #

# dnf — untuk Fedora, RHEL 8+, CentOS Stream
- name: Install nginx (RHEL-based)
  dnf:
    name: nginx
    state: present
    update_cache: true

# Instalasi beberapa package
- name: Install development tools
  dnf:
    name:
      - git
      - python3
      - python3-pip
      - vim
    state: present

# Install dari grup package
- name: Install Development Tools group
  dnf:
    name: "@Development Tools"
    state: present

# yum — untuk CentOS 7 dan RHEL 7 (legacy)
- name: Install package (CentOS 7)
  yum:
    name: nginx
    state: present

Module package: Cross-Distro #

Saat playbook perlu bekerja di banyak distribusi, module package menggunakan package manager yang tersedia di sistem:

# Berlaku untuk apt, dnf, yum, zypper, dll.
- name: Install nginx (cross-distro)
  package:
    name: nginx
    state: present

Tapi ada kelemahannya: nama package tidak selalu sama di semua distro (misalnya python3-pip vs python3-pip3), dan package tidak mendukung semua fitur dari module spesifik. Untuk playbook yang butuh kontrol lebih, lebih baik gunakan kondisi:

- name: Install package (Debian/Ubuntu)
  apt:
    name: "{{ debian_packages }}"
    state: present
    update_cache: true
  when: ansible_os_family == "Debian"

- name: Install package (RedHat/CentOS)
  dnf:
    name: "{{ redhat_packages }}"
    state: present
  when: ansible_os_family == "RedHat"
# group_vars/all.yml
debian_packages:
  - nginx
  - python3-pip
  - postgresql-client

redhat_packages:
  - nginx
  - python3-pip
  - postgresql

Mengelola Repository #

Sebelum menginstal package dari repository third-party, tambahkan repositorynya terlebih dahulu:

# Tambahkan GPG key untuk repository Docker
- name: Tambahkan Docker GPG key
  apt_key:
    url: https://download.docker.com/linux/ubuntu/gpg
    state: present

# Tambahkan repository Docker
- name: Tambahkan repository Docker
  apt_repository:
    repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
    state: present
    update_cache: true

# Install Docker setelah repository ditambahkan
- name: Install Docker CE
  apt:
    name: docker-ce
    state: present
# Untuk RHEL-based: tambahkan repo via yum_repository
- name: Tambahkan repository EPEL
  dnf:
    name: epel-release
    state: present

# Atau menggunakan yum_repository untuk repo custom
- name: Tambahkan repository internal
  yum_repository:
    name: company-internal
    description: Company Internal Repository
    baseurl: https://repo.company.com/rhel/8/
    gpgcheck: true
    gpgkey: https://repo.company.com/RPM-GPG-KEY-Company
    state: present

pip: Package Python #

# Install package Python global
- name: Install Python packages
  pip:
    name:
      - flask
      - gunicorn
      - psycopg2-binary
    state: present

# Install dari requirements.txt
- name: Install Python dependencies dari requirements.txt
  pip:
    requirements: /opt/app/requirements.txt
    state: present

# Install di virtual environment
- name: Install package di virtualenv
  pip:
    name: gunicorn
    virtualenv: /opt/app/venv
    virtualenv_python: python3.11
    state: present

# Install versi spesifik
- name: Install Flask versi spesifik
  pip:
    name: flask==3.0.0
    state: present

Ringkasan #

  • Gunakan module spesifik (apt, dnf) untuk kontrol penuh, atau package untuk cross-distro yang sederhana.
  • Instalasi beberapa package dalam satu task lebih efisien dari loop — berikan list di parameter name.
  • Selalu tambahkan update_cache: true dengan cache_valid_time saat menggunakan apt untuk menghindari instalasi dari cache yang terlalu lama.
  • Gunakan state: present untuk memastikan package terinstal, bukan state: latestlatest bisa membreak deployment jika ada update tak terduga.
  • Untuk cross-distro, definisikan nama package per-OS di group_vars/ dan gunakan kondisi when: ansible_os_family.
  • Module pip mendukung requirements.txt dan virtual environment — gunakan virtualenv untuk isolasi dependency aplikasi.

← Sebelumnya: User & Permission   Berikutnya: Service →

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