![标准软件包列表](https://linux22.com/image/586593/%E6%A0%87%E5%87%86%E8%BD%AF%E4%BB%B6%E5%8C%85%E5%88%97%E8%A1%A8.png)
我正在学习 puppet 系统,现在需要完成下一个任务。我们有几个服务器,它们使用相同的操作系统 (Altlinux p6,t6) - puppet-agents 和一个 puppet-master。
代理上安装了一些软件包,例如,第一个上有 200 个软件包,第二个上有 300 个软件包……但我们只需要安装 180 个。我们知道必需软件包的名称,但不知道其他(不必要的软件包)的名称。
我的问题是:如何检查或安装(如果尚未安装)必要的包并删除其他包(我们不知道其他已安装包的名称)?
请帮助
WBR瓦伦丁
答案1
我研究过这个问题,并得出结论,虽然可以通过为要拉取的包定义带有 Package{ensure => Absent} 的 puppet 模块来实现这一点,但还没有现成的方法来实现
据我所知,没有用于批量删除包的本机方法。我考虑编写一些脚本,使用 foreach 循环从配置文件中读取行分隔列表后提取不需要的包。
但最终我发现最干净的解决方案是构建新服务器,并从一开始就使用 Puppet 进行所有管理。您的结果可能会有所不同。
答案2
这应该有效:
resources { 'package':
purge => true,
}
一开始我会这么做:
resources { 'package':
purge => true,
noop => true,
}
然后检查日志以查看它会做什么。只有当我确信它工作正常时,我才会删除noop
。
无论如何,它的作用是告诉 Puppet 删除所有类型的资源package
(如名称所示 -resource { 'user': purge => true }
例如,将删除用户),这些资源不是由 Puppet 管理。也就是说,如果您有一行package { 'x': }
,则该包即使安装也不会被删除。任何没有此类声明的包都将被删除。
答案3
Puppet 只能按照您的要求执行操作,就像一个人无法通过某种方式生成列表来为您执行操作一样。您需要告诉 Puppet 哪些包不属于该机器。
正如 Tim 所建议的,最简单的解决方案是使用 Puppet 重新映像并正确地构建机器。