我想使用 puppet 来管理只读文件系统上的文件。因此,我需要在修改之前将文件系统重新挂载为读写,修改之后再重新挂载为只读。
我制作了两个执行资源:
exec { 'mount rw':
command => "/sbin/mount -uw /",
refreshonly => true,
}
exec { 'mount ro':
command => "/sbin/mount -ur /",
refreshonly => true,
}
file
显然,我希望仅当文件被修改时,它们才会被我的调用。
file { '/root/puppettest':
content => template('mfs/puppettest'),
require => Exec['mount rw'],
notify => Exec['mount ro'],
}
我的问题:mount rw
从未执行,因为require
不被视为刷新。
我怎样才能做这样的事情?
答案1
您可以尝试使用transition
模块来实现这一点。
就像是:
transition { 'mount rw':
resource => Exec['mount rw'],
attributes => { refreshonly => false },
prior_to => File['/root/puppettest'],
}
然后,这应该将refreshonly
属性从转换true
为false
(因此,exec
如果文件需要更改,则使您的第一个资源无条件运行。
您的问题是,如果文件系统以读写方式挂载,并且文件与 Puppet 预期的一致,它将永远不会再以只读方式挂载文件系统。因此,您可能只需使用资源mount
,然后使用transition
资源来更改options
属性,例如:
file { '/root/puppettest':
content => ...
before => Mount['/'],
}
transition { 'remount / rw':
resource => Mount['/'],
attributes => { options => 'rw,...' },
prior_to => File['/root/pupppettest'],
}
mount { '/':
... # Rest of the options skipped for brevity
options => 'ro,...',
remounts => true,
}
然后,您就可以对系统的预期状态进行建模。
答案2
最终代码,以防有人需要它。感谢@bodgit
exec { 'mount rw':
command => "/sbin/mount -uw /",
refreshonly => true,
}
transition { 'remount rw':
resource => Exec['mount rw'],
attributes => { refreshonly => false },
prior_to => File['/root/puppettest'],
}
file { '/root/puppettest':
content => template('mfs/puppettest'),
notify => Exec['mount ro'],
}
exec { 'mount ro':
command => "/sbin/mount -ur /",
refreshonly => true,
}