Ngulik CloudNgulik Linux

Ubuntu Patch Management Menggunakan Ansible

Sistem Administrator bertangung jawab untuk melakukan patching sistem operasi Linux yang dalam contoh kasus ini ekosistem yang dikelola oleh Sistem Administor yaitu menggunakan Ubuntu. Sebagai amana di ketahui untuk pathing ini adalah pekerjaan yang akan menyita waktu jika server yang Ana kelola banyak. Untuk melakukan patching satu server, Sistem Administrator perlu mengidentifikasi bahwa update tersedia lalu jika tersedia maka mendownload dan menginstal pembaharuan. Pada lingkungan lebih luas yitu contohnya di lingkungan perusahaan, mungkin terdapat puluhan atau ratusan server yang di kelola dan menbutuhkan update. Sehingga pekerjaan patching ini akan menyita waktu dan mungkin bisa terjadi kesalahan update atau bahwakan kegagalan booting. Maka perlu dilakukan otomatisasi agar perkerjaan patching ini menjadi lebih efektif dan efesien.

Sebelum mepelajari bagaimana patch management dan automation dijalankan maka perlu Anda ketahui dahulu cara manual yang biasanya dilakukan untuk melakukan update Ubuntu. Karena masih banyak yang belum memahi perbedaan dan konsep dasar seperti cara kerja apt update, apt upgrade ataupun dist-upgrade

# sudah apt update

Apt update ini berfungsi memperbaharui daftar sumber paket (source.list) untuk mendapatkan daftar terbaru dari paket yang tersedia di repositori. perintah ini berguna untuk mendapatkan info tentang versi terbaru dari paket atau dependensinya.

Pada saat Anda melakukan update maka terdapat 3 variabel yaitu

 

Hit berarti harus memeriksa cap waktu pada daftar paket, yang cocok dan tidak ada perubahan.

Ign berarti tidak ada perubahan pada file indeks pdiff, itu tidak akan repot-repot mengunduhnya lagi.

Get berarti untuk memeriksa cap waktu pada daftar paket, ada perubahan dan akan diunduh.

# sudah apt upgrade

Setelah melakukan update yang berfung untuk memperbarui daftar paket yang bisa di perbaharui. Lalu apt upgrade berfungsi untuk meninstall upgrade yang tersedia dari semua paket yang diinstal pada sistem oprenrasi ubuntu melalui file sources.list. Paket baru akan dinstal jika diperlukan untuk memenuhi depedensi, tetapi paket yang ada tidak akan dihapus.

Untuk mengerahui pada saja yang di upgrade maka Anda dapat melihat list upgradeable nya terlebih dahulu dengan command sudo apt list –upgradeable

 

Lalu untuk melakukan upgrade sebuat list yang upgradeable bisa langsung jalankan command sudo apt upgrade 

Gambar dibawah yaitu proses konfirmasi kembali untuk paket baru yang di install dan proses download paket baru yang tersedia

 

proses selanjutnya ketika upgrade yaitu unpacking dan installing new new package version

 

Jika terdapat service yang di restart maka terdapat pilihan ingin autorestart atau perlu konfirmasi dahulu. seperti contoh service ssh

 

lalu proses upgrade akan selesai

 

Versi kernel sebelum upgrade
4.15.0-23-generic

Versi kernel setelah upgrade
4.15.0-153-generic

Namun perlu jadi catatan agar menggunakan kernel baru setelah upgrade maka perlu dilakukan reboot server terlebih dahulu.

Setelah mengetahui pemahaman dasar mengenai patching atau update/upgrade pada ubuntu, maka kita bisa mulai ke pembahasan selanjutnya yaitu patch yang di manage dan di automisasi.

Apa itu Patch Management?

Sistem Administrator perlu memahi pentingnya melakukan patching pada sistem operasi dan khususnya pada pembahasan kali ini yaitu Ubuntu. Sistem Administrator dapat dengan mudah melakukan update/upgrade secara manual, tetapi ini jika dapat dilakukan management otomisasi tentu akan menajadi lebih mudah dan dapat menghindari kesalahan. Dengan patch management ini, Sistem Administrator dapat menentukan update/upgrade ubuntu secara bersamaan dan terpusat serta dapat dengan mudah menambahkan parameter-parameter tambahan ketika update/upgrade itu sendiri. Contoh melakukan pengecualian paket yang tidak perlu di upgrade serta menentukan skipping update pada server dengan status service database atau web server sedang running.

