NixOps – přímočarý deployment
Správné nastavení jednotlivých či spolupracujících serverových služeb je pracným a náročným úkolem, kde ani opakování „téhož“ postupu nemusí být bezbolestné. NixOps zbavuje proces nasazování nahodilostí uplatněním striktně deklarativního přístupu tj. veškerá nastavení musí být explicitně uvedena v konfiguračním souboru. Výhody z toho plynoucí jsou:
- rozpoznání mnohých chybných nastavení před jejich aplikací díky zabudované kontrole
- rychlá a identická opakovatelnost postupu
- automatizovatelnost nasazení
- nastavení lze verzovat a vracet se tak i k před lety používaným konfiguracím
- jednou odladěné nastavení lze aplikovat na libovolný počet strojů
NixOps je použitelný pro tyto virtualizované nebo fyzické zdroje:
- Amazon EC2
- Google Compute Engine
- Hetzner
- VirtualBox
- vpsFree.cz
- NixOS kontejnery
- a jakýkoliv stroj s NixOS
Samotný nástroj funguje na různých platformách, ale pro lepší praktické pochopení a integritu je vhodné použít NixOS. Jedná se o v základu minimalistickou linuxovou distribuci určenou pro servery, avšak stejně dobře poslouží jako moderní uživatelská stanice. Klíčovým je Nix - unikátní plně funkcionální a deklarativní správce balíčků, díky kterému je systém velmi stabilní, spolehlivý a dobře udržovatelný. Nejlépe je přesvědčit se praxí
Instalace NixOS
[editovat | editovat zdroj]Nutnou podmínkou je mít na co instalovat. Připravujeme si půdu pro deployment pomocí NixOps, tudíž ideální bude virtuální stroj dostupný více lidem. (existují nějaké hotové image např. VirtualBox?? + kolik RAM a HD?) Máme-li nějaký postupujme dle tohoto minimalistického návodu (#
na začátku řádku signalizuje, že pracujete jako root, běžného uživatele značí $
. Příznak není součástí příkazu):
- stáhněte si Minimal installation CD z https://nixos.org/nixos/download.html
- nahrajte jej do vašeho virtualizačního prostředí tak, aby bylo dostupné pro nabootování
- nabootujte virtuální stroj
- bude potřeba přístup na Internet. Pokud nastavení neobstarala virtualizace nebo DHCP, použijte
ifconfig
- nevyhovuje-li vám konzole vaší virtulizace spusťte
# systemctl start sshd
a připojte se pomocí ssh ze svého počítače. Přidělenou IP adresu zjistíte pomocí# ip a
. Ještě musíte nastavit heslo uživateli root, protože ssh přihlášení není bez hesla povolené. Provedete příkazempasswd
a pak dvakrát potvrdíte heslo
- bude potřeba přístup na Internet. Pokud nastavení neobstarala virtualizace nebo DHCP, použijte
- připravte disk k použití
- rozdělte jej pomocí fdisku
# fdisk /dev/sda
- zmáčkněte klávesu
n
– vytvoří novou oblast - všechny následující výzvy potvrďte klávesou
Enter
- zmáčknutí klávesy
w
provede zápis a ukončí fdisk
- zmáčkněte klávesu
- vytvořte logické disky (LVM). Vystačíme si sice s jedním, ale zajistíme si flexibilitu pro případné změny
# pvcreate /dev/sda1
# vgcreate MyVolGroup /dev/sda1
# lvcreate -l 100%FREE --name root MyVolGroup
- disk naformátujte
# mkfs.ext4 -L nixos /dev/MyVolGroup/root
- a připojte
# mount /dev/MyVolGroup/root /mnt
- rozdělte jej pomocí fdisku
- nechte vygenerovat inicializační konfiguraci
# nixos-generate-config --root /mnt
- a upravte parametry dle potřeb svým oblíbeným editorem (vim, nano, ..). Seznam parametrů viz. web
# vim /mnt/etc/nixos/configuration.nix
- určitě nezapomeňte na následující parametry (znakem
#
začínají poznámky, řádek ukončuje;
)
boot.loader.grub.device = "/dev/sda";
networking.hostName = "nixops";
time.timeZone = "Europe/Amsterdam";
- jaký doplňkový software (je nějaký seznam, co je nainstalováno v základu??) bude nainstalován určíte následovně. Je to návrh, rozhodně však nepřehlédněte položku pro NixOps!
- Důležitá poznámka. Pokud nějaký parametr vyžaduje instalaci odpovídajícího SW, není třeba jej uvádět explicitně tj. povolením ssh (viz. níže) bude OpenSSH nainstalováno a spuštěno jako služba
- Seznam dostupných balíčků viz. web
environment.systemPackages = with pkgs; [
htop
lynx
nixops
screen
vim
wget
];
- patrně se budete chtít na váš deploy server připojovat pomocí ssh a zároveň mít server zabezpečený – přihlašovat se výhradně pomocí ssh klíče (předvoleno). Nastavte tedy
services.openssh.enable = true;
users.extraUsers.root.openssh.authorizedKeys.keys = [
"<klíč_správce_1>"
"<klíč_správce_2>"
];
- spusťte instalci. V jejím závěru budete vyzváni k zadání hesla pro uživatele root (vyžadují se dva shodné pokusy)
# nixos-install
- a restartujte
# reboot
- pokus o znovupřipojení pomocí ssh se nejspíš nezdaří, protože instalace změnila identifikaci stroje (ve výpisu uvidíte
REMOTE HOST IDENTIFICATION HAS CHANGED
). Řešením je vymazání posledního řádku v souboru~/.ssh/known_hosts
- pokud marně zadáváte heslo, pak jste se zapomněli přihlásit pomocí klíče. Příkaz upravte dle vzoru
ssh -i ~/.ssh/<váš_privátní_klíč> root@<IP_adresa_stroje>
Máme nainstalováno včetně NixOps, je čas vrhnout se na první deploy.
Deployment - cvičení
[editovat | editovat zdroj]Dejme si za cíl nainstalovat Apache s upravenou výchozí stránkou a e-mailem na webmaster@otevrenamesta.cz pro případ výskytu chyby.
Nutným předpokladem je opět mít nějaké zdroje, na které budeme instalovat. Pro jednoduchost předpokládejme síťově dostupný stroj s rozběhnutým NixOS - viz. předchozí návod s touto odchylkou v nastavení OpenSSH (nastavení pro jednoduchost povolujete ssh přihlášení heslem, což nixops deploy
využije při svém prvním běhu a zároveň vygeneruje vlastní ssh klíče, jenž bude napříště používat):
services.openssh.enable = true;
services.openssh.permitRootLogin = "yes";
NixOps (shodně s NixOS) rozlišuje mezi konfigurací logickou (= jaký a jak nastavený SW) a fyzickou (= na jakém a jak nastaveném HW). Nasazení požadovaného na různé cíle např. lokální virtuálku a produkční Amazon je tak velmi efektivní a není důvod ke kompromisům při oddělování vývojového, testovacího a produkčního prostředí.
(chybí tu vytvoření uživatele, ať to nedělá všechno root. Je lepší společný účet nebo sada individuálních??)
Postup:
[editovat | editovat zdroj]- vytvoříme soubor
web-log.nix
na nějakém vhodném místě, třeba složce../deployment/cviceni/
s tímto obsahem
{
network.description = "Cvičení - web server";
webserver =
{ config, pkgs, ... }:
{ services.httpd.enable = true;
services.httpd.adminAddr = "webmaster@otevrenamesta.cz";
services.httpd.documentRoot = "${pkgs.valgrind.doc}/share/doc/valgrind/html";
networking.firewall.allowedTCPPorts = [ 80 ];
};
}
- tamtéž pak
web-fyz.nix
a v něm dle vaší situace upravtetargetHost
(např. 192.168.122.120) adevice
(např. 450a00a2-2565-48f1-a526-b9188ffd06ab) - najdete ve fyzické konfiguraci cílového serveru tj. přihlaste se na něj pomocí ssh a zadejtecat /etc/nixos/hardware-configuration.nix
{
webserver =
{ config, pkgs, ... }:
{ deployment.targetHost = "<IP_cílového_stroje>";
boot.loader.grub.device = "/dev/sda";
fileSystems."/" =
{ device = "/dev/disk/by-uuid/<UUID_vašeho_disku>";
fsType = "ext4";
};
};
}
- jsme-li ve složce "cviceni" vytvoříme deployment pojmenovaný "cviceni" (typickými názvy jsou např. vyvoj, test, produkce, ..)
$ nixops create ./web-log.nix ./web-fyz.nix -d cviceni
- úspěšné vykonání vypíše UUID deploymentu
- kontrolní výpis provedete jako
$ nixops list
- stav konkrétního deploymentu prozradí
$ nixops info -d cviceni
- spustíme deploy
$ nixops deploy -d cviceni
- máme hotovo a web server běží na zvolené adrese.
- stav může zkontrolovat již uvedeným
nixops info
- terminál otevřeme takto (NixOps totiž vytváří unikátní pár ssh klíčů pro každý nový stroj a následujícím příkazem správný použije)
$ nixops ssh -d cviceni webserver
- dostupnost webu zkontrolujete zadáním <IP_cílového_stroje> do internetového prohlížeče, chybový stav (ověřujeme, zda byl nastaven e-mail) vyvoláte zápisem neexistující stránky tedy <IP_cílového_stroje>/nic
- stav může zkontrolovat již uvedeným
- změny provedené v konfiguraci (souborech
*.nix
) promítneme opětovným spuštěním deploy. Zajímá-li nás potřebný čas, pak takto$ time nixops deploy -d cviceni
- pokud se již cvičit nepotřebujete a chcete po sobě uklidit (odstraňuje stroj, nikoliv deployment)
$ nixops destroy -d cviceni