Puppet Ubuntu 删除不再需要的软件包

Puppet Ubuntu 删除不再需要的软件包

自学木偶。

使用 Ubuntu 11.10 Puppet 2.7.1(直接从 apt 下载)

在单个节点上运行一些测试脚本(如下http://docs.puppetlabs.com/learning/manifests.html)。

我制作了一个清单来安装并启动 apache2 包...一切都很好。

现在我想逆转这种情况,我制作了一个清单来清除 apache2 包。这成功完成了,问题是 puppet 只删除了 apache2 包,而不是 apache2 带来的所有包(我认为 apache2.2-bin 是主要的包)... 因此 apache2 服务仍然安装并在系统上运行。

如果我使用 apt-get 执行此操作,那么我只需执行“apt-get autoremove”,但我如何让 puppet 为我执行此操作?

答案1

不幸的是,没有好的办法可以用内置资源类型来实现这一点,只有两个不太好的选择。

“正确”的方法包括package为所有想要删除的包定义一个资源:

package { 'apache2.2-common':
    ensure => purged,
}
package { 'apache2-utils':
    ensure => purged,
}
# etc ...

而“不恰当”但更易于管理的方法是设置一个exec资源,以便在删除 apache2 包时运行依赖包的自动删除:

package { 'apache2':
    ensure => purged,
}
exec { 'autoremove':
    command => '/usr/bin/apt-get autoremove --purge -y',
    # We don't want this running every time the puppet agent runs, 
    # so we'll set it to only run when the apache2 purge actually happens.
    # Note that this would not run on your node that already has the
    # apache2 package removed, since it won't trigger any more changes
    # to the package.
    refreshonly => true,
    subscribe => Package['apache2'],
}

考虑到这两个选项,第二个选项肯定更有吸引力——尽可能坚持使用内置类型是件好事,但当你删除具有大量依赖项的包时,这并不切实际。

答案2

您可以拥有一个仅在删除 apache 包时运行的 exec 资源。

package { "apache2":
  ensure => absent,
}

exec { "remove-apache-dependencies"
  command => "apt-get -y autoremove",
  subscribe => Package["apache2"],
  refreshonly => true,
}

相关内容