Copy Module #
Mengelola file di server adalah inti dari configuration management — menyalin file konfigurasi, memastikan direktori ada, membuat symlink, atau menambahkan baris ke file yang sudah ada. Ansible menyediakan beberapa module untuk ini, masing-masing dengan kasus penggunaan yang berbeda. Memilih module yang tepat menghasilkan playbook yang lebih bersih dan lebih idempoten.
copy: Menyalin File Statis #
Module copy menyalin file dari control node ke managed node, atau membuat file baru dengan konten yang ditentukan:
# Salin file dari control node
- name: Salin file konfigurasi nginx
copy:
src: files/nginx.conf # Relatif ke roles/<role>/files/ atau playbook
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
backup: true # Buat backup file sebelum ditimpa (.bak)
# Salin direktori beserta isinya
- name: Salin direktori static files
copy:
src: files/static/ # Trailing slash = salin isi direktori
dest: /var/www/html/static/
owner: www-data
group: www-data
mode: '0644'
# Buat file dengan konten inline
- name: Buat file konfigurasi sederhana
copy:
content: |
[app]
debug = false
log_level = warning
dest: /etc/app/app.ini
owner: app
mode: '0640'
copy vs template: Kapan Menggunakan Masing-masing #
Gunakan copy jika:
✓ File tidak berubah antar host (identik di semua server)
✓ File binary (gambar, sertifikat, executable)
✓ File yang tidak butuh substitusi variabel
Gunakan template jika:
✓ File berisi variabel yang berbeda per host atau per lingkungan
✓ File konfigurasi yang menggunakan IP/hostname server
✓ File yang strukturnya berubah berdasarkan kondisi
fetch: Mengambil File dari Server #
Kebalikan dari copy — fetch mengambil file dari managed node ke control node:
- name: Ambil log error untuk dianalisis
fetch:
src: /var/log/app/error.log
dest: logs/{{ inventory_hostname }}/error.log # Simpan per hostname
flat: false # Sertakan struktur direktori hostname
- name: Ambil file konfigurasi yang ada untuk di-review
fetch:
src: /etc/nginx/nginx.conf
dest: backups/nginx/{{ inventory_hostname }}/nginx.conf
flat: true # Simpan langsung tanpa subdirektori
file: Mengelola File, Direktori, dan Symlink #
Module file adalah alat serba guna untuk manajemen filesystem:
# Buat direktori beserta parent-nya
- name: Buat direktori aplikasi
file:
path: /opt/app/logs
state: directory
owner: deployer
group: deployer
mode: '0755'
recurse: true # Terapkan owner/mode ke semua subdirektori
# Buat symlink
- name: Buat symlink untuk direktori aktif
file:
src: /opt/app/releases/v2.1.0
dest: /opt/app/current
state: link
# Pastikan file ada (touch)
- name: Buat file log jika belum ada
file:
path: /var/log/app/app.log
state: touch
owner: app
mode: '0644'
modification_time: preserve # Jangan update mtime jika sudah ada
# Hapus file atau direktori
- name: Hapus file konfigurasi lama
file:
path: /etc/app/old-config.conf
state: absent
lineinfile: Modifikasi Baris dalam File #
lineinfile memastikan satu baris tertentu ada (atau tidak ada) dalam file. Berguna untuk memodifikasi file konfigurasi yang sudah ada tanpa menimpa seluruh file:
# Pastikan baris tertentu ada di file
- name: Tambahkan entry ke /etc/hosts
lineinfile:
path: /etc/hosts
line: "192.168.1.100 internal.example.com"
state: present
# Pastikan baris tidak ada
- name: Hapus baris konfigurasi lama
lineinfile:
path: /etc/ssh/sshd_config
line: "PermitRootLogin yes"
state: absent
# Ganti nilai konfigurasi menggunakan regex
- name: Nonaktifkan PermitRootLogin di SSH
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PermitRootLogin' # Cocokkan baris yang ada
line: "PermitRootLogin no" # Ganti dengan nilai ini
backrefs: false
notify: Restart SSH
lineinfilebekerja baik untuk modifikasi satu baris. Untuk perubahan yang lebih kompleks atau banyak baris, gunakanblockinfileatautemplateyang jauh lebih mudah di-maintain.
blockinfile: Mengelola Blok Teks #
blockinfile mengelola blok teks multi-baris dalam file, ditandai dengan marker khusus:
- name: Tambahkan konfigurasi SSH hardening
blockinfile:
path: /etc/ssh/sshd_config
marker: "# {mark} ANSIBLE MANAGED BLOCK — SSH Hardening"
block: |
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
state: present
notify: Restart SSH
File yang dihasilkan akan terlihat seperti:
# BEGIN ANSIBLE MANAGED BLOCK — SSH Hardening
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
# END ANSIBLE MANAGED BLOCK — SSH Hardening
Marker ini memungkinkan Ansible untuk menemukan dan memperbarui blok yang sama di run berikutnya — blok lama akan digantikan oleh blok baru secara idempoten.
Ringkasan #
copyuntuk file statis yang identik di semua host;templateuntuk file yang berisi variabel per-host atau per-lingkungan.fetchadalah kebalikancopy— mengambil file dari managed node ke control node, berguna untuk mengumpulkan log atau backup konfigurasi.fileuntuk membuat direktori, symlink, mengubah permission, dan menghapus file — gunakanrecurse: trueuntuk menerapkan permission ke subdirektori.lineinfileuntuk modifikasi satu baris dalam file yang sudah ada — cocok untuk mengubah nilai konfigurasi tanpa menimpa seluruh file.blockinfileuntuk mengelola blok teks multi-baris — gunakan marker untuk memastikan idempotency saat dijalankan ulang.- Untuk file konfigurasi yang kompleks dan berubah banyak per lingkungan,
templateselalu lebih baik darilineinfile/blockinfile.