KATEGORI: ANSIBLE

Latihan Ansible: Pengertian, Perbandingan dan Implementasi

Alat otomatisasi yang sangat sederhana yang dapat mengotomatisasikan proses konfigurasi berbagai layanan jaringan.

Do Exploit

--

Belajar Ansible
Thumbnail!

Semakin perkembangan teknologi, menuntut perkembangan jaringan komputer yang semakin kompleks pula. Walaupun semakin kompleks, bukan berarti kita tidak bisa mempercepat proses pembangunan dan monitoring jaringan dengan jumlah perangkat yang bejibun.

Bayangkan kalian seorang Administrator Jaringan. Mendapatkan tugas untuk membangun jaringan dengan jumlah perangkat yang bejibun dan punya konfigurasi dasar yang hampir sama setiap perangkatnya. Seperti menginstall beberapa package penting dalam server; nslookup, dig, ufw, dan lain-lain.

Hal tersebut bisa cepat diselesaikan dengan konfigurasi menggunakan alat Ansible.

Sejak 2005 kegiatan otomatisasi ini sebenarnya sudah teratasi oleh alat populer pada zaman itu, yaitu Puppet (2005) dan Chef (2009). Gambaran besar proses melakukan otomatisasi dengan alat tersebut adalah kita mengeluarkan sedikit usaha menginstall software kecil yang disebut Agent pada mesin yang akan di otomatisasi.

Apa itu Ansible?

Ansible hadir dengan metode komunikasi yang berbeda. Dimana alat sebelumnya menggunakan agent, sedangkan ansible menggunakan SSH sebagai modal utama komunikasi.

Komunikasi dengan SSH ini tidak memakan waktu yang banyak untuk konfigurasi, karena secara bawaan setiap mesin-mesin jaringan sudah terinstall SSH. Paling usaha manual yang perlu dilakukan adalah melakukan pengalamatan IP dan menyiapkan koneksi SSH dengan akses tanpa password.

Walaupun begitu, tentu Ansible masih saja lebih kuat untuk menangani pekerjaan otomatisasi dibanding Chef dan Puppet.

Dan yang paling penting, ini menggunakan bahasa konfigurasi sangat sederhana (YAML, digunakan untuk Ansible-Playbook) yang memberikan kita kemudahan menulis konfigurasi otomatisasi dengan mendekati bahasa Inggris sederhana.

Implementasi Ansible

Asumsi saya sebelum kita melakukan praktik, kalian sudah mengerti menggunakan beberapa layanan jaringan dasar. Otomatisasi ini tidak akan terlihat sebagai sesuatu yang wah jika kalian belum mengerti dasar-dasar penggunaan perangkat jaringan. Seperti server, router, switch dan lain-lain.

Ansible-Controller

Kita akan menyiapkan 1 server terlebih dahulu yang bertugas melakukan otomatisasi ke berbagai mesin. Dalam pembelajaran kali ini, saya menggunakan Debian sebagai sistem operasi dari Ansible Controller.

Topologi jaringan untuk belajar Ansible
Designed by app.diagrams.net

Server Ansible-Controller memiliki 2 kartu jaringan yang terhubung ke internet (Dinamis) dan mesin-mesin lainnya (Statik). Saya hanya akan membahas cara mengonfigurasi koneksi jaringannya dengan VMWare, untuk aplikasi virtualisasi lainnya silahkan menyesuaikan.

Settings VMWare Ansible-Controller
Isi konfigurasi jaringan dalam file /etc/network/interfaces

Keterangan:

  • ens32, nama interface yang terhubung dengan jaringan internet.
  • ens34, nama interface yang terhubung dengan mesin-mesin jaringan yang lain.

Silahkan sesuaikan nama interfacenya dengan interface dalam linux kalian, gunakan perintah ip add untuk melihatnya. Lalu restart layanan jaringannya dengan perintah service networking restart.

Sekarang mari kita siapkan private key dan public key SSH agar Ansible-Controller bisa melakukan SSH kepada mesin jaringan lainnya tanpa password. Gunakan perintah ssh-keygen, lalu kirimkan hasil public key yang didapatkan ke mesin-mesin jaringan lainnya.

  1. Membuat kunci SSH: ssh-keygen
  2. Memberikan kunci publik kedalam mesin lainnya. Gunakan perintah ssh-copy-id root@10.49.81.1 dan ssh-copy-id root@10.49.81.2.
Sumber: How Passwordless SSH Login Works. Security is my passion | by Michael Krasnov | Better Programming

Sebenarnya apa itu public-key dan private-key? Kenapa mesin lain hanya menyimpan Public-Key? Bagaimana cara kerjanya?

Mesin lain yang kita coba remote akan mengirimkan sebuah pesan terenkripsi menggunakan Public-Key. Pesan tersebut hanya bisa di dekripsi dengan Private-Key milik Ansible-Control, apabila private-key tidak cocok, maka hasil akhir yang didapatkan adalah Server Ansible-Control tidak bisa mengakses server mereka. Akhirnya dialihkan menggunakan password (hanya jika diizinkan).

