Usando o Puppet para sincronizar dois diretórios

3

Eu tenho um monte de servidores que possuem dois diretórios que precisam estar em sincronia. Por exemplo, no mesmo servidor, posso ter /var/path/to/dir1 e /var/path/to/dir2 , o que poderia ter arquivos e pastas abaixo de cada. Gostaria de sincronizar /var/path/to/dir1 e ter /var/path/to/dir2 como o "backup".

Alguém sabe de uma maneira eficiente no Puppet para sincronizar esses dois diretórios? Eu teria que criar um script personalizado para fazer isso e usar o método exec no arquivo de manifesto do Puppet?

Meu palpite era criar um script para verificar recursivamente o hash MD5 em cada arquivo no diretório principal e, em seguida, verificar os arquivos no segundo diretório com essa lista. Eu não tinha certeza se havia uma maneira de fazer isso no Puppet nativamente.

    
por Jeff Coe 28.11.2014 / 23:01

2 respostas

3

Você estava no caminho certo com o fantoche. Faça com que o mestre de marionetes sirva como a fonte da verdade, aloje-os no servidor que comanda seu mestre de marionetes e declare os arquivos que devem existir e as versões canônicas ali. Você pode até querer versão dos arquivos que você está disponibilizando no servidor puppetmaster usando algo como SVN ou GIT.

Isso fornece algumas strongs garantias sobre o que está nesses dois locais.

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',
}

Como mencionado acima, talvez seja necessário remover todos os extras indesejados coletados com algo como

{
  purge => 'true',
  force => 'true',
}

Como foi apontado para mim (obrigado !!), se houver um grande número de arquivos ou uma hierarquia profunda de sub-pastas sob '/ var / caminho / para / dir1 /', o tempo para completar um fantoche correr pode crescer rapidamente. Eu ainda recomendaria manter seu servidor de marionetes como a fonte da verdade, mas você pode fazer melhor usar o rsync, algo como:

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,
}
    
por 29.11.2014 / 11:56
0

Eu fiquei curioso e experimentei:

[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]#

Então isso funciona.
Note que você precisa de force => true, também.
Caso contrário, as pastas existentes no caminho de destino não serão removidas.

Ou algo assim também funcionará:

rsync::get { '/backup/foo':
  source  => '/foo',
  purge   => true,
}
    
por 29.11.2014 / 11:23