Puppet:在只读文件系统上更改文件

Puppet:在只读文件系统上更改文件

我想使用 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属性从转换truefalse(因此,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,
}

相关内容