PENDAHULUAN
Kenapa harus Ansible Role?
Ansible role mendeklarasikan struktur ansible playbook menggunakan role yang mengandung berbagai konfigurasi yang dibutuhkan bagi setiap server.
Bayangkan sebuah role sebagai sebuah server yang memiliki fungsionalitas dan jobs tersendiri, seperti loadbalancer, webserver, shared storage, database dan lain sebagainya.
Setiap role dibangun dengan cara mengkonfigurasi masing-masing server dan mengeksekusi berbagai macam perintah, hingga sebuah role bisa diimplementasikan ke dalam server.
Hal tersebut membutuhkan banyak waktu, apabila ingin mengkonfigurasi banyak server secara satu per satu. Oleh karena itu, Ansible role dibutuhkan untuk mempermudah automasi task tersebut.
STRUKTUR FOLDER
Struktur folder dibuat agar eksekusi role di playbook dapat mengambil fungsi dari task-task di bawah nya. Untuk membuat struktur folder dapat menggunakan dua cara. Pertama, adalah dengan cara mengeksekusi perintah pada linux cli atau menggunakan script python yang dapat diunduh di –> link.
Secara garis besar, struktur folder role akan terlihat seperti gambar di bawah ini:
Setiap folder memiliki tujuan spesifik:
- defaults: direktori defaults menyimpan default variable yang digunakan oleh role terkait
- files: berisi semua files yang ingin di-copy dari Ansible controller host ke mesin atau node yang lain\
- handlers: berisi tasks yang di-execute apabila diperlukan oleh tasks pada folder tasks
- templates: Sebuah template adalah file yang berisi semua parameter konfigurasi namun menggunakan dynamic value
- meta: apabila ada sebuah role dependency, hal tersebut dapat dideklarasikan pada folder meta
- tasks: direktori tasks berisi daftar tasks yang dibutuhkan oleh role. Tasks tersebut harus didefinisikan di dalam file main.yaml pada direktori tersebut
- vars: berisi semua variabel yang dibutuhkan oleh tasks yang didefinisikan di main.yaml file
- library: folder ini berisi deklarasi plugins atau module seperti kode Python dan lain sebagainya
Sebagai catatan, struktur tersebut bersifat best practice dan tidak semua direktori membutuhkan deklarasi main.yaml di dalamnya. Deklarasi main.yaml disesuaikan oleh kebutuhan settings dan konfigurasi pada role yang diinginkan.
STUDI KASUS: DEPLOY ROBUST WEB APPS INFRASTRUCTURE
Desain infrastruktur yang digunakan pada Web Apps, adalah desain yang mengedepankan fungsi high scalability. Pada desain infrastruktur tersebut setiap role diimplementasi kan pada satu server/virtual machine secara best practice. Adapun roles yang akan diimplementasikan adalah sebagai berikut:
- Loadbalancer server: Role yang berfungsi untuk distribusi request http/https ke backend servers yang dinamakan server worker.
- Worker server: adalah role yang berperan untuk memproses request http/https dari client. Role worker bisa terdiri dari 1 atau lebih server, tergantung kebutuhan yang diperlukan.
- Shared storage server: adalah role tempat web data disimpan. Role ini akan memanfaatkan fungsi NFS sebagai Network File System.
- Cached server: adalah role yang memanfaatkan teknik in-memory untuk penyimpanan/pengelolaan sessions.
- Database server: role untuk menyimpan database. pada role ini akan dibentuk hubungan master-slave dengan fungsi read-replica pada slave server.
- Query Load Balancer Server: role ini bertujuan untuk distribusi write dan read query pada ke database tujuan
Generate Playbook with Roles
Kita membutuhkan sebuah playbook sebelum memulai menulis kode ansible untuk deploy mass configuration server.
Anda dapat menggunakan kode python berikut untuk generate sebuah playbook dengan roles di dalamnya sesuai petunjuk penggunaan yang dijelaskan di dalam kode.
#!/usr/bin/env python
import os
import os.path
import sys
# - directory Skeleton
##production # inventory file for production servers
##stage # inventory file for stage environment
##group_vars/
## group1 # here we assign variables to particular groups
## group2 # ""
##host_vars/
## hostname1 # if systems need specific variables, put them here
## hostname2 # ""
##site.yml # master playbook
##webservers.yml # playbook for webserver tier
##dbservers.yml # playbook for dbserver tier
##roles/
## common/ # this hierarchy represents a "role"
## tasks/ #
## main.yml # <-- tasks file can include smaller files if warranted
## handlers/ #
## main.yml # <-- handlers file
## templates/ # <-- files for use with the template resource
## ntp.conf.j2 # <------- templates end in .j2
## files/ #
## bar.txt # <-- files for use with the copy resource
## foo.sh # <-- script files for use with the script resource
## vars/ #
## main.yml # <-- variables associated with this role
## defaults/ #
## main.yml # <-- default lower priority variables for this role
## meta/ #
## main.yml # <-- role dependencies
##
## webtier/ # same kind of structure as "common" was above, done for the webtier role
## monitoring/ # ""
## fooapp/ # ""
class Ansible:
rootPath = ""
roleName = ""
roleSubDirs = ['files', 'handlers', 'meta','templates','tasks','vars','defaults']
## constructor
def __init__(self, name, path):
self.rootPath = path
self.roleName = name
## function to create default skeleton
def execute(self):
self.createRolesSubdirectory()
self.createSiteFile()
self.createGroupVars()
self.createHostVars()
## function to create role subdirectory
## format: roles/<role name>/<subdir>
def createRolesSubdirectory(self):
for rolesubdir in self.roleSubDirs:
completeFilesPath = self.rootPath + "/roles/" + self.roleName + "/" + rolesubdir
if not os.path.exists(completeFilesPath):
os.makedirs(completeFilesPath)
## function to create site.yml
## format: site.yml
def createSiteFile(self):
fname = self.rootPath + "/site.yml"
if not os.path.exists(fname):
fhandle = open(fname, 'a')
fhandle.close()
## function to create stage files contains all the the testing hosts
def createStageFile(self):
fname = self.rootPath + "/stage"
if not os.path.exists(fname):
fhandle = open(fname, 'a')
fhandle.close()
## function to create Production files contains all the production hosts
def createProductionFile(self):
fname = self.rootPath + "/production"
if not os.path.exists(fname):
fhandle = open(fname, 'a')
fhandle.close()
## function to create group_vars directory
def createGroupVars(self):
dname = self.rootPath + "/group_vars/"
if not os.path.exists(dname):
os.makedirs(dname)
## function to create host_vars directoy
def createHostVars(self):
dname = self.rootPath + "/host_vars/"
if not os.path.exists(dname):
os.makedirs(dname)
## get argument
# 1. path
# 2. rolename
## example: ./generateAnsiblePlaybook.py ./playbook ntp
pathName = sys.argv[1]
roleName = sys.argv[2]
oAns = Ansible(roleName, pathName)
oAns.execute()
atau bisa dengan membuat susunan direktori secara manual dengan mengikuti langkah-langkah berikut:
1. Buat root directory untuk playbook ansible (contoh: ansible_playbook)
mkdir ~/ansible_playbook
cd ~/ansible_playbook
2. Buat direktori roles di dalam direktori playbook tadi
3. Di dalam direktori roles terdapat beberapa direktori yang diperlukan agar playbook bisa berjalan dengan seharusnya
cd ~/ansible_playbook/roles
mkdir -p <your role name>/{tasks,handlers,defaults,vars,templates}
Conclusion
Pada bagian ini kita telah mengetahui pentingnya ansible role untuk automasi mass deploy server.
Pada part selanjutnya, Kita akan membangun role yang dibutuhkan untuk DEPLOY ROBUST WEB APPS INFRASTRUCTURE
Leave a Reply