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


19

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

我将事情设置如下:

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

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

我无法想到我可以对系统进行的任何其他优化,因为索引现在位于本地,并且唯一真正导出的是端口树,并且节点从未写入任何内容。


一种选择是在每个节点上都有完整的本地端口树(也许只是挂载“ distfiles”和“ packages”),但是这感觉像是在浪费大量空间(更不用说很多不必要的更新了)。
vpetersson '02

vpeterson:这是一个需要提出的问题(我现在对此事被封锁。+ 5票和3星表示我们并不孤单)。也许清理此问题并说明您要解决的一些特定问题。(FWIW,有人投票结束了您的问题。我个人非常希望看到这个问题或类似的问题得以保存)。
Stefan Lasiewski 2012年

我不确定如何使问题更清楚。我也不认为@ voretaq7实际上回答了问题,而是建议了另一种方法。问题实际上是关于该主题的建议-人们如何在多节点环境中部署FreeBSD的端口。
vpetersson 2012年

Answers:


13

我从来没有对大型环境中的端口系统完全满意-似乎总是需要对它进行一些外部管理才能使其正常运行。

我的最佳建议(按偏好升序,从“最差”的解决方案到“最佳”的解决方案):


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


使用构建主机,创建软件包并安装它们。
与在每台单独的计算机上构建相比,更好的解决方案是:使用构建主机创建软件包,然后将工具指向这些软件包。
这意味着您可以为运行的每个架构(或交叉编译)保留一个构建主机,但是最终对于目标计算机更好(没有大量的编译工作,保证了一致性)


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

警告:仅当您的计算机“相同”时,这才非常有效-也就是说,您可以在所有计算机上安装相同的端口集。如果您具有不同的端口集,那么它可以工作,但是这会大大增加管理开销。

免责声明:我是的端口维护者sysutils/radmind。是的,我非常喜欢它,因此我采纳了它。


所有这些都是基于我在管理各种大小的FreeBSD环境(从1-2台机器到超过100台机器)的经验。根据我的经验,推动和维护标准化映像的配置/系统管理工具确实是处理此问题的最佳方法。


好指针。我过去曾与Puppet一起玩过,并且在Ubuntu上喜欢它。但是,我不确定它在FreeBSD中的表现如何。我还没有尝试。无论如何,即使使用Puppet,我认为它也需要Portupgrade,这使我们回到了平方。我没有看到它可以工作的其他方式,因为那样就需要执行pkg_delete / pkg_add或'pkg_add -f',这不是一个好主意。就硬件而言,它们都是相同的,因为它们在公共云(KVM / Qemu)中运行。
vpetersson '02

如果您的硬件和基准软件配置相同,则建议使用radmind之类的东西来管理整个系统映像。Puppet和Chef是很棒的工具,但是正如您所指出的那样,它们称为底层OS二进制文件,这使您不再使用构建主机和分发软件包。radmind通过在文件系统级别上接管管理来避免这种情况(“如果不是这里所说的,请替换或删除它”),而不是尝试充当代理sysadmin(“为我运行这些命令/更改这些文件以配置框”)。
voretaq7 2012年

嗯,这些系统具有相同的硬件,但配置不同。我将不得不研究Radmind,但是我不确定这是否是最好的方法。使用内置工具应该可以恕我直言,这就是为什么我向社区伸出援手,看看我是否错过了任何明显的事情。我很难成为唯一尝试这样做的人。
vpetersson 2012年

内置的工具,绝对DO工作,他们只是需要一个很大的帮助(构建服务器,包的地方分布等) -他们是向管理一台机器确实面向,而且扩展,以及他们可能。请注意,我没有选择滚动您自己的freebsd-update服务器的选项-我从未尝试过将其用于基础系统之外,但从理论上讲是可行的。我只是坚持那些我知道的东西:)
voretaq7

是的,实际上这是一个有趣的想法。我只是不确定它是否可以在不做大量修改的情况下与分发port-packages一起使用。我真的很好奇大型系统的系统管理员如何管理这一点,因为FreeBSD有大量的大型部署。他们都推出自己的解决方案吗?如果是这样,那感觉很奇怪,而且不是开源的。
vpetersson 2012年

6

奇怪的是没有人提到ports-mgmt / tinderbox

Tinderbox是基于Pointyhat构建集群上使用的官方Portbuild脚本的,用于FreeBSD端口的软件包构建系统。Tinderbox由乔·马库斯·克拉克(Joe Marcus Clarke)撰写。

您可以定义多个监狱(基本系统版本)和多个端口树。jail和portstree的组合称为构建。Tinderbox监狱在FreeBSD中不是什么监狱,实际上是chroot中的特定世界。Tinderbox支持自动跟踪依赖关系,并且仅重建自上次运行以来已更改的软件包。Tinderbox支持失败构建的电子邮件通知。Tinderbox还可以与ccache很好地集成。

Tinderbox旨在轻松为您所需的平台和体系结构提供所需端口的软件包集。Tinderbox还是测试新端口和端口升级的出色工具,尤其是用于测试依赖项和装箱单。这对于测试各种版本的FreeBSD上的端口也很有用,因为您可以在FreeBSD 7.X / 8.X主机上像监狱一样运行FreeBSD 6.X world。

另外,切换到pkgng可以大大简化软件包的部署。
在github上查看它:https : //github.com/pkgng/pkgng


1
尽管在不同环境(多个版本,体系结构等)中构建实际的软件包当然很方便,但这并不能真正解决部署软件包的问题。
vpetersson 2012年

Tinderbox通过HTTP提供了这些软件包,因此您可以将其与voretaq7答案中的注释结合起来以获取您的部署解决方案(例如,设置PACKAGEROOT/ PACKAGESITE并使用radmind或Puppet / Chef)。
James O'Gorman 2012年

是的,但是构建和分发软件包不是问题。我可以使用portupgrade(-p)来构建软件包并通过NFS(带有或不带有ports-tree)分发它们。问题在于该模型仍然需要a)本地完整的端口树,或b)通过NFS导出的端口树,这使我们回到了手头的问题。
vpetersson 2012年

2
如果您是从源代码构建或使用二进制软件包,Portupgrade会执行您必须要做的事情- pkg_delete必须先运行然后安装新版本。OpenBSD通过在中添加升级选项来更好地解决了这一问题pkg_add。不确定Portupgrade,但portmaster只能使用INDEX而不是完整的端口树来工作。
James O'Gorman 2012年

1
是的,但是pkg_delete几乎不是一个合理的方法。假设您要升级Ruby,Python或其他大量软件包的先决条件。然后,pkg_delete将要求您删除所有依赖项,这对于生产系统而言几乎不是一个选择。Portupgrade在此方面做得更好,但同样,它似乎无法扩展。
vpetersson 2012年

3

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


通过NFS共享构建的软件包文件(这听起来像您在说什么?)当然是另一种合理的方法-然后,您可以使用puppet之类的东西(甚至是本地的SSH和Shell脚本)来安装/升级软件包。从NFS共享。
voretaq7

1

似乎没有人为此提供良好的解决方案。这很可能是由于底层工具的限制。

这是我的想法:我放弃了将整个ports-tree导出的想法。相反,我屈服了,并在每个节点上放置了完整的端口树。然后,我在NFS上挂载了“程序包”(以启用程序包的分发)。

我还打算利用缓存代理(可能是Squid)来加快portnap进程。我在博客上写了一篇简短的文章,介绍如何设置它。

参考文献:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.