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, ataupackageuntuk cross-distro yang sederhana.- Instalasi beberapa package dalam satu task lebih efisien dari loop — berikan list di parameter
name.- Selalu tambahkan
update_cache: truedengancache_valid_timesaat menggunakanaptuntuk menghindari instalasi dari cache yang terlalu lama.- Gunakan
state: presentuntuk memastikan package terinstal, bukanstate: latest—latestbisa membreak deployment jika ada update tak terduga.- Untuk cross-distro, definisikan nama package per-OS di
group_vars/dan gunakan kondisiwhen: ansible_os_family.- Module
pipmendukungrequirements.txtdan virtual environment — gunakanvirtualenvuntuk isolasi dependency aplikasi.