Mengenal Ansible Automation

Mengenal apa itu Ansible dan penerapannya untuk developer maupun sysadmin

DOT Intern
Published in
10 min readSep 10, 2020

--

💻 Permasalahan Developer

Seorang developer freelance bernama Budi

Budi (nama samaran) adalah seorang developer freelance yang bekerja secara projekan. Suatu hari Budi mendapat projek untuk membuat sebuah website portofolio dan dapat diakses secara publik. Sayangnya, Budi tidak memiliki tim dan harus melakukan semua pekerjaan itu sendirian.

Tugas budi adalah membuat web portofolio dapat diakses semua orang

Selama ini Budi hanya pernah membuat website di lokal. Setelah itu Budi berusaha mencari di internet bagaimana cara membuat website di lokal dapat diakses melalui internet.

Budi berusaha mencari solusi permasalahannya

Tidak berlama-lama, Budi pun langsung menemukan bagaimana cara supaya website tersebut dapat diakses melalui internet, yaitu melalui Virtual Private Server (let say Budi gak tau apa itu hosting dan kebetulan tidak menemukannya di internet 😄).

Solusi Budi

Ternyata untuk meletakkan website di VPS masih ada langkah-langkah yang perlu dilakukan. Budi kembali browsing dan menemukan caranya!

Langkah yang perlu dilakukan Budi di VPS-nya

Budi pun segera mencoba langkah-langkah tersebut pada VPS yang sudah di sewanya.

Budi melakukan konfigurasi ke VPS-nya

Dan setelah dicoba untuk mengakses ke IP VPS miliknya melalui browser, halaman web portofolio temannya yang sudah ia buat pun muncul!

Portofolio teman Budi

Pada akhirnya Budi berhasil menyelesaikan projek tersebut, lalu mendapatkan imbalan, dan Budi pun merasa senang!

Budi merasa senang!

Di kemudian hari, Budi mendapat projek sejenis lainnya, jumlahnya adalah 9 projek dan bisa jadi terus bertambah kedepannya. Budi pun bingung dan merasa frustasi jika mengerjakan projek yang mengharuskannya untuk melakukan konfigurasi yang sama pada VPS secara terus menerus.

Budi pun bingung

Akhirnya Budi mencoba kembali mencari di internet solusi untuk permasalahannya tersebut. Akhirnya Budi bertemu dengan Ansible! Namun sekali lagi Budi perlu mempelajari bagaimana cara menggunakan Ansible. Budi menemukan bahwa untuk menggunakan Ansible Budi perlu membuat beberapa jenis file menggunakan bahasa YAML.

YAML Ain’t Markup Language

Setelah itu Budi membuat file berbahasa yaml yang disebut playbook dan juga inventory. Di dalam file tersebut, Budi mendefinisikan apa saja konfigurasi yang akan dilakukan dan server mana yang akan menjadi tujuan konfigurasi tersebut.

playbook.yml buatan Budi

Setelah itu Budi hanya perlu menjalankan file playbook yang sudah Budi buat.

Perintah yang Budi jalankan

Setelah itu, Ansible melakukan tugasnya dan melakukan konfigurasi yang sama ke 9 projeknya itu, dan Budi bisa duduk bersantai sambil memantau Ansible melakukan tugasnya.

Ansible! Solusi untuk Budi.

Dengan Ansible, Budi hanya perlu membuat satu file konfigurasi menggunakan YAML dan menjalankannya untuk beberapa server sekaligus. Kini Budi tidak perlu takut lagi untuk mendapatkan projek-projek serupa di kemudian hari, karena Budi sudah bersama Ansible!

Budi kembali senang, XD

“It’s not magic, it’s Ansible!” — Budi

❓ Apa itu Ansible?

Ansible is an open-source software provisioning, configuration management, and application-deployment tool enabling infrastructure as code. -Wikipedia

