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:

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

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

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

  • 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