如果Chef配方(或其任何烹饪书依赖项)使用package resource而未指定版本,则会安装最新版本的软件包。如果要控制并准确测试要安装的内容,则必须始终提供软件包版本。当你所依赖的食谱不采取相同的预防措施时,你能做什么?
例如,参见default recipe食谱中的ark。如果在生产服务器上使用此配方,则可以安装尚未测试的软件包。这只是一个例子(下载量超过500万),所以我想知道人们是如何解决这个问题的。
答案 0 :(得分:1)
Chef的package
资源使用节点操作系统的包管理器(如apt,yum等)。这些工具始终安装通过存储库提供的最新版本。这就是为什么厨师的package
资源也会安装此版本。
ark
食谱是什么,它下载源代码然后编译它 - 显然你可以指定要安装的版本(通过传递的URL)。
所以这取决于你的实际需要。如果你想安装通过发行版或你自己的软件包回购提供的版本,那么它就完全没问题了(这就是大多数烹饪书所做的)。如果你想从源代码编译所有东西(你通常可以选择指定版本,那么支持这个版本的厨师烹饪书的覆盖范围会更低。
就个人而言,我建议你为具有特定版本要求的软件设置一个自己的apt / yum / repo。
答案 1 :(得分:1)
简而言之:我没有管理这个。
更完整的答案: 在发布新软件包之前,所有发行版/发行版都经历了验证阶段,我对它充满信心,这有助于我与安全修复程序保持同步。
据我所知,如果它是手动安装的软件包的依赖项,所有软件包管理器都不会以破解方式升级软件包,你必须再次信任软件包维护者。
即:没有版本的软件包资源不会更新make和gcc,如果它是您使用固定版本安装的一个软件包的依赖项。
例如,在ubuntu下,如果你将nagios包设置为手动,它将永远不会尝试通过重大更改来更新libc包,因此我可能会破坏其他包isntallation,因为不满足依赖性。
如果你完全担心它,你有一些选择:
3是最保守的,因为你选择稳定分支中的回购中的东西并且它不会神奇地改变。缺点是您必须管理的安全修复程序。
希望它会有所帮助。
答案 2 :(得分:1)
当您所依赖的食谱不采取相同的预防措施时,您会怎么做?
我认为没有一个简单的答案。这基本上是“厨师方式”......
(实际上,我认为硬接线软件包的版本弊大于利。使用(好)发行版软件包的好处之一就是他们会定期发布带有安全问题补丁的更新但是如果你将固定包版本连接到配方或角色/节点或其他东西,你就可以阻止任何这样的补丁传播到你的系统。)
但是,如果您对包版本稳定至关重要,那么可能......
克隆并破解有问题的食谱以使用特定版本。 (实际上,你可能还是需要这样做,以免被不稳定的食谱误咬!)
使用值得长期稳定的发行版(例如RHEL或其“克隆”),并且只推出“非常重要”的软件包更新。
创建自己的发行版包装仓库的私有镜像,只包含关键包的“好”版本。
修改Chef,以便package
资源默认选择/安装指定的版本。 (我不认为这很容易。但如果你确实在这个级别提出了一个很好的解决方案,那么对于Chef来说这将是一个非常有用的补充!IMO。)
更新
实际上,有一种方法可以为(至少)基于Debian的系统执行此操作;请参阅apt cookbook,特别是“固定”的引用。
或者使用yum,您可以使用“yum versionlock ...”“锁定”特定版本,如下所述:https://www.zulius.com/how-to/yum-install-specific-package-version/
更新 - 2
另一个可能的技巧是将“version
属性”注入“不安全”的包资源中。像这样:
# first, include_recipe a recipe that specifies 'package "foo"' without
# a version attribute
# then ...
r = resources("package[foo]")
r.variables['version'] = "1.2.3"
通过一点点独创性,可以创建一个“包版本锁定”配方,从数据库中提取版本,并处理实际提供的缺少的资源异常和version
属性。但我不知道这是不是“好主意”(tm)。
答案 3 :(得分:1)
我们的食谱中也有同样的问题。所以我们决定使用数据包。
数据包可以轻松更改,例如:
knife data bag from file my_data_bag host1
OR
knife data bag edit my_data_bag host1
您的食谱将能够使用以下代码从数据包中查看指定的版本:
my_bag = data_bag_item('my_data_bag', 'host1')
Chef::Log.info("You have changed the version to: #{my_bag['version']}")
package 'java' do
version my_bag['version']
action :install
end
所以最后你不需要修改Cookbook或Recipe。您只需将版本传递给数据包即可。