У меня есть набор серверов, которые имеют два каталога на них, которые должны быть в синхронизации. Например, на том же сервере я мог бы иметь /var/path/to/dir1
и /var/path/to/dir2
который мог иметь нижнюю часть файлов и папок каждого. Я хотел бы синхронизировать /var/path/to/dir1
и имейте /var/path/to/dir2
как "резервное копирование".
Кто-либо знает эффективный способ в Марионетке синхронизировать эти два каталога? Я должен был бы создать пользовательский сценарий, чтобы сделать это и использовать exec
метод в Марионеточном файле манифеста?
Мое предположение должно было создать сценарий, чтобы рекурсивно проверить хеш MD5 на каждом файле в основном каталоге и затем проверить файлы во втором каталоге с тем списком. Я не был уверен, был ли способ сделать это в Марионетке исходно.
С марионеткой вы были на правильном пути. Пусть кукловод служит источником истины, разместите их на сервере, на котором работает ваш марионеточный мастер, и объявите там файлы и канонические версии, которые должны существовать. Возможно, вы даже захотите изменить версии файлов, которые вы делаете доступными на сервере puppetmaster, используя что-то вроде SVN или GIT.
Это дает вам надежные гарантии относительно того, что находится в этих двух местах.
file { '/var/path/to/dir1/':
ensure => 'present',
source => 'puppet:///path/to/dir1',
recurse => 'true',
}
file { '/var/path/to/dir2/':
ensure => 'present',
source => 'puppet:///path/to/dir1',
recurse => 'true',
}
Как упоминалось выше, вам может потребоваться удалить все собранные нежелательные дополнения с помощью чего-то вроде
{
purge => 'true',
force => 'true',
}
Как было указано мне (спасибо !!), если имеется большое количество файлов или глубокая иерархия подпапок в '/ var / path / to / dir1 /' время выполнения марионеточного запуска может быстро увеличиваться.Я бы по-прежнему рекомендовал сохранить ваш марионеточный сервер как источник истины, но вам может быть лучше использовать rsync, например:
rsync::get { '/var/path/to/dir1/':
source => 'puppet:///path/to/dir1',
purge => true,
}
rsync::get { '/var/path/to/dir2/':
source => 'puppet:///path/to/dir1',
purge => true,
}
Мне стало любопытно, и я попробовал:
[root@localhost vagrant]# cat test.pp
file { '/tmp/path2':
ensure => directory,
source => 'file:///tmp/path1',
recurse => true,
purge => true,
force => true,
}
[root@localhost vagrant]# ls -lR /tmp/path1
/tmp/path1:
total 4
-rw-r--r-- 1 root root 0 Nov 29 01:55 bar
drwxr-xr-x 2 root root 4096 Nov 29 02:07 folder
-rw-r--r-- 1 root root 0 Nov 29 01:55 foo
-rw-r--r-- 1 root root 0 Nov 29 01:55 x
/tmp/path1/folder:
total 0
-rw-r--r-- 1 root root 0 Nov 29 02:07 xxx
[root@localhost vagrant]# ls -lR /tmp/path2/
/tmp/path2/:
total 4
-rw-r--r-- 1 root root 0 Nov 29 02:17 deleteme
drwxr-xr-x 2 root root 4096 Nov 29 02:17 folder2
/tmp/path2/folder2:
total 0
-rw-r--r-- 1 root root 0 Nov 29 02:17 deleteme
[root@localhost vagrant]# puppet apply test.pp
Notice: Compiled catalog for localhost in environment production in 0.04 seconds
Notice: /Stage[main]/Main/File[/tmp/path2/x]/ensure: defined content as '{md5}d41d8cd98f00b204e9800998ecf8427e'
Notice: /Stage[main]/Main/File[/tmp/path2/deleteme]/ensure: removed
Notice: /Stage[main]/Main/File[/tmp/path2/folder]/ensure: created
Notice: /Stage[main]/Main/File[/tmp/path2/folder/xxx]/ensure: defined content as '{md5}d41d8cd98f00b204e9800998ecf8427e'
Notice: /Stage[main]/Main/File[/tmp/path2/bar]/ensure: defined content as '{md5}d41d8cd98f00b204e9800998ecf8427e'
Notice: /Stage[main]/Main/File[/tmp/path2/folder2]/ensure: removed
Notice: /Stage[main]/Main/File[/tmp/path2/foo]/ensure: defined content as '{md5}d41d8cd98f00b204e9800998ecf8427e'
Notice: Finished catalog run in 0.06 seconds
[root@localhost vagrant]# diff -r /tmp/path1 /tmp/path2
[root@localhost vagrant]#
Так что работает.
Обратите внимание, что вам нужно force => true,
тоже.
В противном случае существующие папки в пути назначения не будут удалены.
Или что-то вроде этого также будет работать:
rsync::get { '/backup/foo':
source => '/foo',
purge => true,
}