Rychlý úvod do YAML
Ansible používá pro ukládání konfigurace jazyk YAML, datově orientovaný značkovací (markup) jazyk. Soubory v tomto formátu jsou dobře čitelné pro lidi a jsou vhodné i pro strojové zpracování. Základními vlastnostmi jazyka jsou:
- dokument začíná znaky ‚---‘
- jako oddělovač se používá výhradně mezera
- bloky jsou definovány odsazením
- sekce začíná znakem ‚-‘
Jednoduchý dokument může vypadat takto:
--- - hosts: webservers:mysqlservers sudo: yes tasks: - name: nastaveni resolv.conf copy: src=/etc/ansible/resolv.conf dest=/etc/resolv.conf mode=644 owner=root group=root
Jedná se o poslední příklad z předchozího dílu, jen přepsaný do YAML. Vidíme sekci hosts a podsekci name. V sekci hosts jsou definovány parametry sudo a tasks. V tasks je jeden příkaz, kopii resolv.conf na servery.
Scénáře a hry
Soubor s konfigurací kroků se u Ansible zve scénář (playbook), krok ve scénáři je hra (play). Hry se přehrávají jedna za druhou, pomocí utility ansible-playbook.Následující scénář nainstaluje na webservery httpd, upraví jeho konfiguraci a provede deploy aplikace z git repositáře.
# /etc/ansible/site.yml --- - hosts: webservers user: ansible sudo: yes vars: http_port: 80 tasks: - name: zajistuji instalaci httpd a git yum: pkg={{ item }} state=installed with_items: - httpd - git - name: zapisuji apache konfiguraci template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf notify: - restart httpd - name: kontroluji, jestli apache bezi service: name=httpd state=started - name: nahravam web z repositare git: repo=http://github.com/davidkarban/simplewebpage.git dest=/var/www/html/ handlers: - name: restart httpd service: name=httpd state=restarted
Rozeberme si scénář krok za krokem. Jako první definujeme skupinu serverů, v tomto případě webservers
. Pro přístup na servery použijeme uživatele ansible a pro vykonání požadavků sudo.
--- - hosts: webservers user: ansible sudo: yes
Nadefinujeme proměnou http_port
s hodnotou 80. Proměnná se použije v šabloně konfigurace httpd.
vars: http_port: 80
Sekce tasks obsahuje jednotlivé akce. Schéma je jednoduché, vždy začíná s name
, následuje modul a případné další podmínky a notifikace. Zde dojde k instalaci balíčků httpd a git pomocí yum. Abychom nemuseli dělat pro každý balíček samostatnou sekci, použijeme pole.
tasks: - name: zajistuji instalaci httpd a git yum: pkg={{ item }} state=installed with_items: - httpd - git
Nahrajeme na servery soubor httpd.conf.j2, který je šablona v Jinja2 formátu. V našem jednoduchém případě se liší od distribučního httpd.conf v řádku s direktivou Listen: Listen {{ http_port }}
. Po nahrání konfigurace zajistíme, aby httpd běžel a nahrajeme z gitu aktuální verzi aplikace. Soubor httpd.conf.j2 je uveden s relativní cestou, automaticky se bude hledat v /etc/ansible/
.
- name: zapisuji apache konfiguraci template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf notify: - restart httpd - name: kontroluji, jestli apache bezi service: name=httpd state=started - name: nahravam web z repositare git: repo=http://github.com/davidkarban/simplewebpage.git dest=/var/www/html/
Poslední sekce, definuje handler. Jedná se o běžný task, který se ale spouští pouze na vyžádání pomocí notify
. Příklad spuštění vidíme po zápisu httpd.conf. Po něm je část notify volající handler. Notify se vyvolá jen, pokud byl soubor httpd.conf změněn.
handlers: - name: restart httpd service: name=httpd state=restarted
Je čas náš scénář pustit:
$ ansible-playbook main.yml PLAY [webservers] ************************************************************* GATHERING FACTS *************************************************************** ok: [prvniserver.cz] ok: [druhyserver.cz] TASK: [zajistuji instalaci httpd a git] *************************************** changed: [prvniserver.cz] => (item=httpd,git) changed: [druhyserver.cz] => (item=httpd,git) TASK: [zapisuji apache konfiguraci] ******************************************* changed: [druhyserver.cz] changed: [prvniserver.cz] TASK: [kontroluji, jestli apache bezi] **************************************** changed: [druhyserver.cz] changed: [prvniserver.cz] TASK: [nahravam web z repositare] ********************************************* changed: [prvniserver.cz] changed: [druhyserver.cz] NOTIFIED: [restart httpd] ***************************************************** changed: [prvniserver.cz] changed: [druhyserver.cz] PLAY RECAP ******************************************************************** druhyserver.cz : ok=6 changed=5 unreachable=0 failed=0 prvniserver.cz : ok=6 changed=5 unreachable=0 failed=0
Scénář se aplikoval na prvniserver.cz a druhyserver.cz, tj. na skupinu webservers. Jednotlivé tasky se provádějí popořadě a vypisuje se stav průběhu. Pokud by nastala chyba, tak se pro daný server vykonávání přeruší a doběhnou ostatní. Na konci je souhrnná statistika běhu, ve které vidíte, že nastalo 6 akcí, bylo provedeno 5 změn na serverech, bez chyby. Od této chvíle je konfigurace dalšího webserveru tak jednoduchá jako je dodání jeho hostname do /etc/ansible/hosts a opětovné spuštění playbooku.
Fakta a šablony
Mnoho scénářů potřebuje pro svou práci údaje ze serveru, tzv. fakta. Když se podíváme na průběh scénáře, tak fakta jsou první věc, kterou si ansible ze serverů zjistí. Je možné je vypsat zvlášť pomocí modulu setup: ansible druhyserver.cz -m setup
. Mezi fakta patří například použité IP adresy, síťová rozhraní, čas na serveru, je-li server virtualizován a pod jakou virtualizací a další. Fakta se dají použít jak ve scénářích, tak v šablonách. Pro získání fakt jde použít i facter od Puppetu, nebo Ohai od Chefu.
Pro šablony se používá knihovna Jinja2, napsaná v Pythonu. Krom substituce proměnných podporuje i cykly a podmínky, její syntaxi je nejlépe načíst si přímo z jejího webu.
Role
Ve scénářích je možné provádět include dalších her z jiných konfiguračních souborů, čímž dokážete jednotlivé scénáře rozdělit na menší části. Od verze 1.2 jsou možnosti dekompozice ještě výraznější, přibyla možnost použít role. S jejich pomocí můžeme rozdělit konfigurace do menších logických celků. Každá role může mít vlastní proměnné a handlery. Pokud bychom nastavení webserveru v předchozím příkladu abstrahovali do role, pak by nám v site.yml zbylo následující:
--- - hosts: webservers roles: - apache
V /etc/ansible by nám přibyla následující adresářová struktura:
apache/ files/ templates/ tasks/ handlers/ vars/
V ní by byly jednotlivé části našeho scénáře logicky rozděleny, task sekce do tasks/main.yml, šablony do templates/ a podobně. Více o rolích a jejich praktickém využití se dozvíme v dalším díle miniseriálu.
Závěrem
V dnešním díle jsme si ukázali, jak v Ansible vytvořit scénář pro deploy jednoduché aplikace na servery. V příštím dílu se podíváme na složitější použití rolí a naučíme se delegovat části scénáře na jiné servery.