web-dev-qa-db-ja.com

Puppetを使用して2つのディレクトリを同期する

同期する必要のある2つのディレクトリを持つサーバーがたくさんあります。たとえば、同じサーバー上に/var/path/to/dir1/var/path/to/dir2があり、それぞれの下にファイルとフォルダーがあります。 /var/path/to/dir1を同期し、/var/path/to/dir2を「バックアップ」として使用したいと思います。

Puppetでこれら2つのディレクトリを同期する効率的な方法を知っている人はいますか?これを行うためにカスタムスクリプトを作成し、Puppetマニフェストファイルでexecメソッドを使用する必要がありますか?

私の推測では、プライマリディレクトリ内のすべてのファイルのMD5ハッシュを再帰的に検証し、次にそのリストを使用して2番目のディレクトリ内のファイルを検証するスクリプトを作成しました。 Puppetでこれをネイティブに行う方法があるかどうかはわかりませんでした。

3
Jeff Coe

あなたは人形で正しい軌道に乗っていました。 puppetmasterを信頼できる情報源として機能させ、puppetmasterを実行するサーバーに格納し、存在する必要のあるファイルとそこにある正規バージョンを宣言します。 SVNやGITなどを使用して、puppetmasterサーバーで使用できるようにしているファイルをバージョン管理することもできます。

これにより、これら2つの場所に何があるかについての強力な保証が提供されます。

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
DTK

私は興味を持ってそれを試してみました:

[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
faker