Automating your Server Images with Packer
Gabriel Baker
Who am I?
Head of caffeine consumption and
official poker of things @fusions
`Systems Developer`
@gabriel403
http://g403.co
Automating the crap out of things since 2010
Server Images
What are they &
why do we use them
Base Images
- AWS, Rackspace, Digital Ocean
all provide base images - Ease and Speed of Server Creation
- Identical Servers
Generated Images
- Customised images
- Reproducibility
- Speed of producing production ready servers
Server Images
Why Automate them?
Automating Server Images
- Changes to your base image
are easier to include - Simple one step to rebuild images
- More time to do something else
Packer
Automating Awesomeness
What's great about Packer?
- Single point to build all your server images
- Interfaces with nearly all virtual server providers
- Can work with most provisioning software
- Completely open source
- Easily extendable
{
"builders": [{
"type" : "virtualbox-iso",
"iso_url" : "http://releases.ubuntu.com/14.04/ubuntu-14.04-server-amd64.iso",
"iso_checksum" : "01545fa976c8367b4f0d59169ac4866c",
"iso_checksum_type" : "md5",
"disk_size" : 80000,
"guest_os_type" : "Ubuntu_64",
"http_directory" : "preseed",
"ssh_username" : "vagrant",
"ssh_password" : "vagrant",
"output_directory" : "output/14.04_5.5_64_virtualbox",
"boot_command" : [
"",
"/install/vmlinuz noapic ",
"preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg ",
"debian-installer=en_GB auto locale=en_GB kbd-chooser/method=uk ",
"hostname={{ .Name }} ",
"fb=false debconf/frontend=noninteractive ",
"keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=GB ",
"keyboard-configuration/variant=GB console-setup/ask_detect=false ",
"initrd=/install/initrd.gz -- "
],
"vboxmanage" : [
["modifyvm", "{{.Name}}", "--memory", "1024"]
],
"shutdown_command" : "echo 'shutdown -P now' > shutdown.sh; echo 'vagrant'|sudo -S sh 'shutdown.sh'"
}],
Boring bit
"provisioners" : [{
"type": "shell",
"execute_command": "echo 'vagrant' | sudo -S sh '{{ .Path }}'",
"inline": [
"apt-get update -y",
"apt-get install -y linux-headers-$(uname -r) build-essential dkms puppet-common nfs-kernel-server nfs-common ruby-hiera",
"apt-get clean",
"mount -o loop VBoxGuestAdditions.iso /media/cdrom",
"sh /media/cdrom/VBoxLinuxAdditions.run",
"umount /media/cdrom",
"mkdir ~/.ssh",
"wget -qO- https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub >> ~/.ssh/authorized_keys",
"echo 'vagrant ALL=NOPASSWD:ALL' > /tmp/vagrant",
"chmod 0440 /tmp/vagrant",
"mv /tmp/vagrant /etc/sudoers.d/"
]
},
Provisioners (bash inline)
{
"type" : "puppet-masterless",
"manifest_file" : "manifests/dev.pp",
"module_paths" : ["../../puppet/modules"],
"facter" : {
"fqdn" : "dev.fusionspim.com",
"env" : "dev"
}
}],
Provisioners (puppet, local file)
"post-processors" : [
{
"type" : "vagrant",
"only" : ["virtualbox-iso"],
"output" : "output/ubuntu_14.04_5.5_base_v5.box"
}
]}
Post-processors
{
"builders": [
{
"type" : "digitalocean",
"client_id" : "client_id",
"api_key" : "api_key",
"image" : "ubuntu-14-04-x64",
"region" : "nyc2",
"size" : "4gb",
"snapshot_name" : "do-dev-fusions-snap",
"droplet_name" : "do-dev.fusionspim.com"
}],
"provisioners": [{
"type": "shell",
"execute_command": "echo 'vagrant' | sudo -S sh '{{ .Path }}'",
"inline": [
"boring bits here"
]
},{
"type" : "puppet-masterless",
"manifest_file" : "manifests/site.pp",
"module_paths" : ["../../puppet/modules"],
"facter" : {
"fqdn" : "do-dev.fusionspim.com",
"env" : "dev"
}
}]
}
Digitalocean
gabriel at dixie-flatline in ~/Projects/jarvis/packer on master
$ packer build digitalocean-yolo.fusions-14.04-5.5.json
And then install puppet
And then run your puppet scripts
And then take your snapshot
gabriel at dixie-flatline in ~/Projects/jarvis/packer on master
$ packer build digitalocean-yolo.fusions-14.04-5.5.json
gabriel at dixie-flatline in ~/Projects/jarvis/packer on master
$ packer build virtualbox_provision_14.04_5.5.json
A whole load of boring crap involving 2 sets of wizards
And then remembering to download the Ubuntu iso
And then attaching the iso to the vm
And then going through the ubuntu
install menu
And then install puppet
And then run your puppet scripts
And then take your snapshot
And then make your snapshot a valid vagrant file
gabriel at dixie-flatline in ~/Projects/jarvis/packer on master
$ packer build virtualbox_provision_14.04_5.5.json
AWS
Is complicated
- security groups
- run tags
- spot pricing
- public ip associating
- and a whole bunch more
Packer does some of the complicated
https://www.packer.io
@gabriel403
me@g403.co
https://joind.in/12974
Automating Server Images with Packer
By Gabriel Baker
Automating Server Images with Packer
- 3,046