User & Permission #
Setiap server produksi membutuhkan konfigurasi user yang konsisten — siapa yang boleh login, dengan metode apa, dan apa yang boleh mereka lakukan setelah login. Mengelola ini secara manual di banyak server adalah resep untuk konfigurasi yang tidak konsisten dan celah keamanan yang tidak disadari. Ansible menyediakan module yang idempoten untuk semua aspek manajemen user — dari pembuatan akun hingga distribusi SSH key dan konfigurasi sudoers.
Membuat dan Mengelola User #
Module user menangani siklus hidup lengkap user sistem:
- name: Buat user untuk deployment
user:
name: deployer
comment: "Deployment automation user"
shell: /bin/bash
groups:
- sudo
- docker
append: true # Tambahkan ke grup tanpa menghapus keanggotaan grup lain
state: present
create_home: true
- name: Buat user tanpa akses shell (service account)
user:
name: prometheus
comment: "Prometheus monitoring service"
shell: /usr/sbin/nologin # Tidak bisa login interaktif
system: true # User sistem (UID < 1000)
create_home: false
state: present
- name: Hapus user yang tidak diperlukan lagi
user:
name: olduser
state: absent
remove: true # Hapus home directory juga
Mendistribusikan SSH Key #
Setelah user dibuat, distribusikan SSH public key agar bisa login tanpa password:
- name: Tambahkan SSH key untuk user deployer
authorized_key:
user: deployer
key: "{{ lookup('file', 'files/ssh_keys/deployer.pub') }}"
state: present
exclusive: false # Jangan hapus key lain yang sudah ada
- name: Distribusikan SSH key tim dari daftar
authorized_key:
user: "{{ item.username }}"
key: "{{ item.ssh_key }}"
state: present
loop: "{{ team_members }}"
loop_control:
label: "{{ item.username }}"
# group_vars/all.yml — daftar tim yang bisa akses semua server
team_members:
- username: alice
ssh_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... alice@laptop"
- username: bob
ssh_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... bob@workstation"
Pola ini sangat berguna saat onboarding anggota tim baru — cukup tambahkan entry ke team_members dan jalankan playbook ke semua server.
Konfigurasi sudoers #
Module community.general.sudoers atau lineinfile bisa digunakan untuk mengatur akses sudo:
# Cara 1: menggunakan template untuk file sudoers terpisah
- name: Deploy konfigurasi sudoers untuk deployer
template:
src: deployer-sudoers.j2
dest: /etc/sudoers.d/deployer
owner: root
group: root
mode: '0440' # Mode 440 wajib untuk file sudoers
validate: 'visudo -cf %s' # Validasi syntax sebelum disimpan
{# templates/deployer-sudoers.j2 #}
# Deployer user — akses terbatas untuk deployment
deployer ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp
deployer ALL=(ALL) NOPASSWD: /bin/systemctl start myapp
deployer ALL=(ALL) NOPASSWD: /bin/systemctl stop myapp
deployer ALL=(ALL) NOPASSWD: /usr/bin/rsync
Selalu gunakan parameter validate: 'visudo -cf %s' saat mendeploy file sudoers. Konfigurasi sudoers yang syntax-nya salah bisa membuat semua user kehilangan akses sudo — termasuk kamu sendiri.Mengelola Grup #
- name: Pastikan grup yang diperlukan ada
group:
name: "{{ item }}"
state: present
loop:
- docker
- monitoring
- backup
- name: Buat grup dengan GID tertentu (untuk konsistensi antar server)
group:
name: appgroup
gid: 5000
state: present
Pola: Setup User Deployment Lengkap #
Menggabungkan semua di atas menjadi satu task list yang lengkap:
# roles/common/tasks/deploy-user.yml
---
- name: Buat grup deployment
group:
name: deployers
state: present
- name: Buat user deployment
user:
name: "{{ deploy_user }}"
groups:
- deployers
- docker
append: true
shell: /bin/bash
state: present
- name: Buat direktori .ssh
file:
path: "/home/{{ deploy_user }}/.ssh"
state: directory
owner: "{{ deploy_user }}"
group: "{{ deploy_user }}"
mode: '0700'
- name: Deploy SSH authorized keys
authorized_key:
user: "{{ deploy_user }}"
key: "{{ item }}"
state: present
loop: "{{ deploy_user_ssh_keys }}"
- name: Konfigurasi sudoers untuk deployment
template:
src: deploy-sudoers.j2
dest: "/etc/sudoers.d/{{ deploy_user }}"
mode: '0440'
validate: 'visudo -cf %s'
Ringkasan #
- Module
useruntuk membuat, memodifikasi, dan menghapus user sistem — gunakanshell: /usr/sbin/nologinuntuk service account yang tidak perlu login interaktif.- Module
authorized_keyuntuk mendistribusikan SSH key — gunakanexclusive: falseuntuk menghindari penghapusan key yang sudah ada.- Kelola SSH key tim sebagai list of dictionaries di
group_vars/all.yml— onboarding anggota baru cukup tambahkan entry.- Selalu gunakan
validate: 'visudo -cf %s'saat mendeploy file sudoers — satu kesalahan syntax bisa mengunci akses sudo.- Simpan konfigurasi sudoers di
/etc/sudoers.d/sebagai file terpisah — lebih aman dan mudah di-manage daripada mengedit/etc/sudoerslangsung.- Gunakan parameter
append: truedi moduleusersaat menambahkan user ke grup — tanpa ini, Ansible akan menghapus user dari semua grup yang tidak disebutkan.