如果校验和不同,如何替换文件然后重新启动服务?

问题描述

如果校验和与源(从 Puppet Master 中提取的目录)不同,我如何比较租户 VM 中的文件并替换它?如果文件被替换,随后重新启动服务。如果文件相同,则不执行任何操作。

租户 VM /etc/rsyslog.d/proxy.conf 中的文件我有以下代码,但它没有替换(编辑 /etc/rsyslog.d/proxy.conf后执行 puppet agent -t),也没有重新启动服务。

class lin_proxy::service {
  service { 'syslog':
    ensure  => 'running',enable  => true,}
  
  file { '/etc/rsyslog.d/proxy.conf':
    notify         => Service['syslog']
    ensure         => present,path           => '/etc/rsyslog.d/proxy.conf'
    replace        => 'yes',source         => 'puppet:///modules/lin_proxy/proxy.conf',checksum       => 'md5'
    checksum_value => 'dcb0c65283e52fe7aff25cd69200eb69'
    mode           => '0644',owner          => 'root',group          => 'root'
  }
}

解决方法

如果校验和是,我如何比较租户虚拟机中的文件并替换它 与来源不同(从傀儡大师中提取的目录)? 如果文件被替换,随后重新启动服务。如果什么都不做 文件是一样的。

提供的类应该可以完成工作,前提是它实际应用于目标节点,并且所有细节实际上都是正确的(尤其是服务名称和校验和值)。

然而,在资源声明中表达校验和值而不是让 Puppet 在需要时计算它是非常不寻常的,并且在任何其他情况下指定特定校验和算法的情况并不常见。显式指定 replace => 'yes' 也是不常见的,这是默认值,ensure => present 可能没有您想要的那么强。在风格上,在可行的情况下使用链接箭头来表达关系也很常见,并且在与资源标题匹配时显式指定 path 属性是不常见的。

总的来说,我会这样写你的代码:

class lin_proxy::service {
  file { '/etc/rsyslog.d/proxy.conf':
    ensure => 'file',source => 'puppet:///modules/lin_proxy/proxy.conf',mode   => '0644',owner  => 'root',group  => 'root',}

  ~> service { 'syslog':
    ensure => 'running',enable => true,}
}

但是,我不希望该版本能够解决您的问题,这很可能是由于您的班级没有首先分配给目标节点,或者可能是由于环境超时导致 Puppet 无法识别您的班级变化。您可以通过查看节点目录的缓存副本来检查该类和两个资源是否实际存在,以及它们是否具有您期望的属性。

,

我会稍作更改并使用元参数而不是链接箭头。

class lin_proxy::service {
  file { '/etc/rsyslog.d/proxy.conf':
    ensure => 'file',notify  => Service['syslog'],}

 service { 'syslog':
    ensure => 'running',}
}