NixOps – přímočarý deployment

Z Wikiknih

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:

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říkazem passwd a pak dvakrát potvrdíte heslo
  • 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
    • 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
  • 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 upravte targetHost (např. 192.168.122.120) a device (např. 450a00a2-2565-48f1-a526-b9188ffd06ab) - najdete ve fyzické konfiguraci cílového serveru tj. přihlaste se na něj pomocí ssh a zadejte cat /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
  • 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

Zapracovat[editovat | editovat zdroj]