3. Mencoba akses mesin lain tanpa password: ssh root@10.49.81.1

Terakhir, install Ansible menggunakan tutorial diatas.

Demo: With Debian

Topologi jaringan untuk belajar Ansible dengan server lain

Sebut saja nama topologi jaringan diatas adalah full-powerrr (rnya 3). Jaringan ini terdiri dari 2 server lain dan 1 server pengontrol.

Klien meminta server yang dibangun punya 1 group yang bertugas menjadi Switcher. Artinya seluruh user dalam server hanya bisa berpindah-pindah user menggunakan perintah su oleh user yang ada didalam group Switcher saja.

Jika kita mencoba berpindah user menggunakan user dalam group lain hasilnya akan su: Permission Denied.

test@ansible-controller:~$ su manager
su: permission denied

Struktur direktori dari Ansible-Control nantinya seperti dibawah ini. Jangan pusing dulu, kita akan kupas satu-satu.

/home/root
Ansible-Control/
ansible.cfg
hosts.ini
roles/
add-user.yml
conf-su.yml
root@ansible-controller:~# mkdir -p Ansible-Control/roles
root@ansible-controller:~# cd Ansible-Control

hosts.ini

Ansible bekerja dengan beberapa hosts dalam infrastruktur jaringan kita secara bersamaan, menggunakan list atau group yang dikenal sebagai inventory.

Singkatnya, file ini dibutuhkan untuk memberi-tahukan Ansible, siapa saja yang berada di dalam jaringan infrastruktur kita?

[app]
10.49.81.1
[db]
10.49.81.2
[web-stack:children]
app
db

Kita asumsikan jaringan dengan 2 server lain ini memiliki tugas sebagai Web Server dan Database Server. Lalu untuk mengelompokkan kedua bagian tersebut menggunakan web-stack:children. Ini bisa berkembang lagi seiring penambahan perangkat dan bagian yang berbeda-beda. Contoh:

[app]
10.49.81.1
10.49.81.5
10.49.81.10
[db]
10.49.81.2
10.49.81.3
[monitor]
10.49.81.4
[web-stack:children]
app
db
monitor

Yang diatas hanya contoh, kita tetap menggunakan konfigurasi hosts.ini yang sebelumnya.

ansible.cfg

File ini memegang peran penting dalam perilaku Ansible. Secara default, Ansible akan memilih file konfigurasi /etc/ansible/ansible.cfg jika di direktori yang digunakan sekarang tidak terdapat file tersebut.

Namun biar tidak mengganggu file konfigurasi asli disana, kita buat sendiri saja.

[defaults]
inventory = hosts.ini
remote_user = root
private_key_file = ~/.ssh/id_rsa

Walaupun file hosts.ini telah dibuat, itu bukan berarti ansible juga secara default mencari file hosts.ini dan menggunakannya. Kita perlu menaruh nama file tersebut secara manual didalam file konfigurasi.

Lalu variabel remote_user, merupakan variabel yang memberitahukan ansible, user apa yang digunakan untuk melakukan remote SSH?

Sebelum mengikuti lokasi file ~/.ssh/id_rsa di atas. Pastikan letaknya juga sesuai dengan Private Key milik kalian. Secara default setelah kita menggunakan perintah ssh-keygen, hasil private key yang dibuat dinamakan id_rsa dan terletak pada Home Directory user saat menggunakan perintah ssh-keygen dalam direktori .ssh (dengan titik di awal).

root@ansible-controller:~# ls ~/.ssh
id_ed25519 id_rsa known_hosts do_exploit_sepractest_rsa
id_ed25519.pub id_rsa.pub do_exploit_rsa do_exploit_sepractest_rsa.pub

Seluruh file yang diakhiri dengan .pub disebut Publik Key. Sedangkan yang tidak diakhiri ekstensi apapun disebut Private Key. Andai kata Private Key yang digunakan oleh server Ansible-Control untuk melakukan remote terhadap mesin-mesin lainnya adalah do_exploit_sepractest_rsa, maka konfigurasinya berubah menjadi seperti dibawah ini.

[defaults]
inventory = hosts.ini
remote_user = root
private_key_file = ~/.ssh/do_exploit_sepractest_rsa

add_user.yml

Sekumpulan isi yang terdapat pada file dengan ekstensi yml disebut tugas/tasks. Disini kita akan menulis semua tugas-tugas otomatisasi yang bakal diterapkan pada 2 server lain.

Kita bakal membuat 2 user. 1 user berada dalam group Switcher, sedangkan 1 lagi berada dalam group pribadinya. Secara default, jika kita tidak memberitahukan ke group mana sebuah user akan dimasukkan, maka group yang bakal digunakan oleh user tersebut adalah nama group user itu sendiri.

Artinya 1 user akan memiliki tugas melakukan perpindahan pengguna, sedangkan 1 lagi sebaliknya.

