Pravděpodobně už jste slyšeli o nástroji Puppet nebo Chef. Když se s nimi naučíte pracovat, ulehčíte si práci, kdykoliv potřebujete na servery cokoliv překonfigurovat, nainstalovat, apod. V principu oba fungují stejně. Na každém serveru vám běží agent, plus máte jeden master server, kde je uložená konfigurace. Agent si konfiguraci jednou za čas ověří a pokud pro něj nastala změna, tak ji aplikuje.
Tenhle přístup je skvělý na údržbu a instalace nového software. Problém je, pokud potřebujete na serverech provést nějakou ad-hoc akci. V tom vám Puppet ani Chef nepomůžou. Například postupný deploy nové verze aplikace na několik webových serverů tak, aby nedošlo k výpadku služby. Na deploy se pak používají další aplikace. To vede k tomu, že konfiguraci serverů máte nejméně ve dvou systémech. Ansible spojuje oba světy, umožňuje jak údržbu konfigurace, tak deploy aplikací.
Ansible staví na následujících principech:
- běh bez agentů – nastavení a deploy se provádí pomocí (masově paralelizovaného) SSH
- pro update konfigurace se používá push, ne pull
- snadno čitelná konfigurace (yaml soubory)
- snadné psaní nových modulů
Jedná se o příjemný minimalismus, na serverech nepotřebujete mít další běžící službu, přístup umožňuje SSH, které se také postará o zabezpečení komunikace. Ansible podporuje sudo, takže není nutné se připojovat jako root uživatel. Není potřeba mít nainstalovaný ruby stack, pokud nepracujete s ruby.
Instalace a základní konfigurace
V článcích budu používat aktuální verzi 1.2, kterou je možné přímo nainstalovat z EPEL repositáře. K dispozici jsou i balíčky pro další distribuce i PPA pro Ubuntu. Uživatele distribucí, pro které nejsou zkompilované balíky, určitě potěší, že tvůrci Ansible dělají vše pro to, aby byla instalace jednoduchá. Například u Debianu stačí v adresáři se zdrojovými soubory dát make debian
, který pro vás vytvoří .deb balíček. Možnosti instalace najdete na stránkách ansible.
Instalace je za námi, teď vytvoříme seznam serverů. Do souboru /etc/ansible/hosts
napište své servery, na každý řádek jeden server. Uveďte DNS název, nebo IP adresu. Nejjednodušší seznam může vypadat například takto (IP adresy mám v /etc/hosts
):
mujnotebook prvniserver.cz druhyserver.cz tretiserver.cz
Pro případ nestandardních konfigurací můžete dodat další parametry. Například Ansible spouštím ze svého notebooku, kde není potřeba se připojovat přes ssh, proto doplním ansible_connection=local
. Pokud bychom se na servery nechtěli připojovat jako root (což není konec konců špatný nápad), je možné Ansible říci, jakého uživatele má použít, dá se nastavit i nestandardní ssh port. Servery si také můžeme rozdělit do skupin:
mujnotebook ansible_connection=local [webservers] prvniserver.cz ansible_ssh_user=ansible ansible_ssh_port=5001 druhyserver.cz ansible_ssh_user=ansible [mysqlservers] tretiserver.cz ansible_ssh_user=ansible
Ad-hoc příklady
Nyní už můžeme posílat příkazy, například si můžeme zkontrolovat spojení se servery pomocí ansible all -m ping
.
~#ansible all -m ping mujnotebook | success >> { "changed": false, "ping": "pong" } prvniserver.cz | success >> { "changed": false, "ping": "pong" } druhyserver.cz | success >> { "changed": false, "ping": "pong" } tretiserver.cz | success >> { "changed": false, "ping": "pong" }
Ping je modul Ansible, který po úspěšném připojení na server odpoví „pong“. Moduly najdete v /usr/share/ansible
, je jich široká škála od nastavování ssh klíčů a povolení pro selinux, přes nastavení downtime pro servery v Nagiosu, až po správu cloudových instancí na Amazonu a Rackspace. Můžeme taky spustit konkrétní příkaz, například zjistit, jaká máme na serverech jádra:
~#ansible all -a "uname -r" mujnotebook | success | rc=0 >> 3.2.0-35-generic prvniserver.cz | success | rc=0 >> 2.6.32-042stab076.5 druhyserver.cz| success | rc=0 >> 2.6.32-042stab076.5 tretiserver.cz | success | rc=0 >> 2.6.32-358.6.1.el6.x86_64
Zkopírujeme na servery resolv.conf
, který máme připraven v /etc/ansible/resolv.conf
:
~#ansible webservers:mysqlservers -m copy -a "src=/etc/ansible/resolv.conf dest=/etc/resolv.conf mode=644 owner=root group=root" druhyserver.cz | success >> { "changed": false, "gid": 0, "group": "root", "mode": "0644", "owner": "root", "path": "/etc/resolv.conf", "size": 172, "state": "file", "uid": 0 } prvniserver.cz | success >> { "changed": false, "gid": 0, "group": "root", "mode": "0644", "owner": "root", "path": "/etc/resolv.conf", "size": 172, "state": "file", "uid": 0 } tretiserver.cz | success >> { "changed": false, "gid": 0, "group": "root", "mode": "0644", "owner": "root", "path": "/etc/resolv.conf", "size": 172, "state": "file", "uid": 0 }
Vidíme, že se servery dělají paralelně, pořadí ve výpisu je dáno rychlostí zpracování požadavku. Pokud uživatel Ansible potřebuje pro práci zadání hesla, musíte zadat parametr --ask-sudo-pass
( -K
). Můžete se také přepnout na jiného uživatelem než root, s pomocí parametru --sudo-user
( -U
).
Závěrem
V tomto článku jsme viděli základní mechanismy toho, jak Ansible funguje a ukázali jsme si několik základních operací. Příště popíšu, jak vytvořit konfiguraci pro jednotlivé servery, včetně využití informací o systému, použití templatů a zmíním koncept rolí, který umožňuje dekompozici konfigurace na menší logické celky.