Ansible merupakan salah satu automation tool dan infrastructure as a code yang tersedia secara open source. Dengan Ansible kita dapat melakukan provisioning (semacam membuat/menghapus) server, configuration management, dan melakukan deployment aplikasi pada server.

Arsitektur Ansible

Ada 2 hal yang sangat penting jika kita ingin menggunakan sebuah Ansible, yaitu Inventory dan Playbook.

Inventory adalah tempat di mana kita menyimpan alamat dari host/server yang akan menjadi tujuan dijalankannya konfigurasi yang telah ditentukan oleh Ansible.

Contoh Inventory

Sedangkan Playbook adalah tempat pendefinisian berbagai jenis konfigurasi yang akan dijalankan di target host.

Contoh Playbook

Sebenarnya ada 2 cara untuk menjalankan ansible, yaitu melalui playbook dan ad-hoc. Jika menjalankan ansible dengan playbook maka kita perlu untuk membuat file playbook seperti di atas. Namun jika menggunakan ad-hoc kita bisa langsung menjalankan command tanpa playbook.

Contoh eksekusi Ansible menggunakan ad-hoc:

ansible -i inventory -m module
Install Apache dengan metode Ad-Hoc

Namun, mode ad-hoc ini biasa digunakan untuk melakukan testing atau konfigurasi sederhana. Jika konfigurasi yang diperlukan cukup kompleks maka kita perlu menggunakan playbook. Selain itu, playbook juga lebih direkomendasikan karena dapat kita lakukan version control pada setiap perubahan playbook kita.

📄 Anatomi Ansible YAML File

Seperti yang disebutkan di atas, untuk menjalankan Ansible diperlukan inventory dan playbook. Meskipun masih ada file-file lain yang mungkin perlu dibuat, tetapi di sini saya akan membahas file yang paling dasar dan paling dibutuhkan oleh Ansible.

Inventory (file)

Yang pertama adalah invetory, di dalam sebuah inventory, kita perlu mendefinisikan host yang akan menjadi ansible slave dan juga nama grup.

Ansible Inventory

Task

Di dalam sebuah playbook, terdapat kumpulan tugas berisi konfigurasi sederhana yang disebut dengan task. Penulisan task yang paling sederhana adalah mendefinisikan nama task dan juga modul yang akan digunakan.

Nama task berfungsi sebagai dokumentasi dari tujuan task tersebut dibuat dan mempermudah untuk troubleshooting ketika error terjadi. Sedangkan modul adalah pengganti dari perintah-perintah yang dijalankan secara manual pada terminal (shell).

Ansible Task

Playbook (file)

Seperti yang sudah dijelaskan, kumpulan task tersebut akan membuat sebuah object yang disebut play. Karena seringkali 1 playbook hanya memiliki satu play, seringkali play (kumpulan task) disebut sebagai playbook (sebutan untuk file YAML nya).

Ansible Playbook

Struktur dari direktori ketika sudah membuat 2 file tersebut kira-kira seperti ini:

Directory Structure

🔒 Setup SSH

Yang diperlukan supaya Ansible dapat melakukan tugasnya adalah Ansible Master dapat melakukan koneksi SSH ke host yang akan di-setup. Biasanya cara yang sering dilakukan adalah men-generate file ssh dan menaruh public key ke server tujuan.

Salah satu cara men-generate file ssh adalah menggunakan ssh-keygen (menggunakan terminal maupun CMD). Di sini saya akan contohkan menggunakan Linux.

Ansible Master (Part 1)

Jalankan command:

ssh-keygen

Lalu enter sampai keluar seperti gambar di bawah:

Ketika command tersebut selesai dijalankan maka akan muncul dua file di dalam directory /home/[nama_user]/.ssh/ atau /root/.ssh/ (jika menggunakan user root) yaitu id_rsa (private key) dan id_rsa.pub (public key).

Setelah itu yang perlu dilakukan adalah meng-copy isi dari public key dan meletakkannya pada file authorized_keys di server tujuan.

cat /home/[nama_user]/.ssh/id_rsa.pub