Mengapa Manajemen Patch Penting?

Server Public yang belum di dipaching merupakan critical issue terhadap cybersecurity, tapi cybersecurity bukan satu-satunya asalah untuk Anda melakukan update/upgrade Ubuntu. Patch server juga dapat memperbaiki issue seperti driver dan service yang running di Ubuntu.

Semakin lama Sistem Administrator menunda untuk melakukan update/upgrade, semakin banyak list packet yang tentu perlu di patch. Masalah ini meningkatkan waktu yang diperlukan untuk sepenuhnya melakukan patching sistem operasi Ubuntu. 

Mengapa harus menggunakan Automasi?

Seperti yang dijelakan sebelumnya, jika Anda hanya melakukan update/upgrade untuk beberapa server maka itu hal yang mudah namun jika Anda perlu melakukan update/upgrade untuk puluhan ataupun ratusan server maka sudah tidak mungkin dikerjakan secara manual. Untuk tools automation yang digunakan pada panduan ini yaitu menggunakan ansible.

Apa itu Ansible?

Ansible merupakan salah satu tools automation yang tidak memerlukan agent karena Ansible melakukan management node dengan koneksi SSH. Ansible hanya membutuhkan 1 server sebagai management node untuk push perintah ke semua node yang terdapat pada inventory. Ansible lebih mudah dan praktis dibandingkan dengan management tool lainya seperti puppet karena tidak membutuhkan agent pada setiap node , hanya mengunakan koneksi ssh.

Demo Ubuntu Patch Management Menggunakan Ansible

 

Dalam simulasi ini menggunakan 6 server yang mana server pertama sebagai Control Node dan host 1-5 sebagai Managed Node

Instalasi Ansible

Sebelum instalasi ansibe maka Anda perlu mengetahui beberapa instatilah sebagai berikut

Control Node : Server dimana ansible di install

Manage Node : Semua inftrastuktur yang di kontorl oleh Control Node

Inventory : Daftar dari Manage Node

Playbook : Daftar command / perintah yang ditulis dalam format YAML

Karena ansbile bersifat agentless maka Anda hanya perlu menginstal service ansible pada server yang ditentukan sebagai control node

First, refresh your system’s package index with:

Pertama, refresh index system package dengan command

$ sudo apt update

Install Ansible

$ sudo apt install ansible

Setting Inventory File

Inventory file berisi informasi tentang host yang akan di manage oleh control Node. Anda dapat menyertakan dimana saja dari satu hinga ratusan server dalam inventory file dan host dapat diatatur kedalam group dan subgroup.

Bukalah file dengan hak akses root dengan menggunakan command berikut:

$ sudo vi /etc/ansible/hosts

contoh

[webserver]
web1 ansible_host=192.168.1.15 ansible_port=69
web2 ansible_host=DonHosts-2
web3 ansible_host=DonHosts-3[dbserver]
db1 ansible_host=DonHosts-4
db2 ansible_host=DonHosts-5 ansible_ssh_pass=P@ssw0rd[all:vars]
ansible_python_interpreter=/usr/bin/python3

Anda juga dapat mendeklarasikan connection, user dan password semua user dengan variabel yang telah ditentukan. ContohPada contoh penulisan inventory di atas dapat dilihat untuk daftar host bisa tulis menggunakan IP server ataupun dengan hostname dengan catatan apabila dengan hostname maka harap dipastikan terlebih dahulu hostname tersebut resolve dari control node, Anda bisa test dengan ping nama hostname nya. Selain itu jika port ssh host yang tidak menggunakan port default (port 22) maka Anda juga bisa mendeklarasikan port ssh nya di inventory dengan parameter ansible_port=69 dimana 69 Adalah contoh port ssh untuk server web1. 

[all:vars]
ansible_connection=ssh
ansible_user=master
ansible_ssh_pass=vagrant

Yang artinya semua koneksi ssh menggunakan user master dan password P@ssw0rd. Untuk selain server db2 yang tidak dideklarasikan password artinya dari control node sudah bisa ssh terhubung dengan managed node menggunakan sshid. 

Untuk melakukan ssh tanpa password yaitu dengan menggunakan ssh-copy-id, berikut panduanya :

ssh-keygen

Dengan menjalankan command ssh-keygen artinya Anda melakukan generate private key yang akan tersimpan si /home/user/.ssh/id_rsa

 

