Packer: 添加对从现有 Vagrant box 构建的支持

创建于 2014-01-31  ·  134评论  ·  资料来源: hashicorp/packer

从 ISO 文件构建 Vagrant 盒子非常复杂。 您需要知道引导顺序和预种子。 这两个都很难读。

有时,我们只需要从现有的 Vagrant 盒子中构建一个盒子。 如果 Packer 有一个预处理器,它会在输入中接收一个 Vagrant 盒子,然后将其提供给“virtualbox-ovf”构建器,那就太好了。 或者,这可能是另一个构建器。

这将增加提供预构建的 Vagrant 盒子的能力,然后将其重新打包为 Vagrant 盒子。

理想情况下,输入中的 Vagrant 框可以取自本地上下文或 URL(例如来自 http://www.vagrantbox.es/ 的框)。

是否有意义?

+1 enhancement post-1.0

最有用的评论

我破解了一个适合我的自定义生成器packer-builder-vagrant 。 它只是找到现有的 vagrant box(或尝试下载它)并在构建器定义中更新source_path 。 与打包机 0.12 + vagrant 1.9.0 + VirtualBox 5.1.8 一起工作正常(尝试了 mac 和 windows)。 它需要您稍微更新您的打包程序模板。 自述文件应该给你一个提示它是如何工作的。 随意尝试。

https://github.com/themalkolm/packer-builder-vagrant。

所有134条评论

+1

对于 Virtualbox,您目前可以通过下载 .box、提取其内​​容(它们只是 tarball,可选地 gzip 压缩)然后将 virtualbox-ovf 构建器的 source_path 指向从压缩包。

我同意尽管在不需要上述解决方法的情况下在 Packer 中实际支持 Vagrant 框将非常有用。

+1。 这将消除以下工作流程中的许多摩擦:获取现有的 Vagrant 盒子,更新内容,并更新已部署的盒子,以便其他用户可以受益。

+1。 拥有肯定会很方便。

+1

+1 - 我也在寻找那个功能 - 只是想对现有的基本盒子做些小改动。

+1
同意@aseigneurin

+1

+1

内森·沙利文
从移动设备发送

2014 年 7 月 25 日凌晨 1:29,Christoph Kulla [email protected]写道:

+1


直接回复此邮件或在 GitHub 上查看。

+1 正如@jorisvddonk 所建议的那样,对VirtualBox 盒子执行此操作似乎相当简单。 我的猜测是大多数想要这个的人无论如何都打算为 VirtualBox Vagrant 提供者做这件事。

+1 这会让我更容易,因为很多时候我只想拿一个盒子然后添加简单的东西,比如厨师等,而不是从 ISO 完全安装操作系统

+1

问题在于,Vagrant Box 不一定适用于 VirtualBox 提供程序,并且可能不包含 OVF/OVA 文件。 但是对于所有想要这个工作流程的人来说,这不是问题。

+1

+1

+1

跳过安装过程的能力会很棒。

+1

+1

+1

对预处理器的考虑将是使用哪种类型的 vagrant box 提供程序; 我猜最常见的两个是 VirtualBox 和 VMWare

+1 这应该发生

+1

我坐在这里等待 Windows 更新......这需要很长时间。

我知道我应该在非高峰期这样做,但有时你只需要建造一个新盒子。 如果我不必从安装中进行 Windows 更新,那就太好了。

+1

我开始将现有的 Vagrant 工作流程转换为 Packer,这样我们也可以构建 AMI。 我很惊讶地发现 Packer 不支持直接从 Atlas 上的虚拟机构建。 :(

:+1:

+1

我有一个从 ISO 构建的 FreeBSD vagrant 盒子,如果我可以将它用作其他使用 FreeBSD 作为基础的 Packer 生成的盒子的基本盒子,那么我可以有更好的构建时间。

+1

我可能需要看看手动编写脚本需要什么(我不知道任何 Go)。 基本上根据盒子规范,.box 中有一个 metadata.json 文件,它解释了它是为哪个提供者构建的,如果你试图将一个盒子“转换”到另一个提供者,这将允许你出错(肯定更难支持)。 这至少可以相当容易地支持 Virtualbox 和 VMware(桌面),我还没有玩过 Vagrant 中的 Docker 支持来看看他们的盒子是如何构建的。

@dragon788是的,这正是我想要做的。 是从默认的virtualbox提供者转换为vmware_fusion

我已经这样转换了,有时最好简单地重建盒子,如果
可能的。 你必须做一些疯狂的技巧,比如将盒子导入
Virtualbox,将其导出为 ova/ovf 但使用 OLD 0.9 版本,然后
使用 VMware OVF Tool 将其转换为 VMware(您必须
告诉它忽略警告),然后将其导入 VMware,如果您
幸运的是,您可以使用该 VMDK 并将其输入 Packer 以构建一个
新的“盒子”。

2015 年 7 月 8 日星期三凌晨 1:50,Brendan Thompson [email protected]
写道:

@dragon788 https://github.com/dragon788是的,这正是
我想做。 是从默认的virtualbox provider转换为
vmware_fusion


直接回复此邮件或在 GitHub 上查看
https://github.com/mitchellh/packer/issues/869#issuecomment -119459486。

大家好,

我创建了几个工具来管理盒子,主要是从存储库下载盒子并将其用作 Packer 的起点。 此下载脚本允许您解压缩盒子,然后使用盒子内的 .ovf 文件作为您正在生成的 Packer 图像的起点。

https://github.com/amontalban/vagrant-tools看看它,让我知道你的想法。

谢谢!

+1。 今天我从基础盒 + 我的配置构建我的盒子。 我用 vagrant up && halt && 包来做到这一点。 如果转到打包程序,我可以保留我的工作流程(我想要一个用于 docker、vbox ++ 的统一打包程序构建/模板)

+1

+1

+1

+1 - 我不知道这怎么不存在。 似乎是一个非常明显的用例。

+1

+1

+1 出于上述所有原因,它将允许人们逐步构建类似于 docker 模型。

+1 这将是一个巨大的帮助,特别是考虑到Canonical 提供的云图像中的 OVA/OVF 不能被 VirtualBox 读取(至少对于 Trusty LTS),因此不能被 Packer 和 Vagrant 使用。 已知问题:#1726

但是,从他们提供的 Vagrant 框中提取的 OVF/VMDK 是可用的。

Packer 用于下载和提取 Vagrant 框(或更一般地说:下载和提取 TAR)的预处理器将使我们能够缩小这一差距。

+1我以为这已经存在了。

+1

+1

如果 Hashicorp 的某个人可以对此发表评论,我会非常感兴趣。 我的意思是,这是值得思考的事情吗? 感觉很奇怪,这还不可用,而且近两年来没有任何“官方”评论过这个问题......

+1

+1这也是我工作流程中缺少的一步。 我想使用 CoreOS AMI 和 CoreOS .box 并让 Packer 为两者发起配置。 无法处理 .box 是一个痛点,需要在 Packer 之前返回一个丑陋的脚本才能将 .ovm 从 .box 中取出。

我假设 Hashi 没有人看过这个,因为它超出了 ISO 和 OVF 驱动程序的范围,并且需要第三个驱动程序,它实际上是特定于 vagrant 的。
但是,Hashi 为什么要支持他们自己的产品之间的互操作呢?

我也不知道 Go,但我们都是开发人员,所以让我们解决这个问题。
我想我们需要克隆 OVF 驱动程序,然后在导入步骤之前:
https://github.com/mitchellh/packer/blob/master/builder/virtualbox/ovf/builder.go#L76
您将在 ISO 驱动程序中集成类似于 DownloadStep 的内容:
https://github.com/mitchellh/packer/blob/master/builder/virtualbox/iso/builder.go#L230
您还需要在 ISO 驱动程序中进行更高级别的检查:
https://github.com/mitchellh/packer/blob/master/builder/virtualbox/iso/builder.go#L162

这很容易,但您还需要:

  1. 提取下载的 .box 文件(tarball)
  2. 可选:打开 metadata.json 文件,检查提供者是 virtualbox
  3. 寻找.ovf(虽然它通常是“box.ovf”,对吧?)
  4. 使用新发现的 ovf 继续导入过程。

其实仔细看,也没那么难。 我只是不知道如何在 Go 中做到这一点。

+1

+1

+1

+1

+1

+1

+1

+1

在潮流中...+1

+1

+1

对于那些请求此功能的人,您是否打算转换
一个现有的 VirtualBox(或 VMware)盒子到一个更新的 VirtualBox(或
VMware)盒子,或者您打算从 VirtualBox 盒子转换为
VMware 盒子,反之亦然?
2015 年 12 月 1 日下午 2:04,“Atha Kouroussis” [email protected]写道:

+1


直接回复此邮件或在 GitHub 上查看
https://github.com/mitchellh/packer/issues/869#issuecomment -161079965。

我正在尝试使用现有的盒子作为其他盒子的基础。 对从 Virtualbox 转换到 VMware 不感兴趣。 目前通过保留基本盒子构建中的工件来解决这个问题,但并不理想。

我正在寻找的是能够在以前构建的 VirtualBox 盒子的基础上创建新的 VirtualBox 盒子。

使用 Amazon AMI,我可以让打包程序定义 A 从基本 Ubuntu AMI 作为源映像开始,然后打包程序定义 B 从 A 中的 AMI 构建开始,然后定义 C 从构建 B 中的 AMI 开始。

使用 VirtualBox(在仅支持基于 ISO 的构建的 Atlas 中)我必须从 A、B 和 C 的基本 Ubuntu ISO 映像开始。即 B 不能将 A 生成的 Virtualbox 框用作“源框”。

+1

目前,我们可以指定本地 vagrant box 文件的路径到 packer builder source_path
例如:

        {
            "type": "virtualbox-ovf",
            "source_path": "/Users/xxx/.vagrant.d/boxes/bento-VAGRANTSLASH-centos-6.7/2.2.2/virtualbox/box.ovf",
            "ssh_username": "vagrant",
            "ssh_password": "vagrant",
            "headless": true,
            "shutdown_command": "echo 'packer' | sudo -S shutdown -P now"
        }

+1

+1

+1

+1

我想使用 common/genericbento/centos-7.2 作为我的打包模板的起点。 或者,一旦我在 atlas 中有一个私人 vagrant,最好使用最后一个作为后续打包器构建的源。 作为我的供应商是幂等的,没有理由每次都从 ISO 构建盒子。

+1

目前我们可以指定本地vagrant box文件的路径到packer builder source_path。
这对于本地构建非常有效。

+1

+1

+1 有人在做这个吗? 如果没有,您是否在征求捐款?

随着 Packer 中即将推出的本地/主机 shell 命令,这将是微不足道的。
2016 年 3 月 2 日下午 12:33,“Ashish Tonse” [email protected]写道:

+1 有人在做这个吗? 如果没有,您是否在征求捐款?


直接回复此邮件或在 GitHub 上查看
https://github.com/mitchellh/packer/issues/869#issuecomment -191362198。

我也想知道,可以在 Packer 中使用预制盒子来继续构建 Vagrant 盒子吗?

:+1: 实现它。 也因为,它会大大加快这个过程。

至于“本地/主机外壳命令”,难道不能有类似的东西吗?

  "builders": [
    {
      "type": "vagrantbox",
      "sourcebox": "hashicorp/precise64",
      "virtualization": "Virtualbox"
    }
  ]

让 Packer 用 Atlas、Vagrant 和 Virtualbox 完成剩下的工作?

不太确定虚拟化位,如果 Packer 不能自己判断什么是可用的,但我希望你明白要点。 :微笑:

斯科特

斯科特,小提示,json 键名中不能有空格。 如果你有一个
将 .box(实际上只是一个 .tar 文件)解压缩到一个
目录结构,您可以对其进行解析和引用以进行将来的构建。
这是本地 shell 命令派上用场的地方,否则你
在 Packer 进行提取之前需要一个额外的阶段。

2016 年 3 月 5 日星期六凌晨 2:28,Scott [email protected]写道:

我也想知道,可以在 Packer 中使用预制的盒子来继续
建立一个流浪者盒子?

[image: :+1:] 实现它。 也是因为,它会加速
过程相当大。

至于“本地/主机外壳命令”,难道不能只拥有
就像是

“建设者”:[
{
"type": "vagrantbox",
“源框”:“hashicorp/precise64”
“虚拟化”:“虚拟盒子”
}

让 Packer 用 Atlas、Vagrant 和 Virtualbox 完成剩下的工作?

不太确定虚拟化位,如果 Packer 不知道是什么
可以单独使用,但我希望你能明白要点。 [图片::微笑:]

斯科特


直接回复此邮件或在 GitHub 上查看
https://github.com/mitchellh/packer/issues/869#issuecomment -192607673。

已更正! 哈哈!

看起来 Packer 本身应该足够“聪明”来进行拆包、提取或其他任何必要的操作。

斯科特

+1

+1

+1

+1

+1

+1

+1 这将使生活更轻松!

+1 需要这个。

+1 - 这将极大地帮助加快构建速度

+1 会很有帮助

+1 超级有用,但即使有解决方法,也要发表一篇关于如何获得准确无业游民框图像的文章

+1 会很有帮助

+1
从 vmware_basebox -> vmware_extra_provisioning 框开始。 从打包机做这一切会很棒。 我为 iOS 构建使用 OS X 图像,并且重新打包是您经常做的事情以节省时间。

+1

这将不胜感激。

+1

嗨 HashiCorp 开发人员! 有没有机会让这一切顺利进行? 这个问题已经开放这么久了!

我发现了一个更好的系统。 码头工人! 再见 Hashicorp。

斯科特

Vagrant 也做 Docker,所以你不需要离开 . ;)

2016 年 9 月 13 日上午 7:36,“Scott” [email protected]写道:

我发现了一个更好的系统。 码头工人! 再见 Hashicorp。

斯科特


你收到这个是因为你被提到了。
直接回复此邮件,在 GitHub 上查看
https://github.com/mitchellh/packer/issues/869#issuecomment -246667118,
或使线程静音
https://github.com/notifications/unsubscribe-auth/AAdxXvgJ_ek2tvfiHWdtJFYA3vfckH6iks5qppi8gaJpZM4BeIMi
.

你在开玩笑吧? 编辑:我现在使用 Docker for Windows。 永远不会回头。 对不起。

斯科特

+1

希望看到此功能已添加 +1

这正是我目前所缺少的,所以+1

+1 - 还想非常感谢 Hashicorp 免费为我提供如此有用的工具。 惊人

+1 解决方法真的很脆弱。

+1

:100:
:+1:
+1

特别是尝试复制尽可能接近一些具有完整虚拟化VM而不是可能使用不同内核的容器的云提供商映像会很方便。

+1

我很惊讶这不是一件事。 可能是时候破解一些 Go 语言了

我破解了一个适合我的自定义生成器packer-builder-vagrant 。 它只是找到现有的 vagrant box(或尝试下载它)并在构建器定义中更新source_path 。 与打包机 0.12 + vagrant 1.9.0 + VirtualBox 5.1.8 一起工作正常(尝试了 mac 和 windows)。 它需要您稍微更新您的打包程序模板。 自述文件应该给你一个提示它是如何工作的。 随意尝试。

https://github.com/themalkolm/packer-builder-vagrant。

+1

+1

+1

这按照打包程序 0.12.2 的建议工作。 这是我正在使用的构建器配置

"builders": [ { "type": "virtualbox-ovf", "source_path": "{{user ovf_path }}", "headless": true, "boot_wait": "2m", "ssh_username": "vagrant", "ssh_password": "vagrant", "ssh_wait_timeout": "6h", "shutdown_command": "shutdown /s /t 10 /f /d p:4:1 /c \"Packer Shutdown\"", "floppy_files": [ "{{user "builders": [ { "type": "virtualbox-ovf", "source_path": "{{user无人参与}}", "scripts/microsoft-updates.bat", "scripts/win-updates.ps1", "scripts/openssh.ps1" ] }, "variables": { "ovf_path": "./vbox/box.ovf", "autounattend": "answer_files/2012_r2/Autounattend.xml" }

使用来自https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-vagrant.box的解压框不适用于我的 packer/virtualbox。 它总是在“初始化非阻塞池”之后挂起。 有人有同样的问题吗?
澄清一下,使用带有 vagrant 的盒子可以正常工作。

@sebastianreloaded尝试添加串行设备。 您可能还需要将第一个 NIC 类型更改为 NAT:

        "vboxmanage": [
          [ "modifyvm", "{{ .Name }}", "--uart1", "0x3F8", "4" ],
          [ "modifyvm", "{{ .Name }}", "--uartmode1", "disconnected" ],
          [ "modifyvm", "{{ .Name }}", "--nic1", "nat" ]
        ]

无论如何,我建议坚持使用便当盒,因为在您成功启动后,您必须解决登录问题(ubuntu 对其默认的“ubuntu”用户使用随机密码,并且正在从一个版本更改为另一个版本)和谁知道还有什么。 在与 ubuntu 图像打了 2 天之后,我就这样放弃了。

@themalkolm非常感谢您尝试解决此问题。 不幸的是,您的解决方案高度针对 VirtualBox 提供程序,并且不支持构建器中的变量之类的东西。

很明显,许多人对 Hashicorp 技术不支持 Vagrant box 范围内的 Hashicorp 格式感到惊讶。 与其他人一样,我也有兴趣支持类似于 AMI builder 的管道,以使用现有图像并对其进行修改。

大多数人不希望每次都只添加一些小组件(例如软件版本凸点)来构建基础盒。 当您只想更改整体的一个子集时,它会强制将工作流锁定到 _golden image_ 模式,在这种模式下,您可以得到全部或一无所有。 这最终增加了实现_不可变生产_的摩擦。

+1

此功能将使 Vagrant 和 Packer 的交叉使用更好!

这是一个使用 vagrant box 作为 virtualbox builder 源的 bash 脚本:

build.sh

#!/bin/bash
set -e

vagrant box add --provider virtualbox ubuntu/xenial64 2> /dev/null || true
BOX_VERSION="$(ls -1 ~/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-xenial64 | grep ^20 | sort -r | head -1)"
BOX_FOLDER="$(realpath ~/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-xenial64/${BOX_VERSION}/virtualbox)"
BOX_CHECKSUM="$(sed -n 's/.*ovf.*= \(.*\)/\1/p' ${BOX_FOLDER}/ubuntu-xenial-16.04-cloudimg.mf)"
BOX_BASE_MAC="$(sed -n 's/.*base_mac = "\(.*\)"/\1/p' ${BOX_FOLDER}/Vagrantfile)"

packer build \
  -var "box_folder=${BOX_FOLDER}" \
  -var "box_checksum=${BOX_CHECKSUM}" \
  -var "box_base_mac=${BOX_BASE_MAC}" \
  "template.json"

template.json

{
  "builders": [
    {
      "type": "virtualbox-ovf",
      "source_path": "{{ user `box_folder` }}/box.ovf",
      "checksum": "{{ user `box_checksum` }}",
      "checksum_type": "sha256",
      "guest_additions_mode": "disable",
      "headless": true,
      "ssh_pty": true,
      "ssh_username": "vagrant",
      "ssh_private_key_file": "~/.vagrant.d/insecure_private_key",
      "shutdown_command": "sudo shutdown -P now",
      "output_directory": "/tmp/packer_output",
      "target_path": "/tmp/packer_cache",
      "skip_export": true,
      "vboxmanage": [
        [ "modifyvm", "{{ .Name }}", "--ostype", "Ubuntu_64" ],
        [ "modifyvm", "{{ .Name }}", "--cpus", "2" ],
        [ "modifyvm", "{{ .Name }}", "--memory", "2048" ],
        [ "modifyvm", "{{ .Name }}", "--vrde", "off" ],
        [ "modifyvm", "{{ .Name }}", "--nic1", "nat" ],
        [ "modifyvm", "{{ .Name }}", "--uart1", "0x3F8", "4" ],
        [ "modifyvm", "{{ .Name }}", "--uartmode1", "file", "/tmp/packer_output/console.log" ],
        [ "modifyvm", "{{ .Name }}", "--macaddress1", "{{ user `box_base_mac` }}" ]
      ]
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": ["echo foo"]
    }
  ]
}

+1

+1 用于介绍此功能。 会简化很多工作。

+1

+1

+1

我已经 +1 了这个请求。
但是在此功能可用之前, @davidkarlsen 的建议有什么问题?
即使用现有的流浪功能:

  1. vagrant up(来自基础 .box)
  2. 流浪者提供(在此处添加您的自定义)
  3. 流浪停止
  4. vagrant package -> 创建一个新的 .box

这种方法有什么问题吗?

@lqueryvg您可能想查看最近启动的 WSO2 的产品 Vagrant box 存储库 [1]。 在此存储库中,已使用您指出的方法。

在为 WSO2 产品构建 Vagrant 盒子时,我们遇到了这里讨论的相同问题,我们提出了相同的解决方案。 然而,希望这一功能能尽快推出。

+1

+1

+1 @KFoxder

@cornfeedhobo ,你说@themalkolm的解决方案不支持变量是什么意思?
他在测试中使用变量,一切看起来都很好。

+1

+1

问题首次公开 5 年后,让我也投一个 +1。

我已经为 virtualbox-ovf 构建器和 vmware-ovf 实现了一个集成,但我并不热衷于它增加代码的复杂性,我认为这作为一个独立的构建器会更好——所以接下来我将与 Vagrant 团队一起工作。

一旦我有一些工作,我希望志愿者来测试构建。

一旦我有一些工作,我希望志愿者来测试构建。

我是游戏

也愿意在进行中进行测试,随时联系我

我在这里创建

到目前为止,由于一些硬编码,它仅适用于 OSX(我已将二进制文件附加到该 PR),但我打算明天修复 linux 和 windows 的路径。

我喜欢一些测试和反馈。 文档更改包含在 PR 中,PR 评论中有一个使用示例。

vagrant builder 现在可以使用 Windows 和 linux 构建。

为此+1。 还表达了通过libvirt而不仅仅是 VirtualBox 和 VMware 工作的需要/希望。

@sudomateo新的 vagrant 构建器将直接调用 vagrant,而不是要求用户设置底层构建器; 您将有机会设置适合您需求的任何流浪者提供者。

打包程序构建 \ -var "box_folder=${BOX_FOLDER}" \ -var "box_checksum=${BOX_CHECKSUM}" \ -var "box_password=${BOX_PASSWORD}" \ -var "box_base_mac=${BOX_BASE_MAC}" \ "模板。 json"

由于这仍然是开放的,因为我只想拿官方的流浪者盒子,执行一些 ansible 剧本,然后创建一个新的流浪者盒子或个人用途......

@Adezandee您是否有更新版本,因为我刚刚尝试使用 packer v1.3.4 并得到这个;

Failed to parse template: 14 error(s) occurred:

* Unknown root level key in template: 'checksum'
* Unknown root level key in template: 'checksum_type'
* Unknown root level key in template: 'guest_additions_mode'
* Unknown root level key in template: 'headless'
* Unknown root level key in template: 'output_directory'
* Unknown root level key in template: 'shutdown_command'
* Unknown root level key in template: 'skip_export'
* Unknown root level key in template: 'source_path'
* Unknown root level key in template: 'ssh_password'
* Unknown root level key in template: 'ssh_pty'
* Unknown root level key in template: 'ssh_username'
* Unknown root level key in template: 'target_path'
* Unknown root level key in template: 'type'
* Unknown root level key in template: 'vboxmanage'

@nhojpatrick我的原始评论是部分

@nhojpatrick合并#7221 时将添加功能:)

我要锁定这个问题,因为它已经关闭了_30天_⏳。 这有助于我们的维护人员发现并专注于活跃的问题。

如果您发现了与此类似的问题,请打开一个新问题并完成问题模板,以便我们获取进一步调查所需的所有详细信息。

此页面是否有帮助?
0 / 5 - 0 等级