atau

cat /root/.ssh/id_rsa.pub

Di sini saya mencontohkan menggunakan user root, maka directory yang saya gunakan adalah /root/.ssh/

Setelah itu copy semua isi file id_rsa.pub.

Ansible Slave (Server Tujuan)

Login ke server tujuan, buka file authorized_keys dengan text editor:

cd /home/[nama_user]/.ssh/
nano authorized_keys

atau

cd /root/.ssh/
nano authorized_keys

Lalu paste isi dari public key ke baris paling akhir file tersebut (isi file bisa jadi berbeda dengan gambar di bawah):

Setelah itu simpan dan keluar.

Ansible Master (Part 2)

Setelah itu kembali ke Ansible Master dan jalankan command:

ssh user@ip_ansible_slave

Jika berhasil, maka Ansible seharusnya sudah bisa digunakan di server tersebut.

💪 Instalasi Ansible

Centos/RHEL:

yum install ansible

Debian/Ubuntu:

apt install ansible

Pip (Python):

pip install ansible

Untuk lebih jelasnya, silahkan lihat dokumentasi resmi Ansible.

Instalasi Ansible dengan Pip

Testing Installasi Ansible

Untuk mencoba jalankan command berikut:

ansible all -i ip_address_target, -m ping

Command di atas bertujuan untuk melakukan ping ke server tujuan.

Test Ansible

Jika muncul SUCCESS, maka sekarang Ansible sudah dapat digunakan untuk hal yang lebih kompleks lagi.

📚 Case Study

Problem

Masalah yang kita coba selesaikan adalah masalah yang serupa seperti yang dialami Budi. Di sini saya membuat 5 server (VPS) menggunakan AWS EC2 Instance dengan nama Ansible Slave:

Server (EC2 Instance) pada AWS

Sebelum melakukan deployment dan konfigurasi, ketika saya memasukkan IP server tersebut ke browser maka tampilannya akan seperti ini:

Tampilan Sebelum Dikonfigurasi dan Dideploy

Jika dilakukan request terhadap ke-5 server tersebut akan terjadi error (connection refused):

Connection Refused

Sekarang tugas saya adalah melakukan konfigurasi sekaligus konfigurasi terhadap ke-5 server tersebut.

Without Ansible

Di sini saya mencontohkan Ubuntu sebagai OS dari VPS. Berikut langkah-langkah yang harus dilakukan:

apt install apache2
service start apache2
cd /var/www/html
rm *
git clone https://gitlab.com/lovdianchel/portofolio-teman.git .

Secara default ketika sudah berhasil menginstall apache, maka tampilan web server ketika dibuka melalui browser akan seperti ini:

Tampilan Default Apache2
Langkah yang dijalankan

Sesuai dengan source code website yang telah dibuat, maka seharusnya hasilnya dapat dilihat dengan memasukkan IP server ke browser.

Hasil Dilihat Melalui Browser

Jika menggunakan cara tersebut, kita masih perlu melakukannya ke beberapa VPS yang lainnya.

Using Ansible

Di sini diasumsikan jika Ansible Master sudah dapat terkoneksi menuju Ansible Slave melalui koneksi SSH. Setelah itu langkah yang harus dilakukan adalah membuat file inventory dan playbook.

playbook.yml

---
- name: install and deploy portfolio
hosts: webservers
tasks:
- name: create web server directory
file:
path: /var/www/html
state: directory
mode: 0755
- name: deploy code from gitlab
git:
repo: "{{ git_repo }}"
accept_hostkey: yes
dest: /var/www/html/
- name: install apache2
apt:
name: apache2
state: latest
update_cache: yes
- name: start apache2
service:
name: apache2
state: started
enabled: yes

inventory

[webservers]
server1 git_repo="[isi_repo_git]"
server2 git_repo="[isi_repo_git]"
server3 git_repo="[isi_repo_git]"
server4 git_repo="[isi_repo_git]"
server5 git_repo="[isi_repo_git]"

