Oficiální způsob instalace AWX je pomocí ansible playbooku, který nasadí AWX v dockeru. Instalační playbook je součástí git repozitáře projektu a nachází se v adresáři installer. Před instalací je potřeba nastavit různé proměnné v inventáři, poté už lze playbook spustit a počkat, než se AWX nainstaluje.
Setkal jsem se argumentem, že AWX je velice složitý software a že obyčejný smrtelník něco takového prostě nezvládne nakonfigurovat, a proto je třeba ho instalovat pomocí dockeru. Použití dockeru pro provozování aplikace jako je AWX mi nepřipadá úplně smysluplné, obzvláště když už v infrastruktuře máme Postgres i RabbitMQ. Jak AWX nainstalovat bez použití dockeru, se dozvíte právě v tomto článku. Nejdříve se ale podíváme na architekturu AWX.
AWX jako takové je aplikace napsaná v Pythonu a využívá framework Django a projekt Celery. Pomocí frameworku Django je napsaná většina aplikace a Celery se používá pro asynchronní zpracování požadavků mimo http request-response cyklus. Celery využívá pro transport zpráv tzv. message broker. Nejčastěji je používán s RabbitMQ, který je zároveň výchozí broker. Všechny akce přicházející z webového rozhraní jsou uloženy do fronty, ze které si je vyzvedne worker proces. Jakmile worker proces tyto akce vykoná, uloží výsledek zpět fronty, odkud jsou pak jiným procesem zapsány do databáze PostgreSQL a zároveň pomocí WebSocketu zaslány zpět klientovi.
AWX je rozděleno do několika procesů, z nichž každý vykonává jinou funkci:
- Celery – asynchronní zpracování požadavků pomocí fronty.
- Celery beat – pro periodické úlohy.
- Web – frontend v Djangu. Přijímá požadavky a ukládá je do fronty, odkud si je ke zpracování berou Worker procesy.
- Daphne – je HTTP, HTTP2 a WebSocket server, nad kterým je postaven Channels.
- Channels – pomáhá Djangu zpracovávat požadavky asynchronně skrze jeho synchronní jádro. Rozšiřuje tak Django o množství protokolů, které vyžadují dlouhodobé připojení (WebSocket, MQTT…).
- CBReciever – sbírá události zasílané callback pluginem z běžících Ansible tasků.
Z pohledu aplikačního software potřebuje AWX k životu následující komponenty:
- Nginx – HTTP reverzní proxy. Směřuje požadavky buď na Daphne, nebo na web komponentu.
- RabbitMQ – pro předávání zpráv mezi procesy. V případě že instalujeme cluster, je to právě tato komponenta, která nám clustering umožní.
- PostgreSQL – úložiště perzistentních dat.
- Memcached – lokální cache pro data z databáze.
Požadavky na hardware
- Minimum jsou 4GB RAM
- Alespoň 2 jádra
- Alespoň 20GB místa na disku pro soubory (cca do 1000 IOPS)
- Dodatečné místo pro databázi 20GB+ (zde rozhodně více než 1000 IOPS)
Uvedené parametry jsou vhodné na testování nebo pro správu menšího počtu strojů, pokud chcete s AWX spravovat větší počet strojů, je nutné navýšit i prostředky serveru. Bohužel nelze udělat tabulku, která by na základě počtu spravovaných strojů ukazovala požadavky na hardware. Není to možné z toho důvodu, že různé role kladou různé nároky na paměť a různé nároky na CPU. V praxi nám tedy nezbude nic jiného, než začít s nějakou rozumně „malou“ konfigurací a sledovat, kde je úzké hrdlo. Na základě toho pak konfiguraci můžete doladit pro vaše prostředí. V případě, že se chystáte spravovat rozsáhlejší prostředí a prostředky jednoho serveru nám nebudou stačit, budete muset AWX nasadit v clusteru. Clusteringu a celkově ladění výkonu se budu věnovat v některém z následujících článků.
Postup instalace
Postup instalace, tak jak jej v tomto článku uvádím, je vhodný pouze pro testovací účely. Instalace je pro maximální zjednodušení prováděna pod uživatelem root, s vypnutým SELinuxem (v produkci rozhodně nedoporučujeme!) a kde je to možné, je použita výchozí konfigurace. Pusťme se tedy do toho.
Vypneme SELinux v testovacím prostředí:
# setenforce 0 # sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config
Nastavení firewallu
# systemctl enable firewalld # systemctl start firewalld # firewall-cmd --add-service=http --permanent # firewall-cmd --reload
Instalace prerekvizit
Budeme potřebovat repozitář CentOS EPEL. Ten přidáme následujícím příkazem:
# yum install -y epel-release
Ještě přidáme repozitář PostgreSQL:
# yum install -y https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm
A nainstalujeme PostgreSQL server:
# yum install -y postgresql11-server
Instalace RabbitMQ:
# yum install -y https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm # yum install -y https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.10/rabbitmq-server-3.7.10-1.el7.noarch.rpm
Jak jsem již uváděl, pro účely tohoto návodu postačí výchozí konfigurace. Aby RabbitMQ ve výchozí konfiguraci naběhl, potřebuje mít záznam v DNS. Pro naše potřeby postačí záznam v /etc/hosts
. Pro vytvoření takového záznamu můžeme použít následující příkaz:
# echo $(hostname -I && hostname -s && hostname) >> /etc/hosts
Jako proxy server použijeme Nginx:
# yum install -y nginx wget # wget -O /etc/nginx/nginx.conf https://bitbucket.coreit.cz/projects/PUBLIC/repos/public-awx/raw/nginx.conf
A nakonec nainstalujeme Memcached:
# yum install -y memcached
Nyní máme v systému připraveny všechny potřebné komponenty a můžeme se konečně vrhnout do instalace samotného AWX.
Instalace Ansible AWX
Přidáme následující repozitář:
# wget -O /etc/yum.repos.d/awx-rpm.repo https://copr.fedorainfracloud.org/coprs/mrmeee/awx-dev/repo/epel-7/mrmeee-awx-dev-epel-7.repo
A nainstalujeme AWX:
# yum install -y awx
Dále budeme muset inicializovat PostgreSQL. Nejjednodušší způsob je použít setup skript, který je v CentOS k dispozici. Následující příkaz inicializuje PostgreSQL:
# /usr/pgsql-11/bin/postgresql-11-setup initdb
Spuštění všech potřebných služeb
Abychom mohli pokračovat v instalaci, bude zapotřebí nastartovat všechny služby, které jsme dosud instalovali. Služby také povolíme, aby nám naběhly po restartu.
# systemctl start memcached nginx rabbitmq-server postgresql-11 # systemctl enable memcached nginx rabbitmq-server postgresql-11
Nyní když PostgreSQL běží, můžeme vytvořit databázového uživatele a databázi, jejímž vlastníkem bude právě vytvořený uživatel:
# sudo -u postgres createuser awx # sudo -u postgres createdb -O awx awx
Hlášení o tom, že nemáme oprávnění na složku /root
je v pořádku, uživatel AWX ve složce /root
opravdu žádná oprávnění nemá.
Když máme hotovou databázi, můžeme v ní vytvořit potřebné struktury. S tím nám pomůže příkaz awx-manage
:
# sudo -u awx /opt/awx/bin/awx-manage migrate
To zabere pár minut.
Teď už jen vytvoříme základní konfiguraci AWX a máme téměř hotovo:
# echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'root@ $(hostname)', 'heslo')" | sudo -u awx /opt/awx/bin/awx-manage shellsystemctl enable firewalld # systemctl start firewalld # firewall-cmd --add-service=http --permanent # firewall-cmd --reloadte_preload_data # sudo -u awx /opt/awx/bin/awx-manage provision_instance --hostname=$(hostname) # sudo -u awx /opt/awx/bin/awx-manage register_queue --queuename=tower --hostnames=$(hostname)
Nastartujeme jednotlivé komponenty AWX a povolíme je po startu:
# systemctl start awx-cbreceiver.service awx-channels-worker.service awx-daphne.service awx-web.service awx-dispatcher.service # systemctl enable awx-cbreceiver.service awx-channels-worker.service awx-daphne.service awx-web.service awx-dispatcher.service
A konečně nastal čas vyzkoušet, jestli se nám instalace podařila. To ověříme jednoduše tím, že se do AWX přihlásíme. Do webového prohlížeče zadáme IP adresu serveru, na který jsme AWX nainstalovali.
Přihlašovací údaje jsou:
- USERNAME: admin
- PASSWORD: heslo
Po přihlášení nás přivítá prázdný dashboard.
AWX máme nainstalovaný a můžeme pustit do jeho nastavení. V příštím článku si ukážeme, co je potřeba k tomu, abychom v prostředí AWX mohli používat naše již hotové role, které máme napsané z doby, kdy jsme Ansible pouštěli výhradně z příkazové řádky.