Назад | Перейти на главную страницу

Puppet: изменить файл в файловой системе только для чтения

Я хотел бы использовать марионетку для управления файлами в файловых системах, доступных только для чтения. Поэтому мне нужно перемонтировать файловую систему для чтения и записи перед изменением, а затем - только для чтения.

Я сделал два ресурса exec:

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 не считается обновлением.

Как я могу сделать что-то подобное?

Вы можете попробовать использовать 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,
}

Затем вы моделируете предполагаемое состояние системы.

Финальный код, если он кому-то понадобится. Кредиты для @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,
}