Hlavní navigace

Instalace AWX na CentOS 7: krok za krokem k automatizaci

Tomáš Heřmánek

V minulém článku jsme si ukázali, jaké další funkce AWX přináší k Ansible. Dnes se mu podíváme pod kapotu, a hlavně si krok po kroku ukážeme postup, jak AWX nainstalovat. Použijeme k tomu CentOS7

Doba čtení: 6 minut

Sdílet

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:

cif-tip-digitalizaceCR

  • 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.