Available 24×7

Mon → Sun : 00:01am-11:59pm

Email: [email protected]

Facebook

Twitter

LinkedIn

Youtube

Instagram


Deploy Mass Configuration with Ansible Role – Part 1

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 loadbalancerwebservershared storagedatabase 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 roleTasks 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 serveradalah role tempat web data disimpan. Role ini akan memanfaatkan fungsi NFS sebagai Network File System.
  • Cached serveradalah 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 Serverrole 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

Your email address will not be published. Required fields are marked *