Chef中的apt-get update和apt-get upgrade

19
如果在Chef中“nginx”包被翻译为在Ubuntu节点上的apt-get install nginx,那么在一个Chef配方中可以写什么来进行翻译:
apt-get -y update
apt-get -y upgrade

无法从 apt 食谱 中找出。


这个 https://github.com/patdeegan/chef-unattended-upgrades 有用吗? - favoretti
我认为是这样,但如果有更轻便的解决方案,我很感兴趣。 - Marius Butuc
2个回答

44
Opscode "apt" cookbook 的默认食谱将运行 apt-get update 以确保软件包缓存已更新。我们建议将其放在节点的运行列表中的较早位置,以便稍后可以使用正确版本安装软件包。
通常,我们不建议用户在食谱中使用 "apt-get upgrade",原因有几个。
  1. apt-get 可能会升级具有冲突配置或其他问题的软件包,而这些问题需要再次运行该命令或手动运行其他 apt/dpkg 命令才能解决。
  2. 系统上所有软件包的自动升级可能会对正在运行的系统产生意外的副作用(边缘情况很多,可能很棘手,因此我无法涵盖它们所有)。
相反,请使用 "upgrade" 操作来更新应始终更新到最新版本的软件包。
package "nginx" do
  action :upgrade
end

如果您正在重复使用定义了该菜谱的菜谱,您可以编写一个修改现有资源动作的食谱,如下所示:
resources("package[nginx]").action(:upgrade)

The #resources 方法会在 Resource Collection 中查找指定的资源(nginx 包)。然后,使用参数 :upgrade 调用 #action 方法告诉 Chef 应该执行升级操作。 更新:选择自动升级的软件包时要小心。软件包的上游更改可能对系统产生负面影响,特别是如果这样的软件包在安装后脚本期间重新启动它管理的服务。了解您的基础架构,并且如果不确定,请运行自己的软件包存储库,其中包含应用程序堆栈所需的关键软件包。

6
大家都这么说,但我无法在包含apt cookbook并调用其默认recipe时更新仓库列表。更糟糕的是,如果另一个被合并到我的某个recipe中的recipe依赖于apt,那么除了手动登录节点进行更新外似乎没有其他可能的方法。我希望能够在某个地方找到明确的说明,以解决在使用apt cookbook的情况下如何更新apt-get仓库的问题。 - wkhatch
似乎apt只会每24小时更新一次。这个临时文件控制着这个过程。/var/lib/apt/periodic/update-success-stamp - jorfus

0
Apt chef 配方不会在每次运行时更新。控制此行为的属性称为 periodic_update_min_delay,设置为 86400(应将属性称为 sec_delay)。如果存在以下文件并且距今超过 24 小时,则 apt 将更新缓存。
/var/lib/apt/periodic/update-success-stamp

看起来apt配方(default.rb)还包括一个指令来强制更新,你的配方可以调用它。

# For other recipes to call to force an update
execute 'apt-get update' do

如果你这样做,你会想要一个 not_if 来避免过于频繁地运行它,此时你可能会想手动调用它。我厌倦了这个问题,最终在我的安装之前的一个 stanza 中直接调用了 apt-get update。
execute "apt-get-update" do
  command "apt-get update"
end

我猜测长期的安全更新解决方案是将更新延迟设置为几小时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接