如何使用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