如何使用Packer创建Ubuntu 18.04 Vagrant Box
Packer是用于创建服务器映像的出色工具。可以为各种平台创建映像,例如AWS AMI,VMware,VirtualBox和Vagrant。本教程将指导我们创建Ubuntu 18.04 Vagrant框。
准备工作
我们将需要安装最新版本的VirtualBox和Packer来进行后续操作。我们还应该安装Vagrant,以测试我们创建的图像。
虚拟箱
Vagrant
Packer
Github上的教程文件
我已经创建了一个Github存储库来托管本教程中使用的文件。使用它可以查看整个工作区结构和文件内容,以便更好地遵循。
https://github.com/serainville/packer_templates
创建基本映像
Packer使用JSON文件定义图像。该文件包含三个主要部分:构建器,配置,预处理。
Builders决定了我们打算创建哪种图像。在这里,我们将告诉Packer我们正在创建一个AWS AMI或者Virtualbox OVF,本教程就是这种情况。
我们不仅限于一个构建器。例如,如果需要在AWS和Vagrant中使用相同的映像,则可以创建多个构建器。每个构建器都是Packer配置文件中的一个数组项。
Provisioners是Packer JSON文件的下一部分。安装操作系统后,将调配供应商以配置系统。从基本的shell脚本到使用Ansible剧本或者Puppet模块,都有很多可用的选项。使用它们的好处是我们可以为Vagrant环境创建生产服务器的镜像。
最后,我们有后处理器。这是一个可选步骤,但是创建"游荡者"框是必需的。通过将Virtualbox OVF打包为Vagrant Box映像来生成Vagrant Box。
其他后处理器选项使我们可以压缩图像。
添加Virtualbox Builder
Virtualbox映像将成为我们的Vagrant框的基础。创建图像后,我们将使用后处理步骤为Vagrant打包图像。
- 为Packer配置创建一个工作区。 Packer的典型目录结构如下。
Packer/
|---ubuntu1804.json
|---http/
| |--- preseed.cfg
|---scripts/
|--- init.sh
|--- cleanup.sh
为Ubuntu 18.04映像创建一个新的JSON文件。在上面的目录结构中,我们将文件命名为ubuntu1804.json。
在文本编辑器中打开JSON文件。然后添加以下行。
{
"builders": [
{
"type": "virtualbox-iso",
"boot_command": [
"",
"",
"",
"/install/vmlinuz",
" auto",
" console-setup/ask_detect=false",
" console-setup/layoutcode=us",
" console-setup/modelcode=pc105",
" debconf/frontend=noninteractive",
" debian-installer=en_US",
" fb=false",
" initrd=/install/initrd.gz",
" kbd-chooser/method=us",
" keyboard-configuration/layout=USA",
" keyboard-configuration/variant=USA",
" locale=en_US",
" netcfg/get_domain=vm",
" netcfg/get_hostname=vagrant",
" grub-installer/bootdev=/dev/sda",
" noapic",
" preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg",
" -- ",
""
],
"boot_wait": "10s",
"disk_size": 81920,
"guest_os_type": "Ubuntu_64",
"headless": false,
"http_directory": "http",
"iso_urls": [
"iso/ubuntu-18.04-server-amd64.iso",
"http://cdimage.ubuntu.com/ubuntu/releases/bionic/release/ubuntu-18.04-server-amd64.iso"
],
"iso_checksum_type": "sha256",
"iso_checksum": "a7f5c7b0cdd0e9560d78f1e47660e066353bb8a79eb78d1fc3f4ea62a07e6cbc",
"ssh_username": "vagrant",
"ssh_password": "vagrant",
"ssh_port": 22,
"ssh_wait_timeout": "10000s",
"shutdown_command": "echo 'vagrant'|sudo -S shutdown -P now",
"guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso",
"virtualbox_version_file": ".vbox_version",
"vm_name": "packer-ubuntu-18.04-amd64",
"vboxmanage": [
[
"modifyvm",
"{{.Name}}",
"--memory",
"1024"
],
[
"modifyvm",
"{{.Name}}",
"--cpus",
"1"
]
]
}
],
"provisioners": [{
"type": "shell",
"scripts": [
"scripts/init.sh",
"scripts/cleanup.sh"
]
}],
"post-processors": [{
"type": "vagrant",
"compression_level": "8",
"output": "ubuntu-18.04-{{.Provider}}.box"
}]
}
- 保存更改并退出文本编辑器。
了解适用于Ubuntu 18.04的Packer JSON文件
有很多配置需要消化。让我们分解每个部分并解释一切。这只是Virtualbox OVF映像的基础。如果我们对创建"无业游民"框不感兴趣,那就可以了。
"builders": [...]
如前所述,我们可以在JSON数组中指定许多构建器。我们仅创建一个用于创建Virtualbox映像的构建器。
"type": "virtualbox-iso",
对于构建器而言,最重要的设置是其类型。这就是告诉Packer如何创建映像的原因。接下来,我们有构建启动命令。这些可以自动选择启动选项,例如语言,键盘布局等。
在创建Virtualbox映像时,Packer需要访问Ubuntu的ISO。 ISO可以是本地的,也可以从Web下载。可以添加多个源。在下面的示例中,我们将创建两个源:一个在相对于JSON文件的本地iso目录中,另一个是Ubuntu托管的官方ISO的URL。
"iso_urls": [
"iso/ubuntu-18.04-server-amd64.iso",
"http://cdimage.ubuntu.com/ubuntu/releases/bionic/release/ubuntu-18.04-server-amd64.iso"
],
Packer强制我们为ISO指定校验和值。这是为了确保图像未被修改。为服务器创建映像时,无论是用于生产还是仅用于生产时,我们都希望没有人在其中添加记录器或者rootkit。
"iso_checksum_type": "sha256", "iso_checksum": "a7f5c7b0cdd0e9560d78f1e47660e066353bb8a79eb78d1fc3f4ea62a07e6cbc",
我们使用的校验和类型为SHA256,并且期望值使用iso_checksum设置。
"boot_command": [...]
在boot命令中,我们具有以下内容:
"<esc><wait>",
"<esc><wait>",
"<esc><wait>",
"/install/vmlinuz<wait>",
" auto<wait>",
" console-setup/ask_detect=false<wait>",
" console-setup/layoutcode=us<wait>",
" console-setup/modelcode=pc105<wait>",
" debconf/frontend=noninteractive<wait>",
" debian-installer=en_US<wait>",
" fb=false<wait>",
" initrd=/install/initrd.gz<wait>",
" kbd-chooser/method=us<wait>",
" keyboard-configuration/layout=USA<wait>",
" keyboard-configuration/variant=USA<wait>",
" locale=en_US<wait>",
" netcfg/get_domain=vm<wait>",
" netcfg/get_hostname=vagrant<wait>",
" grub-installer/bootdev=/dev/sda<wait>",
" noapic<wait>",
" preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ubuntu1804-preseed.cfg<wait>",
" -- <wait>",
"<enter><wait>"
供应商
这是真正的工作开始的地方。拥有原始的OS映像会有所帮助,但是为特定的服务器角色准备就绪的映像会更有用。这可能是LAMP开发服务器,NodeJS服务器或者Docker主机。这是我们需要频繁快速启动的所有内容。
有一些配置选项可用。可以使用优质的'ole bash脚本。或者,可以使用诸如Ansible,Puppet和Chef之类的配置管理工具,从而使我们能够利用已经存在的配置。
使用脚本设置框
脚本供应商会将脚本复制到新的virtualbox vm。我们需要告诉Packer要复制哪些脚本,然后将依次执行它们。在脚本目录下创建一个名为init.sh的新脚本。向其中添加以下内容。
#!/bin/bash sudo apt update sudo apt upgrade -y
上面的脚本将更新APT缓存,然后安装所有可用的修补程序。让我们将其添加到构建器部分下的ubuntu1804.json文件中。
"provisioners": [{
"type": "shell",
"scripts": [
"scripts/init.sh",
"scripts/lamp.sh"
]
}],
使用Ansible设置框
本教程使用Shell脚本,但Packer也支持Ansible。我们可以使用以下配置示例,告诉Packer使用剧本进行配置。
"provisioners": [
{
"type": "ansible",
"playbook_file": "./playbook.yml"
}
],
无业游民的后处理器
到目前为止,我们只能输出Virtualbox映像。但是,我们的目标是拥有一个Vagrantbox。这是Packer后处理器发挥作用的地方。创建Virtualbox映像后,后处理器会将映像打包在Vagrant框内,该框实际上是一个OVF文件,其元数据被压缩到存档文件中。
"post-processors": [{
"type": "vagrant",
"compression_level": "6",
"output": "ubuntu-18.04-{{.Provider}}.box"
}],
这些选项是不言自明的。我们需要将类型指定为Vagrant。我们要使用的压缩级别,然后是输出的文件名。
建立我们的无业游民形象
我们已经将所有必要的位添加到了Packer文件中。让我们来创建我们的形象。从我们的JSON文件所在的目录中运行以下命令。
packer build ubuntu1804.json
将我们的新盒子添加到无业游民
我们的盒子已经制成,可以使用了。最后一步是将框添加到Vagrant。大多数盒子都是从Internet上拉下来的,但是我们需要添加一个本地盒子。以下命令会将新盒子添加到Vagrant中。
vagrant box add ubuntu1804-vagrant.box
要在Vagrantfile中使用它,请使用在构建器的部分中指定的名称。在我们的示例中,我们将盒子称为ubuntu1804-vagrant。以下是使用我们的新框的示例Vagrantfile。
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu1804-vagarant"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.provider "virtualbox" do |vb|
# Display the VirtualBox GUI when booting the machine
vb.gui = false
end
end

