如何使用Packer创建Ubuntu 18.04 Vagrant Box

时间:2020-01-09 10:34:23  来源:igfitidea点击:

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