如何使用 Puppet 恢复配置

如何使用 Puppet 恢复配置

我编写了一个模块,它使用 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 有办法做到这一点,它也可能会摧毁你的系统。

相关内容