У меня есть несколько серверов с двумя каталогами, которые необходимо синхронизировать. Например, на том же сервере у меня может быть /var/path/to/dir1
и /var/path/to/dir2
которые могут иметь файлы и папки под каждым. Я бы хотел синхронизировать /var/path/to/dir1
и имеют /var/path/to/dir2
как «резервную копию».
Кто-нибудь знает, как в Puppet эффективно синхронизировать эти два каталога? Придется ли мне для этого создать собственный сценарий и использовать exec
в файле манифеста Puppet?
Я предполагал создать сценарий для рекурсивной проверки хэша MD5 для каждого файла в основном каталоге, а затем проверить файлы во втором каталоге с помощью этого списка. Я не был уверен, есть ли способ сделать это в Puppet изначально.
С марионеткой вы были на правильном пути. Пусть кукловод служит источником истины, разместите их на сервере, на котором работает ваш кукловод, и объявите там файлы и канонические версии, которые должны существовать. Возможно, вы даже захотите изменить версии файлов, которые вы делаете доступными на сервере 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,
}