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

Использование Puppet для синхронизации двух каталогов

У меня есть несколько серверов с двумя каталогами, которые необходимо синхронизировать. Например, на том же сервере у меня может быть /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,
}