题 如何在大型环境中管理和部署FreeBSD的端口?


我很好奇人们如何在他们的环境中部署FreeBSD的端口。我假设大多数使用FreeBSD的人确实使用了Ports(并且经常使用portupgrade升级二进制文件)。然而,我对你如何进行这种设置感兴趣,因为我对最近版本中的工作方式不满意。我现在正在运行FreeBSD 9.0并且遇到了问题。

我的设置如下:

  • / usr / ports通过NFS从一个节点共享(每晚进行“portsnap fetch update”)。
  • 每个节点都使用读写方式安装/ usr / ports
  • 我在所有节点上的/etc/make.conf中设置了“WRKDIRPREFIX = / usr / tmp”
  • 我已将Portsnap配置为使用本地索引,方法是将以下内容添加到/usr/local/etc/pkgtools.conf:

ENV['LOCALINDICES'] ||= '/var/db'

ENV['PORTS_INDEX'] ||= ENV['LOCALINDICES'] + '/INDEX.local'

我可以成功跑步 portupgrade -p package 然后建立一个包 portupgrade -P package 在其他节点上安装二进制文件。

然而,有时我收到以下问题: /var/db/INDEX.local:23265:dbm_store failed

我无法想到我可以对系统做任何其他优化,因为索引现在驻留在本地,并且唯一真正导出的是ports-tree,并且没有任何东西从节点写入。


19
2018-02-28 16:45




一种选择是在每个节点上都有一个完整的本地端口树(也许只是挂载'distfiles'和'packages'),但这感觉就像浪费了大量空间(更不用说大量不必要的更新)。 - vpetersson
vpeterson:这是一个需要被问到的问题(我现在已被封锁了。+ 5票和3星表明我们并不孤单)。也许清理这个问题并说明你想要解决的一些具体问题。 (FWIW,有人投票决定关闭你的问题。我个人非常希望看到这个,或类似的问题保存)。 - Stefan Lasiewski
我不确定如何使问题更清楚。我也不认为@ voretaq7实际上回答了问题,而是提出了另一种方法。问题实际上是关于主题建议的内容 - 人们如何在多节点环境中部署FreeBSD的端口。 - vpetersson


答案:


我对大型环境中的端口系统从未完全满意 - 似乎您需要对其应用一些外部管理才能使其正常工作。

我最好的提示(按升序优先顺序,“最差”解决方案“最佳”解决方案):


如果你在每个主机上建造,
如果必须,请不要使用您所描述的读写挂载在NFS上执行此操作:如果您提供备用工作目录,通常可以信任端口做正确的事情而不是踩到端口树,但总是更好安全而不是抱歉:运行本地CVS / csup镜像并从该框中csup所有主机,然后在本地构建,就像它们是单独的机器一样。
是的,我知道这意味着主机上有更多的磁盘空间,还有一个额外的步骤。它几乎可以保证没有问题。
警告: 您可能希望从指定的“配置主机”同步软件包配置文件(rsync或类似文件)以确保每台计算机的一致性(如果需要,您甚至可以同步整个端口树,而不是在每个节点上使用csup)。


使用构建主机,创建包并安装它们。
比在每台机器上构建更好的解决方案:使用构建主机创建包,并将工具指向这些包。
这意味着为您运行(或交叉编译)的每个体系结构保留构建主机,但它最终对您的目标计算机更好(没有大型编译作业,保证一致性)


使用配置/系统管理工具。
这是我最终解决的解决方案 - 我构建了一个标准的服务器映像,并使用它在我的环境中部署它 radmind。你可以做类似的事情 木偶要么 厨师。这具有使用构建主机的所有优点(一致性,单个服务器上的负载较少),并增加了配置管理的好处。

警告: 只有当你的机器“相同”时才能正常工作 - 也就是说你可以在所有机器上安装相同的端口集。它 能够 如果您有不同的端口集,则工作,但这会大大增加管理开销。

免责声明: 我是端口维护者 sysutils/radmind。是的,我喜欢它,我采用它。


所有这些都是基于我管理各种大小的FreeBSD环境(从1-2台机器到100多台机器)的经验。在我的经验中,推送和维护标准化图像的配置/系统管理工具确实是处理这种情况的最佳方式。


13
2018-02-28 19:41



