Nechcete se omezovat prostředím, ale bojíte se nekonzistencí? Použijte Packer – vybudujete konzistentním způsobem diskové obrazy vašich systémů či aplikací s výstupem pro všechna vaše prostředí – třeba Vagrant developerů, vSphere v tradičním IT, OpenStack s KVM v moderním IT, veřejný cloud typu Amazon nebo Azure či Docker kontejnery v agilní DevOps orientované části vašeho IT. A to nejlepší? Je to open source.
Immutable servers a golden image
O strategiích pro používání diskových obrazů jsme už na cloudsvět psali. Připomeňme, že jedna z moderních možností představuje zakonzervované servery, tedy princip, kdy automatizovaným způsobem vytvoříme cílový diskový obraz s aplikací a tento zmrazíme a používáme jako hotové zamčené servery. Aplikace a operační systém jsou nedotknutelné a stav systému (data, logy apod.) drží v externím systému (databáze, logger apod.).
Možná ale zatím dáváte přednost tradičnímu pohledu na diskový obraz – tedy chcete nějakou image představující prostředí (OS s nainstalovanými balíčky apod.). I v tom případě dává Packer obrovský smysl. Proč? Používat ve svém IT jediné prostředí je drahé a nepřináší optimální výsledky. Pro tradičnější IT možná používáte vSphere, máte zainvestováno a je to dobře ozkoušené. Pro modernější IT bude dávat smysl sáhnou po OpenStack IaaS s tím, že třeba v produkčním prostředí pod ním použijete mix vSphere a KVM, zatímco v testovacím prostředí to bude jen KVM (cenové výhody jsou velmi zásadní). Vývojáři možná kromě toho budou chtít využít Vagrant s VirtualBox. A proč nevyužít public cloud tam, de vám to bude dávat smysl? Třeba pomoci si se zdroji pro náročně end-to-end testování na konci vývojového sprintu nebo dát webové servery do cloudu – třeba do Amazonu. Mít schopnost automatizovaně vytvořit diskové obrazy pro všechny tyto platformy (tzn. zajistit, že byť jsou tato infrastrukturní prostředí velmi odlišná, diskové obrazy budou vytvářeny naprosto stejně) je klíčem k úspěchu.
Builders – vytváření obrazů pro různé platformy
Prvním krokem v Packeru je definice Builderů. V jednom projektu (obrazu) jich můžete kombinovat hned několik, takže jedním procesem vytvoříte image pro různé platformy. Packer podporuje VMware, QEMU/KVM a VirtualBox co se týče “lokálních” hypervisorů. Dále umožňuje připravovat image v IaaS ať už on premise (OpenStack) nebo ve veřejném cloudu (Amazon, Google Compute Engine nebo DigitalOcean). Typicky zvolíte nějaký startovací bod – může to být hotový image s holým OS, ale v některých variantách klidně i instalátor. Packeru můžete říct i to, co má v grafickém instalátoru naťukat (ESC, TAB apod.), takže můžete automatizovat i instalaci nějaké virtuální appliance, které vyžaduje interaktivní odpovědi. Packer tedy začne ze základního image, něco s ním udělá (což si řekneme v části Provisioners) a uloží jako výsledný obraz. Za zmínku stojí i možnost pracovat s Docker kontejnery. Chcete-li se pustit do této technologie doporučuji PaaS Cloud Foundry nebo alespoň orchestraci typu Kubernetes nebo Docker Swarn… nicméně Packer může posloužit pro pozvolný přechod do nové éry tím, že vybuduje kontejner stejně jako image pro VM (což není ideální přístup ke kontejnerům, ale budou situace, kdy se to hodí).
Provisioners – ze základního OS do kompletního image
Celé kouzlo Packeru je v tom, že nad základním obrazem v různých prostředí spustí konzistentní proces “dotažení” obrazu. Může to být například jednoduchý shell skript a to buď přímo v cílové stanici (Packer nakopíruje shell soubor a spustí ho tam) nebo lokálně. Pro Windows OS je podporován PowerShell. Dají se také kopírovat soubory. Pro pokročilejší operace je vhodné použít mini-varianty oblíbených configuration management nástrojů. Podporovaný je Ansible (přímo v cílové VM se spustí váš playbook), Chef-solo nebo Chef-client, Puppet masterless či server nebo Salt. Můžete si napsat i svůj Provisioner.
Post-processors – zabalíme, odešleme
Pro vybraná infrastrukturní prostředí jsme nastartovali základní image, spustili provisioning a výsledek zamrazili. U některých variant nám to bude stačit. Výslednou image najdeme ve svém OpenStack nebo Amazon připravenou k použití nebo jako hotový soubor (např. QCOW2 pro KVM nebo VMDK pro VMware). V některých případech ale budeme chtít s výsledkem dál pracovat.
Jednou z možností je zabalit vše do archivu. Také můžete uploadovat soubor do vašeho vSphere clusteru nebo připravit Vagrant prostředí. Pokročilé možnosti zahrnují například i schopnost extrahovat z hotové VM nějaký artefakt (třeba výsledkem vašeho snažení má být JAR soubor, který z VM chcete dostat ven). Pokud děláte Docker image můžete ho naimportovat do Docker prostředí.
Jak to vypadá?
Chcete malý příklad? Packer předpis je v JSON formátu a je docela dobře lidsky čitelný:
{ "builders": [{ "type": "openstack", "ssh_username": "ubuntu", "image_name": "mujPackerImage", "source_image": "8490e531-6c9d-4caa-8e15-61e5f749b0ff", "flavor": "m1.small", "networks": ["b830b33d-06fc-470a-aa12-ec4e709ef3c4"], "use_floating_ip": true, "floating_ip": "10.201.0.10", "floating_ip_pool": "ext-net" }], "provisioners": [{ "type": "shell", "inline": [ "export http_proxy=http://web-proxy.corp.hp.com:8088", "sudo -E apt-get update", "sudo -E apt-get install nginx -y", "printf 'Web server zabaleny Packerem\n\n' | sudo tee /usr/share/nginx/html/index.html" ] }] }
A co to píše když to spustíte?
tomas@labserver:~/packer$ packer build packer_web.json openstack output will be in this color. ==> openstack: Discovering enabled extensions... ==> openstack: Loading flavor: m1.small openstack: Verified flavor. ID: d9422513-43c2-4212-97c7-759ba0d66cd9 ==> openstack: Creating temporary keypair for this instance... ==> openstack: Launching server... openstack: Server ID: 150862d4-91ae-48ac-a02b-8c1890a4e690 ==> openstack: Waiting for server to become ready... ==> openstack: Associating floating IP with server... openstack: IP: 10.201.0.10 openstack: Added floating IP 10.201.0.10 to instance! ==> openstack: Waiting for SSH to become available... ==> openstack: Connected to SSH! ==> openstack: Provisioning with shell script: /tmp/packer-shell133305692 openstack: sudo: unable to resolve host mujpackerimage openstack: Ign http://nova.clouds.archive.ubuntu.com trusty InRelease openstack: Get:1 http://nova.clouds.archive.ubuntu.com trusty-updates InRelease [64.4 kB] openstack: Get:2 http://security.ubuntu.com trusty-security InRelease [64.4 kB] ... openstack: Processing triggers for libc-bin (2.19-0ubuntu6.6) ... openstack: sudo: unable to resolve host mujpackerimage openstack: Web server zabaleny Packerem openstack: ==> openstack: Stopping server... openstack: Waiting for server to stop... ==> openstack: Creating the image: mujPackerImage openstack: Image: 802e0ee9-58fb-4a38-843f-7866b2db95a6 ==> openstack: Waiting for image to become ready... ==> openstack: Terminating the source server... ==> openstack: Deleting temporary keypair... Build 'openstack' finished. ==> Builds finished. The artifacts of successful builds are: --> openstack: An image was created: 802e0ee9-58fb-4a38-843f-7866b2db95a6