Selanjtunya salin Public key ke host yang akan diremote. Gunakan commmand

ssh-copy-id remoteusername@IP/Hostname

 

Kemudian, akan muncul permintaan untuk kata sandi perangkat remote. Setelah autentikasi berhasil, kunci publik SSH yang dihasilkan akan ditambahkan ke file authorized_keys perangkat remote. Setelah Anda menambahkan entri, koneksi akan otomatis ditutup. Untuk selanjutnya anda hanya perlu ssh remote_username@IP/hostname tanpa input password lagi

Apabila Anda telah mengkonfigurasi inventory host maka Anda dapat cek daftar inventory yang dimiliki dengan command

$ ansible-inventory –list -y

 

Setelah melakukan konfigurasi inventory maka Anda dapat melakukan verifikasi apakah Ansible dapat terhubung ke setiap server yang sudah ada di list inventory melalui ssh melalui command

$ ansible all -m ping -u root

 

Jika control node sudah bisa terhubung ke host yang ada di inventory maka akan mendapat response pong sedangkan jika gagal terhubung maka akan ada error contohnya incorect password atau permission denied maka Anda perlu melakukan pengecekan kembali agar control node bisa terhubung kesemua managed node

Untuk melakukan verifikasi ini Anda juga bisa menentukan host/hostgroup nya secara langsung

 

Playbook Ubuntu Patch

Setelah melakukan konfigurasi inventory maka Anda pelu melakukan konfigurasi playbook. Ansible Playbooks menawarkan manajemen konfigurasi sederhana yang dapat diulang, dapat digunakan kembali, dan sistem penerapan multi-mesin, yang sangat cocok untuk menerapkan aplikasi yang kompleks.

Playbook ini ditulis dalam bahasa yang sederhana dan mudah difahami yaitu YML,  Sehingga kita tidak sulit untuk mempelajari bahasa baru untuk menjalankan ansible karena bahasa YML juga digunkaan untuk konfigurasi kubernetes, intio service mesh atau docker compose.

Berikut contoh playbook yang digunakan untuk patch ubuntu

 


