Ansible: konfigurace, fakta, role

David Karban 5. 9. 2013

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:

widgety

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?
Vitalia.cz: Tahák, jak vyzrát nad zápachem z úst

Tahák, jak vyzrát nad zápachem z úst

Lupa.cz: Jak se prodává firma za miliardu?

Jak se prodává firma za miliardu?

Vitalia.cz: Opuncie je plod kaktusu. Pozor na trny

Opuncie je plod kaktusu. Pozor na trny

Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje

Lupa.cz: Jak levné procesory změnily svět?

Jak levné procesory změnily svět?

DigiZone.cz: Nova opět stahuje „milionáře“

Nova opět stahuje „milionáře“

DigiZone.cz: Ginx TV: pořad o počítačových hráčích

Ginx TV: pořad o počítačových hráčích

Vitalia.cz: dTest odhalil ten nejlepší kečup

dTest odhalil ten nejlepší kečup

Podnikatel.cz: Byla finanční manažerka, teď cvičí jógu

Byla finanční manažerka, teď cvičí jógu

DigiZone.cz: Rapl: seriál, který vás smíří s ČT

Rapl: seriál, který vás smíří s ČT

DigiZone.cz: Koncesionářské poplatky pro RTVS

Koncesionářské poplatky pro RTVS

Vitalia.cz: Když všichni seli řepku, on vsadil na dýně

Když všichni seli řepku, on vsadil na dýně

Vitalia.cz: Jak Ondra o astma přišel

Jak Ondra o astma přišel

Vitalia.cz: 5 pravidel proti infekci močových cest

5 pravidel proti infekci močových cest

Vitalia.cz: Voda z Vltavy před a po úpravě na pitnou

Voda z Vltavy před a po úpravě na pitnou

Vitalia.cz: Kterou dýni můžete jíst za syrova?

Kterou dýni můžete jíst za syrova?

120na80.cz: Co je padesátkrát sladší než cukr?

Co je padesátkrát sladší než cukr?

120na80.cz: Hrbatá prsa aneb mýty o implantátech

Hrbatá prsa aneb mýty o implantátech

Vitalia.cz: Test dětských svačinek: Tyhle ne!

Test dětských svačinek: Tyhle ne!

DigiZone.cz: Mordparta: trochu podchlazený 87. revír

Mordparta: trochu podchlazený 87. revír