Hlavní navigace

Ansible: konfigurace, fakta, role

David Karban

V předchozím článku jsme se seznámili se způsobem, jak Ansible použít k spuštění příkazu paralelně na mnoha serverech. To je samo o sobě užitečné například pro provedení aktualizací, ale není to moc užitečné pro správu instalovaného software. Dnes si ukážeme, jak zapsat a aplikovat konfiguraci serverů.

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.

Našli jste v článku chybu?

8. 9. 2013 7:56

Jo, to bude zhruba to, co jsem myslel. Akorát teda s tím, že v Puppetu i Saltu mám facter (v Saltu grains, pil-lar), takže zadarmo, bez toho abych něco řešil, můžu něco spustit třeba na všech serverech, jejichž IP začíná na "10.1".

Díky moc za všechny odpovědi na otázky.

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

DigiZone.cz: Placené VoD a obsah zdarma

Placené VoD a obsah zdarma

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: Dreambox DM900 Ultra HD přichází

Dreambox DM900 Ultra HD přichází

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu