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

У меня есть набор серверов, которые имеют два каталога на них, которые должны быть в синхронизации. Например, на том же сервере я мог бы иметь /var/path/to/dir1 и /var/path/to/dir2 который мог иметь нижнюю часть файлов и папок каждого. Я хотел бы синхронизировать /var/path/to/dir1 и имейте /var/path/to/dir2 как "резервное копирование".

Кто-либо знает эффективный способ в Марионетке синхронизировать эти два каталога? Я должен был бы создать пользовательский сценарий, чтобы сделать это и использовать exec метод в Марионеточном файле манифеста?

Мое предположение должно было создать сценарий, чтобы рекурсивно проверить хеш MD5 на каждом файле в основном каталоге и затем проверить файлы во втором каталоге с тем списком. Я не был уверен, был ли способ сделать это в Марионетке исходно.

3
задан 19 June 2017 в 20:50
2 ответа

С марионеткой вы были на правильном пути. Пусть кукловод служит источником истины, разместите их на сервере, на котором работает ваш марионеточный мастер, и объявите там файлы и канонические версии, которые должны существовать. Возможно, вы даже захотите изменить версии файлов, которые вы делаете доступными на сервере 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,
}
3
ответ дан 3 December 2019 в 06:33

Мне стало любопытно, и я попробовал:

[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,
}
0
ответ дан 3 December 2019 в 06:33

Теги

Похожие вопросы