---
- name: Menambahkan 2 pengguna baru
hosts: web-stack
tasks:
- name: Membuat pengguna 'swap'
user:
user: swap
password: "{{ 'belajardirumahaja' | password_hash('sha512') }}"
group: switcher
shell: /bin/bash
- name: Membuat pengguna 'userlain'
user:
user: userlain
password: "{{ 'belajarkokdirumah' | password_hash('sha512') }}"
shell: /bin/bash
...

Keterangan:

  • tasks, urutan dan detail tugas yang bakal diterapkan pada tiap-tiap server.
  • name yang berada di indentasi 1 dan 2, memberikan deskripsi singkat kegiatan yang dilakukan. Layaknya komentar dalam pemrograman.
  • Seluruh kata-kata yang berada disetelah module user, disebut parameter dari module user. Seperti password, group, shell dan parameter user juga ada.
  • parameter password, berbeda dari yang lain, terdapat kode yang unik. Kode {{}} yang berada didalam kurawal dan kurakhir itu disebut variabel. Dalam kasus ini, variabelnya tidak kita buat dulu, tetapi langsung ditulis dalam {{}} sana. Kenapa harus dibuat menggunakan cara seperti itu? Karena, Ansible langsung menulis ke dalam file /etc/shadow, dimana file tersebut menyimpan seluruh password ter-hashed. Jadi kita perlu hashing dulu intinya.
  • user yang berada di indentasi 2, module untuk membantu proses pembuatan user baru. Lihat dibawah, hasil yml yang terbuat jika tidak menggunakan module user. Untuk kedepannya bakal sulit terbaca oleh sysadmin yang lain/baru dan tidak fleksibel.
---
- name: Menambahkan 2 pengguna baru
hosts: web-stack
tasks:
- name: Membuat pengguna 'swap'
command: adduser --group switcher --shell /bin/bash --disabled-password swap
- name: Membuat pengguna 'userlain'
command: adduser --shell /bin/bash --disabled-password userlain
...

Jalankan

root@ansible-controller:~/Ansible-Control# ansible-playbook roles/add_user.ymlPLAY [Konfigurasi hak istimewa perintah 'su'] ********************************************************************TASK [Gathering Facts] ********************************************************************
[WARNING]: Platform linux on host 10.47.0.254 is using the discovered Python interpreter at /usr/bin/python, but future
installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [10.49.81.1]
ok: [10.49.81.2]
TASK [Menambahkan group yang boleh menggunakan perintah 'su'] ********************************************************************
changed: [10.49.81.1]
changed: [10.49.81.2]
PLAY RECAP ********************************************************************
10.49.81.1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
10.49.81.2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Percobaan
Sekarang silahkan coba, apakah sudah bisa melakukan remote SSH menggunakan password terhadap kedua user tersebut?

root@ansible-controller:~# ssh swap@10.49.81.1
...
swap@debian:~# su userlain
userlain@debian:~# su swap
swap@debian:~#

User swap masih bisa berganti ke userlain, dan begitu juga userlain masih bisa berganti ke user swap.

conf-su.yml

---
- name: Konfigurasi hak istimewa perintah 'su'
hosts: web-stack
tasks:
- name: Menambahkan group yang boleh menggunakan perintah 'su'
replace:
path: /etc/pam.d/su
regexp: "# auth required pam_wheel.so$"
replace: "auth required pam_wheel.so group=switcher"
...

What’s happen hereee? Santuuy, saya bantu jelasin bree.

  • Sama seperti sebelumnya, disini kita menggunakan module replace untuk mengubah suatu konten dalam file.
  • Parameter path, berisikan /etc/pam.d/su. Direktori pam.d merupakan isi file konfigurasi yang mengatur hak akses penggunaan suatu perintah. Dalam kasus ini, kita mengubah hak akses perintah su, dimana perintah tersebut digunakan untuk melakukan perpindahan user.
  • Parameter replace, berisikan string yang akan mengganti sebuah baris yang cocok dengan parameter regexp.
  • Parameter regexp, harusnya kita menulis sebuah regex untuk yang cocok terhadap suatu baris dalam file. Tetapi biar cepat dan spesifik, saya menaruh isi konten barisnya langsung diakhiri dengan $. Lihat dibawah isi konten file before-nya.
Before run ansible-playbook roles/conf_su.yml
After run ansible-playbook roles/conf_su.yml

Akhir

Setelah proses panjang melakukan konfigurasi dengan Ansible. Disini kita akan melakukan reboot pada tiap-tiap server. Tidak perlu menggunakan file konfigurasi yml jika hanya 1 perintah. Silahkan jalankan perintah berikut pada mesin ansible-controller.

root@ansible-controller:~/Ansible-Control# ansible web-stack -a ‘reboot’

Silahkan lakukan percobaan kembali tahap sebelumnya di bagian add_users.yml pada sub Percobaan, untuk memastikan apakah konfigurasinya sudah benar dan tepat? Jika benar, maka user swap dapat berpindah ke user lainnya, sedangkan userlain tidak bisa.

--

--

Do Exploit

I share stories about what I've learned in the past and now. Let's connect to Instagram! @do.exploit