#### Ansible Playbook to perform Kernel Patching on Ubuntu Servers ####- hosts: all
become: yes
become_user: roottasks:- name: Task 1 – verify web/database processes are not running
shell: if ps -eaf | egrep ‘apache|http|nginx|mysql|postgresql|mariadb’|grep -v grep > /dev/null ;then echo ‘process_running’;else echo ‘process_not_running’;fi
ignore_errors: true
register: app_process_check- name: Task 2 – decision point to start patching
fail: msg=”{{ inventory_hostname }} have running Application. Please stop the application processes first, then attempt patching.”
when: app_process_check.stdout == “process_running”- name: Task 3 – upgrade kernel package on Ubuntu server
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
name: linux-image-generic
state: latest
when: app_process_check.stdout == “process_not_running” and ansible_distribution == ‘Ubuntu’
register: apt_update- name: Update apt repo and package cache
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600- name: Upgrade all packages
apt:
upgrade: dist
force_apt_get: yes- name: Check if a reboot is needed on all servers
register: reboot_required_file_existence
stat: path=/var/run/reboot-required get_md5=no– name: Reboot servers if kernel is updated
reboot:
msg: “Rebooting the servers after applying Kernel Updates”
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file_existence.stat.exists– name: Task 4 – pause for 180 secs
pause:
minutes: 3– name: Task 5 – check if all the systems responding to ssh
local_action:
module: wait_for
host={{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}
port=22
search_regex=OpenSSH
delay=15
timeout=300
state=started

> untuk setiap pembuatan YML file tentunya harus diawali dengan dash 3x

Task 1 -> verify web/database processes are not running

Disini kita memverifikasi bahwa jika layanan Webservice atau database berjalan di host client, kita tidak akan menganggap sistem itu sebagai bagian dari proses patch. Normalnya disarankan untuk menghentikan critical service sebelum Anda melakukan upgrade system. Jika Anda tidak ingin menempatkan kondisi ini, Anda dapat mengecualikan task 1 & 2 dan memodifikasi tugas 3 & 4 yang sesuai (dengan menghapus salah satu when condition).

Task 2 -> What if web/database processes are running on the servers

Task selanjutnya akan dibatalkan pada host dengan status webservice dan database running

Task 3 -> upgrade kernel package on Ubuntu server

Task ini akan mulai memutakhirkan kernel pada server Ubuntu di mana aplikasi di atas tidak berjalan. Kita telah menggunakan beberapa parameter apt modul di sini.

update_cache=yes –> Jalankan perintah yang setara apt-get update di semua server.

force_apt_get=yes -> force menggunakan apt-get instead of aptitude.

cache_valid_time=3600 -> Perbarui cache apt jika lebih lama dari cache_valid_time (dalam detik). Kami menyetelnya ke 3600 detik.

Task 4 -> Periksa apakah reboot diperlukan setelah pembaruan kernel di server Ubuntu

Task ini akan memeriksa persyaratan reboot pada server Ubuntu setelah Kernel update dengan memverifikasi keberadaan /var/run/reboot-required file. Kita menyimpan hasil keluaran stat modul yang akan kita gunakan untuk memutuskan me-reboot server nanti.

Task 5 -> Reboot sistem Ubuntu jika kernel diperbarui dan reboot diperlukan

Task ini akan menginstruksikan Ansible untuk me-reboot sistem Ubuntu jika kernel diperbarui dan reboot diperlukan. Dalam tasl ini saya menggunakan reboot modul Ansible untuk memulai proses reboot. Sehingga Anda memahami kedua cara untuk melakukan task ini.

connect_timeout -> Maksimum detik untuk menunggu koneksi yang berhasil ke host yang dikelola sebelum mencoba lagi.

reboot_timeout -> Detik maksimum untuk menunggu mesin melakukan boot ulang dan merespons perintah pengujian.

pre_reboot_delay -> Detik untuk menunggu sebelum reboot.

post_reboot_delay -> Beberapa detik untuk menunggu setelah perintah reboot berhasil sebelum mencoba memvalidasi sistem yang berhasil di-boot ulang.

test_command -> Perintah untuk dijalankan pada host yang rebot untuk menentukan server siap untuk task selanjutnya.

Task 6 -> jeda selama 180 detik 

Task ini adalah menunggu selama 3 menit agar server running setelah reboot. di sini kita menggunakan pause modul Ansible . Ini menjeda eksekusi playbook untuk waktu yang ditentukan, atau hingga prompt diakui.

Kita seting agar dapat menggunakan ctrl+c jika Anda ingin memajukan jeda lebih awal dari yang ditetapkan sebelum 3 menit atau jika Anda perlu membatalkan playbook sepenuhnya. Untuk melanjutkan lebih awal tekan ctrl+clalu C. Untuk membatalkan playbook, tekan ctrl+c lalu A.

Task 7 -> periksa apakah semua sistem merespons SSH

Task ini akan memastikan bahwa setelah jeda 3 menit, sistem dapat diakses melalui SSH. Di sini kita menggunakan local_actionmodul. Saat kita menggunakan modul ini, Ansible akan menjalankan modul yang disebutkan di bawahnya pada node controller. Modul di sini adalah wait_for.

Menjalankan Patch Ubuntu menggunakan Ansible

Setelah Ansible di install, inventory ditentukan dan playbook dikonfigurasi maka saatnya untuk melakukan patch ubuntu.

Sebelum melakukan patch maka dapat dilakukan pengecekan versi kernel OS dan uptime nya

$ sudo ansible all -m shell -a “uname -r” -b

 

$ sudo ansible all -m shell -a “uptime” -b

 

Lalu jalankan playbook dengan command

$ sudo ansible-playbook update.yml

 

Beirkut penjelasan gambar diatas

  • Task 2 untuk web3 dan db2 terpantau service web/db nya running sehingga tidak lanjut ke step selanjutnya
  • Task 3 db1 web2 dan web1 telah melewat verifikasi service web/db sehingga dijalankan ke proses update dan upgrade
  • Task 4 telah dilakukan update dan upgrade dan dilakukan verifikasi apakah terdapat /var/run/reboot-required maka dilakukan reboot
  • Task 5 status  web1 db1 dan web2 statusnya changed yang artinya server tersebut memerlukan reboot
  • Taks 6 dilakukan jeda 3 menit untuk penyelesaikan proses reboot pada server web1 web2 dan db1. Anda dapat memilih opsi “Continue Early” ataupun “Abort” proses jeda.
  • Task 7 yaitu mengkonfirmasi bahwa setelah semua tugas dijalankan dan server reboot dapat diakses kembali melalui SSH.

Cek kembali versi kernel dan uptime setelah dilakukan patch

 

Dari gambar diatas dapat dilahat bahwa versi kernel dari web1, web2 dan db1 telah berubah dan dari command uptime pun terlihat bahwa server server running atau mengalami reboot 9 menit yang lalu.

Selanjutnya mari kita jalankan kembali playbook setelah stop service web/db pada server web3 dan db2. Untuk stop service ini sebetulnya bisa juga dilakukan melalui command ansible AdHoc dengan command

$ sudo ansible web3 -m shell -a “service nginx stop” -b

 

$ sudo ansible db2 -m shell -a “service mysql stop” -b

 

Lalu jalankan kembali playbook untuk update nya

$ sudo ansible-playbook update.yml

 

Beirkut penjelasan gambar diatas

  • Task 2 untuk web1, web2 dan db1 terpantau service web/db nya running sehingga tidak lanjut ke step selanjutnya
  • Task 3 web3 dan db2 telah melewat verifikasi service web/db sehingga dijalankan ke proses update dan upgrade
  • Task 4 telah dilakukan update dan upgrade dan dilakukan verifikasi apakah terdapat /var/run/reboot-required maka dilakukan reboot
  • Task 5 status  web3 terdapat /var/run/reboot-required yang menyebabkan server perlu reboot dan untuk server db2 tidak diperlukan reboot. 
  • Taks 6 dilakukan jeda 3 menit untuk penyelesaikan proses reboot pada server web1 web2 dan db1. Anda dapat memilih opsi “Continue Early” ataupun “Abort” proses jeda.
  • Task 7 yaitu mengkonfirmasi bahwa setelah semua tugas dijalankan dan server reboot dapat diakses kembali melalui SSH.

Cek kembali versi kernel dan uptime setelah dilakukan patch

Mari kita buktikan dengan hasil command uname -r untuk cek kernel version dan uptime

 

Dapat dilihat bahwa kernel version web3 telah terupdate dan mengalami reboot sehingga uptime 8 menit sedangkan db2 karena sudah update maka uptime nya di 3 jam.

Update ALL packages menngunakan disk-upgrade

Pada playbook ini adalah optional, jika memang Anda membutuhkan disk-upgrade maka dapat menggunakan playbook ini. Berikut sedikit penjelasan perbedaan antara upgrade dan dist-upgrade

1) apt-get upgrade