好指点。我过去曾经玩过Puppet,并喜欢Ubuntu。然而,我不确定它与FreeBSD有多好。我还没试过。无论如何,即使使用Puppet,我认为它会调用Portupgrade,这会让我们回到原点。我没有看到它可以工作的任何其他方式,因为它需要做pkg_delete / pkg_add或'pkg_add -f',这不是一个好主意。就硬件而言 - 由于它们在公共云(KVM / Qemu)中运行,因此它们完全相同。 - vpetersson
如果您的硬件和基线软件配置相同,我建议使用radmind,管理整个系统映像。 Puppet和Chef是很棒的工具,但正如你所指出的那样,它们会调用底层的OS二进制文件,这会让你回到使用构建主机并分发包。 radmind通过在文件系统级别接管管理来避免这种情况(“如果它不应该在这里,替换或删除它”)而不是试图成为代理系统管理员(“运行这些命令/更改这些文件以供我配置框”)。 - voretaq7
那么,系统具有相同的硬件,但配置不完全相同。我将不得不调查Radmind,但我不确定这是否是最佳方法。使用内置工具 应该 工作恕我直言,这就是为什么我要联系社区,看看我是否错过了任何明显的东西。我很难成为唯一一个试图这样做的人。 - vpetersson
绝对是内置工具 做 工作,他们只需要很多帮助(构建服务器,本地分发包等) - 它们真正适合管理一台机器,并且不能尽可能地扩展。请注意,我省略了选项 滚动你自己的freebsd-update服务器  - 我从来没有尝试过这个,不仅仅是基础系统,但它是 理论上 可能。我只是坚持我知道的东西:) - voretaq7
是的,实际上这是一个有趣的想法。我只是不确定它是否适用于分发ports-packages而无需进行太多修改。我真的很好奇大型系统的系统管理员如何管理这个,因为有很多大型的FreeBSD部署。他们所有人都推出自己的解决方案吗?如果是这样,那感觉很奇怪,而且不是很开源。 - vpetersson


奇怪,没有人提到 端口,MGMT /的打火匣

Tinderbox是一个基于的FreeBSD端口的包构建系统   在pointyhat构建集群上使用的官方Portbuild脚本。   Tinderbox由Joe Marcus Clarke编写。

您可以定义多个jails(基本系统版本)和多个   portstrees。 jail和portstree的组合称为构建。一个   Tinderbox监狱并不是FreeBSD中的监狱,它是   实际上是一个chroot的特定世界。 Tinderbox支持自动   跟踪依赖关系并仅重建自此以后更改的包   最后一次。 Tinderbox支持失败的电子邮件通知   建立。 Tinderbox还与ccache很好地集成。

Tinderbox旨在轻松提供您的端口包   需要,适用于您需要的平台和架构。 Tinderbox也是   用于测试新端口和端口升级的出色工具,尤其适用于   测试依赖关系和打包列表。它对测试也很有用   各种版本的FreeBSD上的端口,因为你可以运行FreeBSD 6.X   世界作为FreeBSD 7.X / 8.X主机上的监狱。

也切换到 pkgng 大大简化了包部署。
在github上查看: https://github.com/pkgng/pkgng


6
2018-03-06 00:47



虽然在多样化的环境(多个版本,架构等)中构建实际的软件包肯定可能很方便,但它并没有真正解决部署软件包的问题。 - vpetersson
Tinderbox通过HTTP提供软件包,因此您可以将其与voretaq7的答案相结合,以获得您的部署解决方案(例如,设置 PACKAGEROOT / PACKAGESITE 并使用radmind或Puppet / Chef)。 - James O'Gorman
是的,但构建和分发包不是问题。我可以使用portupgrade(-p)来构建包并通过NFS(带或不带ports-tree)分发它们。问题是该模型仍需要a)本地完整的端口树,或b)通过NFS导出的端口树,这使我们回到手头的问题。 - vpetersson
如果您从源代码构建或使用二进制包构建,Portupgrade将完全执行您必须执行的操作 - pkg_delete 必须先运行然后安装新版本。 OpenBSD通过包含升级选项来更好地处理这个问题 pkg_add。不确定Portupgrade,但portmaster只能使用INDEX而不是完整的端口树。 - James O'Gorman
是的,但是pkg_delete不是一个合理的方法。假设您要升级Ruby,Python或任何其他包,这是大量其他包的先决条件。然后pkg_delete将要求您删除所有依赖项,这对于生产系统来说几乎不是一个选项。 Portupgrade做了 远 更好的工作,但同样,它似乎没有规模。 - vpetersson


我通过简单地在经过良好调优的NFS上共享/ usr只读来管理100多个FreeBSD服务器,将包数据库从/ var移动到/ usr并将符号链接移动到它们(不是绝对必要但启用了pkg_info等)。可能有一个或两个其他文件需要在一个方向或另一个方向上移动并符号链接,但整个设置花了我大约一个小时来弄清楚。它的工作非常非常好。如果我遇到扩展问题,我会添加额外的NFS服务器并拆分工作负载,但它从未出现过。性能对我来说从来都不是问题(事实上它很棒)但我想你可以将NFS服务器的/ usr(或其副本)放在md上。


3
2017-07-27 19:44



通过NFS共享构建的包文件(这听起来像你正在谈论的?)当然是另一种合理的方法 - 然后你可以使用像puppet(甚至是自己开发的SSH和shell脚本)之类的东西来安装/升级包来自NFS共享。 - voretaq7


看来没人能很好地解决这个问题。这很可能是由于底层工具的限制。

这就是我想出的:我废弃了将整个ports-tree导出的想法。相反,我放弃并在每个节点上放置一个完整的端口树。然后我通过NFS挂载'包'(以启用包的分发)。

我还打算利用缓存代理(可能是Squid)来加速portnap进程。我写了一篇短文 岗位 关于如何在我的博客上设置这个。

参考文献:


1
2018-05-07 13:26