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.