Bienvenue dans le monde de Packer! Ce guide d'introduction vous montrera ce qu'est Packer, expliquera son existence, les avantages qu'il offre et expliquera comment l'utiliser. Si vous connaissez déjà Packer, la documentation officielle fournit davantage de références pour toutes les fonctionnalités disponibles.
Packer est un outil open source permettant de créer des images d'ordinateur identiques pour plusieurs plates-formes à partir d'une configuration à source unique. Packer est léger, fonctionne sur tous les systèmes d'exploitation principaux et est très performant en créant des images de machine pour plusieurs plates-formes en parallèle.
Packer ne remplace pas la gestion de la configuration comme Ansibe, Chef ou Puppet. En fait, lors de la création d'images, Packer peut utiliser des outils tels que les outils cités précédemment pour installer un logiciel sur l'image.
Une image est une unité statique unique qui contient un système d'exploitation pré-configuré et des logiciels installés utilisés pour créer rapidement de nouvelles machines en cours d'exécution.
Les formats d'image de machine changent pour chaque plate-forme.
Certains exemples incluent les AMI pour EC2, les fichiers VMDK / VMX pour VMware, les exportations OVF pour VirtualBox, etc.
Les images de machine précuites présentent de nombreux avantages, mais la plupart n’ont pas pu en tirer parti, car elles étaient trop fastidieuses pour être créées et gérées. Il n’existait aucun outil permettant d’automatiser la création d’images de machine, ou bien la courbe d’apprentissage était trop longue. Le résultat est que, avant Packer, la création d’images menaçait l’agilité des équipes d’exploitation et n’était donc pas utilisée, en dépit des avantages énormes qu’elle offre.
Packer change tout cela. Packer est facile à utiliser et automatise la création de tout type d’image de machine. Il englobe la gestion de configuration moderne en vous encourageant à utiliser un cadre tel que Ansible, Chef ou Puppet pour installer et configurer le logiciel dans vos images créées par Packer.
En d'autres termes : Packer introduit des images précuites dans la modernité, libérant ainsi un potentiel inexploité et ouvrant de nouvelles opportunités.
Déploiement d'infrastructure ultra rapide. Les images de Packer vous permettent de lancer des machines entièrement provisionnées et configurées en quelques secondes, au lieu de plusieurs minutes ou heures. Cela profite non seulement à la production, mais également au développement, car les machines virtuelles de développement peuvent également être lancées en quelques secondes, sans attendre un temps de provisionnement généralement beaucoup plus long.
Portabilité multi-fournisseur. Comme Packer crée des images identiques pour plusieurs plates-formes, vous pouvez exécuter la “production” dans AWS, la “recette” / “qualité” dans un cloud privé tel qu'OpenStack et le “développement” dans des solutions de virtualisation de postes de travail telles que VMware ou VirtualBox. Chaque environnement exécute une image d'ordinateur identique, offrant une portabilité ultime.
Amélioration de la stabilité. Packer installe et configure tous les logiciels pour une machine au moment de la création de l'image. S'il y a des bugs dans ces scripts, ils seront détectés tôt, plutôt que plusieurs minutes après le lancement d'une machine.
Une plus grande testabilité. Une fois qu'une image machine est construite, cette image machine peut être rapidement lancée et testée pour vérifier que tout fonctionne bien. S'ils le sont, vous pouvez être assuré que les autres machines lancées à partir de cette image fonctionneront correctement.
Packer facilite grandement l'exploitation avec tous ces avantages.
Packer peut être installé des manières suivantes :
Pour installer le binaire précompilé, téléchargez le package approprié pour votre système. Packer est actuellement packagé sous forme de fichier zip.
Ensuite, décompressez le package téléchargé dans un répertoire où Packer sera installé. Sur les systèmes Unix, “~/packer” ou “/usr/local/packer” est généralement utilisé, selon que vous souhaitez limiter l'installation à votre utilisateur ou l'installer à l'échelle du système.
Aucun fichier supplémentaire n'est requis pour exécuter Packer.
Après avoir décompressé le package, le répertoire doit contenir un seul programme binaire appelé packer. La dernière étape de l’installation consiste à vérifier que le répertoire dans lequel vous avez installé Packer se trouve sur PATH.
Pour compiler à partir des sources, vous devez avoir installé et configuré correctement Go, ainsi qu’une copie de git dans votre PATH.
Clonez le référentiel Packer de GitHub dans votre GOPATH:
$ mkdir -p $ (go env GOPATH) /src/github.com/hashicorp && cd $ _ $ git clone https://github.com/hashicorp/packer.git $ cd packer
Construisez Packer pour votre système actuel et insérez le binaire dans ./bin/ (par rapport à git checkout).
La cible “make dev” n’est qu’un raccourci permettant de compiler le programme de compression uniquement pour votre environnement de construction local (pas de cibles compilées de manière croisée).
$ make dev
Après l’installation de Packer, vérifiez que l’installation a bien fonctionné en ouvrant une nouvelle invite de commande ou console et en vérifiant que cette opération est disponible:
$ packer usage: packer [--version] [--help] <command> [<args>] Available commands are: build build image(s) from template fix fixes templates from old versions of packer inspect see components of a template validate check that a template is valid version Prints the Packer version
Il existe une poignée de termes utilisés dans la documentation de Packer dont le sens peut ne pas être immédiatement évident si vous n'avez pas utilisé Packer auparavant. Heureusement, il y en a relativement peu. Cette section documente toute la terminologie requise pour comprendre et utiliser Packer.
La terminologie est dans l'ordre alphabétique pour un référencement rapide.
La box sera constituée à partir d’une ISO Linux que nous spécifierons par son URL sur le site de l’éditeur/communautés. Nous donnerons un fichier de “preseed” ou “kickstart” qui permettra de configurer l’installation.
Dans l'exemple suivant, nous allons réaliser une image “debian 8” sur virtualbox.
Pour cela, nous devons créer un dossier quelque part sur notre ordinateur, disons “~/monbuild”.
# mkdir monbuild # cd monbuild
Nous allons créer l'arborescence suivante dans notre dossier “monbuild”:
--- | |- http | |- preseed-jessie.cfg => Fichier de réponse (preseed) pour debian |- scripts | |- update.sh | |- vagrant.sh | |- vboxadditions.sh | |- cleanup.sh | |- debian-jessie.cfg => Template JSON passer en paramètre au binaire Packer
Note:
Le répertoire “scripts” est facultatif. dans notre template JSON nous allons lancer les scripts contenu dans ce répertoire lors du build
Puis, “cd” et créer un template JSON nommé “debian-jessie.json” avec le contenu suivant:
# nano debian-jessie.json
Contenu du fichier “debian-jessie.json”
{ "description": "Build base Debian 8.11.1 (jessie) x86_64", "builders": [ { "type": "virtualbox-iso", "boot_command": [ "<esc><wait>", "install <wait>", "preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed-jessie.cfg <wait>", "debian-installer=en_US <wait>", "auto <wait>", "locale=en_US <wait>", "kbd-chooser/method=fr-latin9 <wait>", "keyboard-configuration/xkb-keymap=fr-latin9 <wait>", "netcfg/get_hostname={{ .Name }} <wait>", "netcfg/get_domain=oowy.lan <wait>", "fb=false <wait>", "debconf/frontend=noninteractive <wait>", "console-setup/ask_detect=false <wait>", "console-keymaps-at/keymap=fr-latin9 <wait>", "<enter><wait>" ], "boot_wait": "30s", "disk_size": 32768, "guest_os_type": "Debian_64", "headless": true, "http_directory": "http", "iso_checksum_type": "sha512", "iso_checksum": "29c73e5b0669c32d15600eb0a0b00eb08a7600fac231decaf85c2cd3d449cea4b48053601277acaa6907cf840a2fe9f22efc8a9a3f5f30ded7260ed4b391768d", "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/8.11.1/amd64/iso-cd/debian-8.11.1-amd64-netinst.iso", "ssh_username": "vagrant", "ssh_password": "vagrant", "ssh_port": 22, "ssh_wait_timeout": "10000s", "shutdown_command": "echo 'vagrant'|sudo -S /sbin/shutdown -hP now", "vm_name": "debian-8.11.1-amd64", "vboxmanage": [ [ "modifyvm", "{{.Name}}", "--memory", "512" ], [ "modifyvm", "{{.Name}}", "--cpus", "1" ] ] } ], "provisioners": [ { "type": "shell", "execute_command": "echo vagrant | {{ .Vars }} sudo -E -S '{{ .Path}}'", "scripts": [ "scripts/update.sh", "scripts/vagrant.sh", "scripts/vboxadditions.sh", "scripts/memory-cgroups.sh", "scripts/cleanup.sh" ] } ], "post-processors": [ [{ "type": "vagrant", "output": "debian-8.11.1-amd64.box" }] ] }
On créer notre fichier de réponse (pressed), le fichier se nommera “pressed-jessie.cfg”
# /preseed.cfg # (C) Copyright 2013, oowy <contact@oowy.fr> # Licence GPL-3.0+ # # Pour contourner les bugs: # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=703146 # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=703404 d-i preseed/early_command string mv /usr/local/apt-install /bin #### Locales d-i debian-installer/fallbacklocale select en_US.UTF-8 d-i debian-installer/locale select en_US.UTF-8 #### Keyboard d-i keyboard-configuration/xkb-keymap fr-latin9 d-i console-keymaps-at/keymap select fr-latin9 d-i debian-installer/keymap string fr-latin9 #### Hostname d-i netcfg/get_hostname string bee #### Domain d-i netcfg/get_domain string oowy.lan #### Mirror settings d-i mirror/protocol string http d-i mirror/country string france d-i mirror/http/directory string /debian d-i mirror/http/hostname string cdn.debian.net d-i mirror/http/proxy string d-i mirror/udeb/suite string jessie #### Clock and time zone setup d-i clock-setup/utc boolean true d-i time/zone string Europe/Paris d-i clock-setup/ntp boolean false #d-i clock-setup/ntp-server string ntp1.oowy.lan #d-i clock-setup/ntp-server string ntp2.oowy.lan ## Root password #d-i passwd/root-password password root #d-i passwd/root-password-crypted password $6$eVRgMVhxetgIBnl4jm0ZbYYGsTe3sQdgHds9xffbxs4i.LgYQWjudqMQnvHL0YWFhzP/6XY/ # ## admoxa account #d-i passwd/user-fullname string admoxa #d-i passwd/username string admoxa #d-i passwd/user-password-crypted password $6$rns.xKwQ$KIWjudqMQnvHL0YWFX8U4EAtF4mKKLElMPe44dlxhxetgIBnl4jm0ZbBsXUhxetgIBnl4jm0Zb0v/ocIgVzaJA. # Root password d-i passwd/root-login boolean false d-i passwd/root-password-again password vagrant d-i passwd/root-password password vagrant # Vagrant account d-i passwd/user-fullname string vagrant d-i passwd/username string vagrant d-i passwd/user-uid string 900 d-i passwd/user-password password vagrant d-i passwd/user-password-again password vagrant # The installer will warn about weak passwords. If you are sure you know # what you're doing and want to override it, uncomment this. d-i user-setup/allow-password-weak boolean true # Set to true if you want to encrypt the first user's home directory. d-i user-setup/encrypt-home boolean false #### Partitioning #d-i partman-auto-lvm/guided_size string max #d-i partman-auto/choose_recipe select atomic #d-i partman-auto/method string lvm #d-i partman-lvm/confirm boolean true #d-i partman-lvm/confirm_nooverwrite boolean true #d-i partman-lvm/device_remove_lvm boolean true #d-i partman/choose_partition select finish #d-i partman/confirm boolean true #d-i partman/confirm_nooverwrite boolean true #d-i partman/confirm_write_new_label boolean true ### Partitioning d-i partman-auto/method string lvm d-i partman-lvm/device_remove_lvm boolean true d-i partman-md/device_remove_md boolean true d-i partman-lvm/confirm boolean true d-i partman-lvm/confirm_nooverwrite boolean true d-i partman-auto-lvm/new_vg_name string vg-root # Partition will be : # /boot : ~128M ext4 # / : [1-∞]G LVM ext4 # /var : [768-2048]M LVM ext4 # swap : [RAM*150%-2048]M LVM # #• Tout doir tenir sur une seule ligne. #• Chaque description de partition se termine par un caractère • #• Les trois nombres en entrée de partition correspondent à la taille minimale, la taille prioritaire et la taille maximum. #• Les tailles peuvent s’exprimer également en pourcentage de la RAM. #• format { } effectue le formattage. #• use_filesystem { } indique qu’on souhaite utiliser cette partition dans notre futur système d’exploitation. #• mountpoint { xxx } permet de préciser le point de montage. #• La méthode method { swap } permet d’indiquer qu’on utilise un swap. d-i partman-auto/expert_recipe string \ boot-root :: \ 128 3000 128 ext4 \ $primary{ } \ $bootable{ } \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ mountpoint{ /boot } \ options/noatime{ noatime } \ . \ 1024 4000 4096 ext4 \ $lvmok{ } \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ mountpoint{ / } \ options/noatime{ noatime } \ lv_name{ root } \ . \ 1024 2000 2048 ext4 \ $lvmok{ } \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ mountpoint{ /home } \ options/noatime{ noatime } \ lv_name{ home } \ . \ 768 1000 2048 ext4 \ $lvmok{ } \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ mountpoint{ /var } \ options/noatime{ noatime } \ lv_name{ var } \ . \ 100% 1000 150% linux-swap \ $lvmok{ } \ method{ swap } format{ } \ lv_name{ swap } \ . d-i partman-partitioning/confirm_write_new_label boolean true d-i partman/choose_partition select finish d-i partman/confirm boolean true d-i partman/confirm_nooverwrite boolean true d-i partman-md/confirm boolean true d-i partman/mount_style select uuid # Participate stats popularity-contest popularity-contest/participate boolean false # tasks => ssh-server,standard tasksel tasksel/first multiselect ssh-server #### Package selection d-i pkgsel/include string openssh-server sudo bzip2 acpid cryptsetup zlib1g-dev wget curl dkms d-i pkgsel/install-language-support boolean false d-i pkgsel/update-policy select unattended-upgrades d-i pkgsel/upgrade select full-upgrade # Prevent packaged version of VirtualBox Guest Additions being installed: d-i preseed/early_command string sed -i \ '/in-target/idiscover(){/sbin/discover|grep -v VirtualBox;}' \ /usr/lib/pre-pkgsel.d/20install-hwpackages d-i preseed/late_command string sed -i '/^deb cdrom:/s/^/#/' /target/etc/apt/sources.list #### Apt setup d-i apt-setup/non-free boolean true d-i apt-setup/contrib boolean true d-i apt-cdrom-setup apt-setup/cdrom/set-first boolean false d-i apt-mirror-setup apt-setup/use_mirror boolean true ### Disable cdrom scan d-i apt-setup/cdrom/set-first boolean false d-i apt-setup/cdrom/set-next boolean false d-i apt-setup/cdrom/set-failed boolean false #### Verbose output and no boot splash screen d-i debian-installer/quiet boolean false d-i debian-installer/splash boolean false #### Boot loader installation # Wait for two seconds in grub d-i grub-installer/timeout string 2 # This is fairly safe to set, it makes grub install automatically to the MBR # if no other operating system is detected on the machine. d-i grub-installer/only_debian boolean true # This one makes grub-installer install to the MBR if it also finds some other # OS, which is less safe as it might not be able to boot that other OS. d-i grub-installer/with_other_os boolean true d-i grub-installer/bootdev string /dev/sda #### Finishing up the installation d-i finish-install/reboot_in_progress note
Maintenant que tout est prêt, nous allons pouvoir lancer le build de notre image avec la commande suivante :
# packer build debian-jessie.json
Un fois le build terminé, nous allons trouver à la racine de notre projet l'image : “debian-8.11.1-amd64.box”. Nous allons utiliser Vagrant pour charger cette nouvelle images dans Virtualbox et pouvoir la démarrer.
# vagrant box add debian-8.11.1-amd64.box --name "debian-8.11.1-amd64" ==> box: Box file was not detected as metadata. Adding it directly... ==> box: Adding box 'debian-8.11.1-amd64' (v0) for provider: box: Unpacking necessary files from: file:///vagrant/debian8/debian-8.11.1-amd64.box ==> box: Successfully added box 'debian-8.11.1-amd64' (v0) for 'virtualbox'!
# vagrant init debian-8.11.1-amd64 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.
# vagrant up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'debian-8.11.1-amd64'... ==> default: Matching MAC address for NAT networking... ==> default: Setting the name of the VM: debian8_default_1565163677462_37245 ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat ==> default: Forwarding ports... default: 22 (guest) => 2222 (host) (adapter 1) ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: vagrant default: SSH auth method: private key default: default: Vagrant insecure key detected. Vagrant will automatically replace default: this with a newly generated keypair for better security. default: default: Inserting generated public key within guest... default: Removing insecure key from the guest if it's present... default: Key inserted! Disconnecting and reconnecting using new SSH key... ==> default: Machine booted and ready! ==> default: Checking for guest additions in VM... ==> default: Mounting shared folders... default: /vagrant => /vagrant/debian8