puppet - 如果校验和不同,如何替换文件然后重新启动服务?
问题描述
如果校验和与源(从 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 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 无法识别您的类更改。您可以通过查看节点对其目录的缓存副本来检查该类和两个资源是否实际存在,以及它们是否具有您期望的属性。
推荐阅读
- c# - Unity C# – 从定义为派生类的变量访问子类属性
- javascript - jQuery ajax 调用有时会执行两次
- ios - XMPP 委托方法已连接未触发
- opendaylight - opendaylight:天才——应用共存
- node.js - 为什么事务回滚后insert查询结果会保留在数据库中?pg-promise
- javascript - O365 JS Web 加载项:Outlook for Mac 上的 BCC 提取器错误
- python - 如何将扩展及其设置添加到 chrome 驱动程序扩展?
- web2py - Web2py 自定义邮箱验证文本
- ruby-on-rails - Ruby on Rails:即使提供了错误数量的参数(0 代表 1)
- angular - null 在 Angular 5 HTTP 获取请求中被转换为“null”