我编写了一个模块,它使用 puppet 在 /etc/rsyslog.d/60-custconfig.conf 中为 rsyslog 写入配置。
当我将模块添加到节点时,它可以工作,但如果我删除注释或删除节点中的模块调用,是否应该删除该文件?如果没有,是否有办法回滚配置或安装?
答案1
您不会通过删除资源来恢复 Puppet 已执行的操作。通过从清单中删除资源,您只是告诉 Puppet 不要再管理它了。
此外,Puppet 根本不记得/不知道以前的状态,所以它无法恢复到以前的状态。它只是试图将系统更改为您在清单中定义的状态。
我在这里看到的一种方法是再次包含file
资源,但现在是ensure => absent
:
file {
'/etc/rsyslog.d/60-custconfig.conf':
ensure => absent,
}
您还可以通过以下方式更改 Puppet 模块的设计:
- 管理rsyslog模块中的所有rsyslog配置文件。
- 创造虚拟的来自其他模块的自定义类型需要在 rsyslog 中进行更改。
- 在 rsyslog 模块中,收集虚拟配置节并指示它删除该自定义类型的所有未定义资源。
或者更简单的方法是使用puppetlabs-concat模块,在模块中定义虚拟 concat::fragments 并将它们收集到 rsyslog 模块中以构建“60-custconfig.conf”配置文件。如果虚拟资源从其他模块中删除,则收集的片段将导致文件没有现在不受管理的片段。实际上,这些将从文件中删除。
答案2
您必须明确编写代码来“撤消”您想要恢复的任何特定操作。
例如,如果你有一个my_apache
模块,它安装了一些包,配置了几个文件,并确保了某种状态,那么你必须在这个模块中编写另一个类,我们称之为my_apache::uninstall
撤消每个您的其他模块所做的事情。撤消类不必位于原始模块内部或原始模块的一部分。它可以是一个完全独立的类。更改应用于主机的类的一个好方法是使用电子海图。
答案3
没有简单的答案可以恢复或删除 Puppet 中的配置更改,但一个简单的方法是使用 Puppet 管理的配置目录。
class rsyslog::config {
file { '/etc/rsyslog.d':
ensure => directory,
force => true,
purge => true,
recurse => true,
}
file { '/etc/rsyslog.conf':
ensure => present,
content => template('rsyslog/rsyslog.conf.erb'),
}
file { '/etc/rsyslog.d/50-default.conf':
ensure => present,
content => template('rsyslog/50-default.conf.erb'),
require => File['/etc/rsyslog.d'],
}
}
上述操作的作用是告诉 Puppet 完全拥有 /etc/rsyslog.d/ 中的所有内容,并删除 Puppet 无法在其中管理的所有内容。如果服务器之前运行的是 haproxy,并且您的 syslog 中有该配置,则当您删除 happroxy 模块时,对 /etc/rsyslog.d/40-haproxy.conf 的引用将消失,Puppet 会将其从配置目录中删除。它还会生成一个通知事件,您可以使用该事件让 Puppet 重新启动 syslog,尽管您需要一个通知或 ~> 链接到服务才能执行此操作。
答案4
详细说明已经发布的答案:Puppet 管理资源。管理意味着它了解资源的状态并确保资源处于所需状态。您告诉 Puppet 要管理什么以及以何种方式管理它。一旦 Puppet 不再了解某个资源,它显然就无法再管理它。这就是 Puppet 的工作方式。
想象一下,如果 Puppet 只是删除了它不再知道的资源,它会对系统造成多大的破坏。这本身听起来已经很矛盾了;你如何删除你不知道的东西?但即使 Puppet 有办法做到这一点,它也可能会摧毁你的系统。