关于Puppet Package资源的疑问:已安装包遇仓库更新是否自动升级?
嘿,这个问题问到点子上了——很多刚接触Puppet的同学都会对Package资源的默认行为产生疑惑,我来给你掰扯清楚:
首先,默认情况下,Puppet不会自动升级你的Apache包。原因很简单:当你只声明package { 'apache2': }(或者显式写ensure => present)时,Puppet的核心逻辑是「确保这个包已经安装在系统上」,而不是「确保它是最新版本」。
举个例子,你第一次运行Puppet Agent时,系统里没有Apache,Puppet会调用apt-get install apache2把它装上。但之后如果Ubuntu仓库推了Apache的新版本,再次运行Agent时,Puppet只会检查「apache2是不是已经装了」——只要已经存在,它就不会做任何升级操作。
那如果想要让Puppet自动帮你把包升级到仓库最新版本呢?只需要把ensure属性的值改成latest就行:
package { 'apache2': ensure => latest, }
这样配置后,每次Puppet Agent运行时,都会对比本地安装的Apache版本和仓库里的最新版本:如果本地版本更旧,就会自动执行apt-get install --only-upgrade apache2来升级。
不过这里有个小细节要注意:默认情况下,Puppet不会自动帮你跑apt-get update。也就是说,如果你的系统本地的源缓存不是最新的,Puppet可能识别不到仓库里的新版本。所以如果要确保能拿到最新的包,最好先加一个更新源的步骤,比如:
# 只有当源缓存过期时才执行apt-update exec { 'apt_update': command => '/usr/bin/apt-get update', onlyif => '/usr/bin/test ! -f /var/lib/apt/periodic/update-success-stamp -o /var/lib/apt/periodic/update-success-stamp -ot /var/lib/apt/lists/*', } package { 'apache2': ensure => latest, require => Exec['apt_update'], # 确保先更新源再检查包版本 }
最后还要提一句:生产环境里用ensure => latest要谨慎,因为新版本的软件可能引入兼容性问题或者bug,最好先在测试环境验证过再推广到生产。
内容的提问来源于stack exchange,提问作者Sarath S

