Práce s Image je dost důležitá a mít správnou strategii je v této oblasti velmi vhodné. O těchto přístupech už jsem psal. V každém případě je ideální, aby příprava image nebyla manuální operace, tedy něco, co znamená, že když to potřebuji udělat znova či aktualizovat, musím se podívat do svých poznámek a snažit se kroky zopakovat. Je velmi pravděpodobné, že udělám chybu a výsledky nebudou konzistentní. Vytváření image bude lepší automatizovat. Chtěl bych nástroj, který vezme startovací OS, dohraje do něj co je potřeba (skriptem, Ansiblem, Chefem, …) a pak to zmrazí ve formě image a to třeba nad různými podvozky (VirtualBox, VMware, OpenStack, Amazon, …). A to je přesně nástroj Packer, o kterém neslyšíte poprvé.
Praktický příklad
Rád bych doplnil příklad, který jsem použil v našem labu. Potřebuji tam mít připravený image s Docker nástroji, aby ho návštěvníci labu měli k dispozici (nemusí si nic stahovat, instalovat, čekat, zvolí hotový obraz). Nechci to ale dělat pokaždé znovu s novějšími verzemi. Mám to ale o trochu komplikovanější tím, že v labu je http proxy.
Packer je na to ideální. Předpis, který používám, vypadá takhle:
{ "builders": [{ "type": "openstack", "ssh_username": "ubuntu", "image_name": "Docker", "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.12", "floating_ip_pool": "ext-net" }], "provisioners": [{ "type": "shell", "inline": [ "export http_proxy=http://xxx.com:8088", "export https_proxy=http://xxx.com:8088", "sudo -E apt-get update", "sudo -E curl -sSL https://get.docker.com/ | sh", "sudo -E usermod -aG docker ubuntu", "sudo -E wget https://github.com/docker/machine/releases/download/v0.5.4/docker-machine_linux-amd64 -O /usr/local/bin/docker-machine", "sudo -E chmod +x /usr/local/bin/docker-machine", "sudo -E wget https://github.com/docker/compose/releases/download/1.5.2/docker-compose-Linux-x86_64 -O /usr/local/bin/docker-compose", "sudo -E chmod +x /usr/local/bin/docker-compose", "sudo mkdir /etc/systemd/system/docker.service.d", "printf 'export http_proxy=http://xxx.com:8088\n' | sudo tee -a /etc/default/docker", "printf 'http_proxy=http://xxx.com:8088\n' | sudo tee -a /etc/environment", "printf 'https_proxy=http://xxx.com:8088\n' | sudo tee -a /etc/environment", "printf 'no_proxy=localhost,10.0.0.7,16.21.188.203\n' | sudo tee -a /etc/environment", "printf 'Defaults env_keep = http_proxy\n' | sudo tee -a /etc/sudoers" ] }] }
Co se tam děje? Nejprve vezme výchozí Ubuntu image. Pak spustím skript, který začíná nastavení http proxy. Provedeme instalaci Dockeru, docker-machine i docker-compose. Nakonec zapíšeme informace o proxy do /etc/environment souboru. Klasické přesměrování výstupu z echo do souboru nefunguje se sudo (což potřebujeme), takže používám printf (to je z důvodu, aby se s jistotou vložil i znak konce řádku, který je zde explicitně definován jako \n) a pipou posíláme do tee (v režimu přidávání do souboru) spuštěné jako sudo.
Pokud bych přidal další buildery, mohu takový image automatizovaně vytvářet pro různé platformy. Navíc když chci novější Dockeru, jednoduše spustím Packer znova a pokud chci novější docker-machine, změním v Packer předpisu číslo verze (v URL) na novější. Po chvilce se nový image objeví v mém Helion OpenStack image repository…nebo třeba v Amazonu či Azuru.