Ansible + Nette — git, composer a tagování

Jak jsem slíbil na konci minulého dílu, dneska se podíváme trošku blíž na to, jak udělat deployment lepší. Přidáme si deploy z gitu a nasadíme instalaci závislostí.

Jako příklad dnes budeme deployovat nette-quickstart. Ještě než se pustíme do úpravy našeho playbooku, tak si uděláme úpravu v inventáři. Předáme si instalační cestu parametrem.

[webservers]
webserver1 ansible_connection=local install_dir=/tmp/nette_app

Jak můžete vidět, místo adresy mám nastaveno ansible_connection=local, což znamená, že se vše provádí přímo na localhostu (je to jednodušší pro testování). Navíc jsem nastavil, že pro webserver1 bude install_dir /tmp/nette_app, což pak můžu odlišit pro další, které bych přidal. Cest jak předat proměnnou je více, v průběhu si jich určitě ukážeme víc.

Co se týče testování, dá se jednoduše nastavit deploy do Vagrantu, kde už máte stejnou mašinu jako třeba na produkci.

Teď už k samotnému playbooku. Jak jsem nadhodil, budeme deployovat přímo z gitu. Takže jako první by bylo dobré zajistit, aby git byl na cílové mašině nainstalován.

- name: git installed
apt: state=present name=git
when: ansible_distribution in ['Debian', 'Ubuntu']

Jak jde vidět, použil jsem podmínku pokud je daný OS buď Debian, nebo Ubuntu (protože na mém localhostu, což je MacOS X, apt nenajdu). Jak jsem zmiňoval minule, tak Ansible obsahuje mnoho takových proměnných (faktů) o daném OS (např. ip adresa, hostname, distribuce, architektura či environment proměnné). Pokud bychom chtěli vidět všechny, pak na to máme modul setup. Stačí tedy spustit:

ansible webservers -i production -m setup

Což nám vypíše celý seznam. Popřípadě můžeme ještě vyfiltrovat to, co nás zajímá a to skrze přepínač -a

ansible webservers -i production -m setup -a ‘filter=ansible_distribution’

Dále přidáme naklonování daného repozitáře.

- name: clone destination exists
file: state=directory path={{ install_dir }}
- name: repository i cloned
git: repo=https://github.com/nette/tutorial-quickstart.git
dest={{ install_dir }}
recursive=yes
register: git_result
tags: deploy

První zajistíme, že adresář, kam budeme klonovat, existuje. Navíc jsme si naklonování označili tagem deploy. Přirozeně nemá smysl kontrolovat, že je git nainstalován, a že adresář pro klonování existuje při každém deployi.

Skrze tagy můžeme v Ansiblu filtrovat tasky/playbooky, které se mají spustit. Tedy když při spouštění Ansiblu uvedeme přepínač -t deploy, spustí se jen task, který má tag deploy, tedy naklonování.

Dále provedeme kontrolu, že adresáře log a temp/cache jsou zapisovatelné, což už jsme psali v minulém díle, takže to nebudu nějak extra popisovat.

A poslední co nám zbývá je nainstalovat composer balíčky. První zajistíme, že je composer přítomný a poté balíčky nainstalujeme.

- name: download and install composer into the target directory.
get_url:
url=https://getcomposer.org/composer.phar
dest=/tmp/composer
mode=0755
- name: install composer packages
command: /tmp/composer install
args:
chdir: “{{ install_dir }}”
when: git_result.changed
tags: deploy

První nám stáhne composer.phar a přidá mu práva. Druhý pak zavolá composer install skrze modul command. Ansible má built-in balíček pro práci s composerem, ale z nějakého důvodu nefungoval. Za povšimnutí ještě stojí, že balíčky instalujeme, pokud se nám něco v gitu změnilo.

Výsledek můžeme spustit stejně jako v předchozím díle, protože jsme si nechali jak playbook, tak inventář na tom samém místě.

Celý kód k nahlédnutí zde

To bychom měli deploy přímo z gitu i s composerem. Ještě než skončím, zastavím se u konfigurace Ansiblu. Pomocí konfiguračních souborů můžeme například říct, jaký je výchozí inventář, nebo nastavit cache pro získávání informací o serverech. Konfigurací je vlastně ini soubor, rozdělený do sekcí. Ansible se postupně kouká do následujících lokací (v daném pořadí):

  • ANSIBLE_CONFIG (environment proměnná)
  • ansible.cfg (v aktuální složce)
  • .ansible.cfg (v home složce)
  • /etc/ansible/ansible.cfg

Vytvoříme si tedy soubor ansible.cfg přímo u našeho projektu a hodíme do něj následující

[defaults]
inventory=production
[ssh_connection]
pipelining=True

První říká, že pokud není specifikovaný inventář, použije production. Druhý pak souvisí s nastavením SSH jak ho Ansible používá a díky zapnutí pipeliningu se nám zrychlí provádění tasku na serveru.

To by bylo pro dnešní díl vše, příště se podíváme na to, jak zvýšit míru znovupoužitelnosti našich playbooků tím, že si uděláme oddělené role, a taky jak generovat konfiguraci.

Written by

#Python #AWS #Angular #Autoprop

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store