如果校验和不同,如何替换文件然后重新启动服务?
How to replace file if checksum is different and then restart the service?
如果校验和与源(从 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'
}
}
How do I compare a file in tenant VM and replace it if checksum is
different from the source (catalog pulled from Puppet Master)?
Subsequently restart the service if file is replaced. Do nothing if
file is the same.
提供的class应该可以完成工作,前提是它实际应用于目标节点,并且所有细节实际上都是正确的(尤其是服务名称和校验和值)。
然而,在资源声明中表达校验和值而不是让 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,
}
}
但是,我不希望该版本能够解决您的问题,这很可能是由于您的 class 一开始没有分配给目标节点,或者可能是环境超时导致防止 Puppet 识别您的 class 更改。您可以通过查看节点缓存的目录副本来检查 class 和这两个资源是否实际存在,以及它们是否具有您期望的属性。
我会稍作更改并使用元参数而不是链接箭头。
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',
notify => Service['syslog'],
}
service { 'syslog':
ensure => 'running',
enable => true,
}
}
如果校验和与源(从 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'
}
}
How do I compare a file in tenant VM and replace it if checksum is different from the source (catalog pulled from Puppet Master)? Subsequently restart the service if file is replaced. Do nothing if file is the same.
提供的class应该可以完成工作,前提是它实际应用于目标节点,并且所有细节实际上都是正确的(尤其是服务名称和校验和值)。
然而,在资源声明中表达校验和值而不是让 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,
}
}
但是,我不希望该版本能够解决您的问题,这很可能是由于您的 class 一开始没有分配给目标节点,或者可能是环境超时导致防止 Puppet 识别您的 class 更改。您可以通过查看节点缓存的目录副本来检查 class 和这两个资源是否实际存在,以及它们是否具有您期望的属性。
我会稍作更改并使用元参数而不是链接箭头。
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',
notify => Service['syslog'],
}
service { 'syslog':
ensure => 'running',
enable => true,
}
}