Copy Module

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 copyfetch 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

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
lineinfile bekerja baik untuk modifikasi satu baris. Untuk perubahan yang lebih kompleks atau banyak baris, gunakan blockinfile atau template yang 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 #

  • copy untuk file statis yang identik di semua host; template untuk file yang berisi variabel per-host atau per-lingkungan.
  • fetch adalah kebalikan copy — mengambil file dari managed node ke control node, berguna untuk mengumpulkan log atau backup konfigurasi.
  • file untuk membuat direktori, symlink, mengubah permission, dan menghapus file — gunakan recurse: true untuk menerapkan permission ke subdirektori.
  • lineinfile untuk modifikasi satu baris dalam file yang sudah ada — cocok untuk mengubah nilai konfigurasi tanpa menimpa seluruh file.
  • blockinfile untuk mengelola blok teks multi-baris — gunakan marker untuk memastikan idempotency saat dijalankan ulang.
  • Untuk file konfigurasi yang kompleks dan berubah banyak per lingkungan, template selalu lebih baik dari lineinfile/blockinfile.

← Sebelumnya: Service   Berikutnya: Template (Jinja2) →

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