Я нахожусь в несколько затруднительном положении из-за того, что случайно удалил несколько ТБ важных данных через Puppet, и я просто пытаюсь понять, почему это могло произойти.
Во-первых, я почти уверен, что причина, по которой он исчез (как и в случае неисправности, за исключением резервных копий):
File { backup => false }
в моем site.pp. Узлы были настроены для жесткого монтирования чего-либо через NFS, поэтому точка монтирования / монтирование и строка в fstab выглядят так:
nfsserver:/mount /mount nfs <options> 0 0
Я хотел избавиться от монтирования и заменить его символической ссылкой на то же возможное местоположение (хотя и другим путем).
Мой манифест марионетки выглядел так:
class symlinks::linkdirtest ( ) {
file { '/mount':
ensure => "link",
target => "/anotherdir/mount",
}
mount { "/mount":
ensure => "absent",
}
}
Это привело к следующему при выполнении марионеточного пробега:
notice: /Stage[main]/Symlinks::Linkdirtest/File[/mount]: Not removing directory; use 'force' to override
Итак, я должным образом (или глупо) добавил:
class symlinks::linkdirtest ( ) {
file { '/mount':
ensure => "link",
target => "/anotherdir/mount",
force => "true",
}
....
И, о чудо, марионетка отправила в забвение содержимое важнейшего скакуна, в то время как сама точка крепления осталась.
Есть идеи, почему это могло произойти?
Спасибо
Он заменил этот каталог ссылкой:
http://docs.puppetlabs.com/references/latest/type.html#parameters-4
Под «силой»:
«Заменить каталоги файлами или ссылками»
Для справки в будущем вы можете попробовать запустить в режиме noop, чтобы увидеть, какие изменения будут внесены:
puppet agent --test --debug --noop --show-diff
Помимо тестирования прогонов марионеток перед их применением вы также должны помнить, что порядок, в котором вы пишете код марионетки, не всегда соответствует порядку, в котором выполняется марионетка. В этом случае вы должны были определить порядок. Вы должны сначала размонтировать, прежде чем произойдет символическая ссылка. Вы могли сделать это следующим образом:
class symlinks::linkdirtest ( ) {
file { '/mount':
ensure => "link",
target => "/anotherdir/mount",
}
mount { "/mount":
ensure => "absent",
before => File['/mount'],
}
}