Penrintah apt-get upgrade atau apt upgrade digunakan untuk memutakhirkan software packages yang diinstall saat ini ke versi terbaru mereka dengan tidak menghapus paket sebelumnya. Jika pemutakhiran paket memerlukan penghapusan atau penginstalan paket tambahan, pemutakiran paket yang diinstall akan dilewati dan paket tetap dalam versi saat ini.

2) apt-get dist-upgrade

Selain memutakhirkan software packages yang sudah ada, disk-upgrade ini akan menginstall dan menghapus beberapa paket untuk memenuhi beberapa dependensi. Perintah tersebut mencakup fitur smart conflict resolution yang memastikan bahwa paket-paket penting ditingkankan terlebih dahulu dengan mengorbankan paket-paket yang dianggap prioritas rendah.

Konfigurasi dist-upgrade.yml


– name: Updating all packages on Ubuntu / Debian Linux Servers
hosts: dbserver
become: true
become_user: root
tasks:
– name: Update apt repo and package cache
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600– name: Upgrade all packages
apt:
upgrade: dist
force_apt_get: yes

 

– name: Check if a reboot is needed on all servers
register: reboot_required_file_existence
stat: path=/var/run/reboot-required get_md5=no

– name: Reboot servers if kernel is updated
reboot:
msg: “Rebooting the servers after applying Kernel Updates”
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file_existence.stat.exists

– name: check if all the systems responding to ssh
local_action:
module: wait_for
host={{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}
port=22
search_regex=OpenSSH
delay=15
timeout=300
state=started

dalam playbook diatas terdapat parameter hosts: dbserver yang artinya semua task di jalankan terhadap host yang masuk di hostgroup dbserver yaitu db1 dan db2 serta tanpa proses checking service web/db 

dari hasil running playbook terpantau host db1 dan db2 tidak membutuhkan reboot karena memang sebelumnya pun telah dilakukan upgrade yang mana terjadi reboot. Sebulnya untuk task dist-upgrade ini dapat di kombinasikan dengan tas sebelumnya dan itu bisa dikonfigurasi sesuai kebutuhan.

Leave a Response