Ansible: konfigurace, fakta, role

5. 9. 2013
Doba čtení: 5 minut

Sdílet

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:

bitcoin školení listopad 24

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.

Autor článku

David Karban je na volné noze. Dělá primárně to, co ho baví: administraci linuxových serverů pro menší a střední firmy.