References:
- https://github.com/ghuntley/dotfiles-nixos/
- https://github.com/tycho01/nix-config
- https://github.com/srid/nix-config
NixOS adalah distro linux, dimana semua paket / software / package
dan
konfigurasi / configuration
-nya didesain supaya immutable, artinya,
dalam 1 host bisa ada beberapa versi dari setiap paket, walaupun ketika
melakukan upgrade
. In contrast, distro lain seperti arch, centos, debian
setiap upgrade akan menghapus versi lama setiap paket.
Keuntungan dari imutabilitas ini kita bisa melakukan rollback
dari setiap
upgrade (generation
), dengan tradeoff bahwa kita juga harus membuat
konfigurasi setiap paket supaya mendekati immutable juga. Hal ini yang
sebenarnya ditempuh distro lain dengan ansible
atau salt
.
┌────────┐ ┌────────┐ ┌──────┐
│ centos │ + │ config │ + │ data │
└────────┘ └────────┘ └──────┘
Disini developer menginstall centos, lalu login dan membuat konfigurasi, dan
meng-import data jika ada. Disini semua mutable, artinya, perubahan dilakukan
dengan merubah install paket secara ad-hoc (yum install
), file konfigurasi
akan diedit secara ad-hoc juga dengan nano
/ vim
.
Seiring berjalannya waktu operasi, akan timbul perubahan versi OS, versi paket, kebutuhan penyesuian config, dll. Hal ini membuat maintenance membutuhkan banyak waktu dan tenaga.
┌─ansible──┐
│┌────────┐│ ┌────────┐ ┌──────┐
││ centos ││ + │ config │ + │ data │
│└────────┘│ └────────┘ └──────┘
└──────────┘
Disini developer menginstall centos, lalu menginstal paket tidak secara adhoc
tapi membuat role
dengan ansible. Hal ini akan mempermudah dan mempersingkat waktu
ketika upgrade OS.
┌─ansible──┐ ┌─ansible──┐
│┌────────┐│ │┌────────┐│ ┌──────┐
││ centos ││ + ││ config ││ + │ data │
│└────────┘│ │└────────┘│ └──────┘
└──────────┘ └──────────┘
Model ini maju selangkah lagi, konfigurasi disimpan dalam bentuk template
,
biasanya jinja
. Upgrade OS dan penyesuaian konfig lebih mudah di kemudian hari.
Jika dilihat dari 3 pola diatas, yang dilakukan sebenarnya adalah meminimalisasi
proses perubahan / mutation, karena ansible secara prinsip akan menjaga hasil akhir
produk supaya semirip mungkin dengan perubahan sebelummnya, walaupun OS / config
di dalamnya berubah
┌─nix───────────────────┐
┌────────┐ │┌──────────┐ ┌────────┐│ ┌──────┐
│ centos │ + ││ packages │+│ config ││ + │ data │
└────────┘ │└──────────┘ └────────┘│ └──────┘
└───────────────────────┘
Disini fungsi rpm
yang dibungkus ansible
diganti nix
, sehingga instalasi
paket dan config bisa immutable. Centos cukup diupgrade jika sudah ada versi baru,
tapi paket dan config selalu bisa diupdate dan di rollback
┌───────┐ ┌──────┐
│ nixos │ + │ data │
└───────┘ └──────┘
Disini ganti total pake NixOS. semua immutable, tentu terkecuali data. Jadi bisa
dikatakan, dalam bahasa yang sederhana, nixos
adalah integrasi OS + ansible.
Untuk penerapan continuous integration / continuous deployment di JogjaCamp,
dibutuhkan bootstrapping
berupa aplikasi / tooling
untuk mendukungnya, seperti
ansible
, testinfra
, buildbot
dan gitea
, dimana untuk membuatnya jika
harus menggunakan CI/CD juga, maka akan dibutuhkan ansible
di bawahnya lagi.
Ini seperti telur dan ayam, mana yang duluan
NixOS akan digunakan untuk membuat bootstrap
/ dasar untuk CI/CD tersebut, karena
sejak awal sudah immutable. Sehingga whole stack
akan mendekati imutabilitas,
sehingga tahan terhadap virus, apakagi di era Covid-19 saat ini.
TBD
Create VM, booting pake nixos live CD di sriwijaya. Buat password via console lalu SSH
# passwd nixos
# systemctl start sshd
Lalu SSH dan sudo, siapkan partisi
# parted /dev/xvda -- mklabel msdos
# parted /dev/xvda -- mkpart primary 1MiB -2GiB
# parted /dev/xvda -- mkpart primary linux-swap -2GiB 100%
Lalu instal nixos
# mkfs.ext4 -L nixos /dev/xvda1
# mkswap -L swap /dev/xvda2
# swapon /dev/xvda2
# mount /dev/disk/by-label/nixos /mnt
# nixos-generate-config --root /mnt
# nano /mnt/etc/nixos/configuration.nix
# nixos-install
# reboot