Di sini saya membuat tampilan website yang sama dengan repository yang sama pula untuk ke-5 server yang akan dikonfig. Jika ingin menggunakan source code dari repository yang berbeda, maka bisa mengganti isi variabel git repo pada file inventory.

Contoh File Inventory

Setelah itu jalankan playbook menggunakan command:

ansible-playbook -i [nama_inventory] [nama_playbook]
Proses Konfigurasi Dijalankan Secara Otomatis oleh Ansible

Setelah itu, ketika dilakukan request terhadap ke-5 IP server maka hasilnya akan berhasil:

Hasil Request Terhadap 5 Server

Dan jika salah satunya di buka melalui browser maka akan muncul hasil yang sama:

Hasil Dilihat Melalui Browser

✏️ Kesimpulan

Kasus yang dialami Budi pada cerita di awal tulisan ini bisa jadi ada atau tidak ada di dunia nyata, tetapi yang jelas banyak kasus serupa dengan solusi serupa pula. Kasus tersebut seringkali dialami oleh para system administrator di dalam sebuah perusahaan. Dalam sebuah tim, sysadmin bertugas untuk melakukan konfigurasi dan deployment aplikasi ke dalam sebuah server. Jika sysadmin dapat menggunakan tool automasi seperti Ansible, maka pekerjaan sysadmin akan jauh lebih mudah dan sysadmin juga bisa fokus untuk hal-hal lain (mengadopsi teknologi baru misalnya).

Beberapa manfaat yang didapatkan ketika menggunakan Ansible yaitu:

  • Menghemat lebih banyak waktu. Hanya perlu satu kali membuat file konfigurasi dan dapat digunakan secara berkali-kali.
  • Dokumentasi konfigurasi infrastruktur lebih jelas. Semua konfigurasi yang dilakukan pada infrastruktur tertulis dalam baris kode (file yaml) sehingga memudahkan untuk sysadmin lain mengerti apa saja konfigurasi yang telah dilakukan pada infrastruktur.
  • Dapat menerapkan Version Control. Karena konfigurasi tersimpan dalam bentuk baris kode, dan apapun yang berbentuk teks dapat diterapkan version control, maka konfigurasi dalam infrastruktur juga dapat diterapkan version kontrol jika menggunakan Ansible.

Kamu tidak perlu menggunakan Ansible jika:

  • Sudah yakin jika seumur hidup hanya akan melakukan konfigurasi dan deployment aplikasi sebanyak satu atau dua kali saja. Kita tidak perlu belajar Ansible jika dalam kondisi seperti ini karena waktu yang dibutuhkan untuk mempelajari Ansible jauh lebih lama dibandingkan waktu untuk setup satu atau dua server saja.
  • Orang yang sangat rajin. Jika kamu merupakan orang yang sangat rajin untuk melakukan deployment secara manual ditambah dengan troubleshootingnya nanti maka kamu tidak perlu belajar Ansible.

Sebelum mempelajari Ansible ada baiknya untuk:

  • Memahami perintah dan konfigurasi dasar pada sistem operasi server (kebanyakan Linux).
  • Paham alur deployment aplikasi (jika ingin menggunakan Ansible sebagai deployment tool)

Tips untuk developer:

  • Pahami sedikit bagian saja mengenai Ansible dan gunakan Ansible Galaxy (roles yang sudah dibuat oleh orang lain).

Dengan mengadopsi Ansible (maupun tools automasi lainnya) secara tidak sadar sysadmin juga menerapkan konsep DRY (Don’t Repeat Yourself) pada dunia software development. Selain itu, jika sysadmin ingin mengadopsi budaya DevOps maka Ansible merupakan salah satu tool yang tepat untuk dikuasai.

About Me

Hai, Saya Josuanstya Lovdianchel, seorang bocah yang menyukai banyak bidang (generalist) dan masih berproses mencari jati dirinya. Beri clap 👏
jika kamu suka artikel ini.

Cheers!

--

--