首页 > 解决方案 > 如果校验和不同,如何替换文件然后重新启动服务?

问题描述

如果校验和与源(从 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'
  }
}

标签: puppetpuppet-enterprise

解决方案


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

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

然而,在资源声明中表达校验和值而不是让 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 无法识别您的类更改。您可以通过查看节点对其目录的缓存副本来检查该类和两个资源是否实际存在,以及它们是否具有您期望的属性。


推荐阅读