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