Python + vshadow + robocopy-ディレクトリをリモートマシンと同期する

少し前までは、リモートブランチからデータベースをコピーして、オフィスで作成時にデータベースの完全なコピーを受け取るタスクがありました。 理論的には、毎日のコピー。 最初に頭に浮かんだのは、コピー先のrsyncサーバーで、すでにそこからコピーが使用されています。 ボルをすばやく検索したところ、 そこではあまり適切な指示が出なかった。



問題は、クライアントマシンにWindowsシステムがあることです。 また、受信側も同様のOSを使用します。 Linuxのrsyncサーバーは、2台のマシン間の余分なレイヤーです。 WinサーバーにRsyncをインストールすることは可能ですが、他の抽象的な理由のため、不要です。 その結果、独自のディレクトリ同期スクリプトに出会い、シャドウコピーの作成と組み合わせて、新しいソリューションを作成しました。



結果のスクリプトは完全にここにあります 。 この記事では、主なマイルストーンとその結果の機能を簡単に説明します。



スクリプトは、ディスクのシャドウコピーを作成します。 指定されたディレクトリをsmbを介してリモートリソースにコピーします。 ソースと結果のコピーの差が計算されます。 コピーおよび受信した差分に関するレポートを生成し、指定した受信者にメールでレポートを送信します。



上記の記事のように、開始するには、 Microsoft WebサイトからボリュームシャドウコピーサービスSDK 7.2をダウンロードします。 マシンにインストールし、必要なユーティリティを引き出します。

このSDKのvshadow.exeおよびvshadow.pdbファイルが必要です。 注意-64ビットシステムと32ビットシステムでは異なります。



インストール後、次の場所にあります。



64ビット-%PROGRAMFILES%\ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ obj-chk \ amd64

32ビット-%PROGRAMFILES%\ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ release-xp




別のディレクトリに配置します。 私は通常、さまざまなタスク用にc:\ Windows \!Scriptディレクトリを作成しますが、既にサブディレクトリがあります。 これはすべての人にとって個人的な問題です。 結果の2つのファイルとスクリプトをターゲットマシンにコピーし、タスク用にカスタマイズしたスクリプトを作成できます。 ただし、スクリプトの実行に必要なPythonは、各クライアントマシンにインストールする必要があります。



スクリプト本体自体は137行目から始まります。コピーの目標と他の関連機能を設定するには、変数を定義する必要があります。



#################### ##  ## #################### work_dir = 'C:\Windows\!Script\Backup' #   .        vshadow.exe    source_disk = 'c:' destin_disk = 'o:' param_script = 'vs_generated.cmd' #     cwd_list = [['o:\\Windows\\!Script\\Backup', '\\\\master\\apps\\temp\\viv\\backup'],['o:\\ocs-ng', '\\\\master\\apps\\temp\\viv\\ocs-ng']] #   from_addr = 'admin@typa.ru' #    tech_addr = ['user1@typa.ru', 'user1@typa.ru'] #  
      
      







この場合、これはスクリプトが置かれている作業ディレクトリ、コピーのあるターゲットディスク、作成されたシャドウコピーがマウントされるディスクの名前、vshadow.exeユーティリティが変数の値を保存するファイルの名前です。 次に、cwd_list変数には、コピーするディレクトリとコピー先のリストが含まれます。 変数には、2つの要素リストのリストが含まれます。 Pythonでパスのスラッシュをエスケープするには、スラッシュを2回配置し、ネットワークパスへのリンクを4つまで指定する必要があることに注意してください。



メール送信設定の定義を完了します。 レターの送信者のアドレスを含む変数と、受信者のリストを含む変数。



実際、このセクションで変数を定義することは、作業を成功させるために必要なすべてです。 次に、管理者権限で実行を指定することを忘れずに、タスクスケジューラでスクリプトの実行を終了します。 管理者権限がないと、シャドウコピーは作成されません。 ドメイン内のネットワークリソースにコピーする場合、このためにドメイン内に特別に配線されたアカウントを作成することをお勧めします。 したがって、このアカウントのドメイン内のターゲットディレクトリに対する権限を環境設定に設定します。 robocopyユーティリティには、起動するための多くのオプションがあることに注意してください。 この場合、ソースディレクトリとリモートディレクトリは、ntfs権限、監査、ディレクトリの所有者まで完全に同期されます。 一般に、ネットワークディレクトリについては、共有ネットワークリソースへの初期ntfs権限の設定をいじる必要があります。 この情報がすべて必要ない場合は、コピー呼び出しで余分なキーを削除するだけです。



結論として、スクリプトの主要なマイルストーンをすぐに説明します。



169行目から、シャドウコピーを作成します。



 #       #          if not(path.exists(getcwd() + '\\vshadow.exe')) and not(path.isfile(getcwd() + '\\vshadow.exe')) : exit(1) proc = Popen('vshadow.exe -nw -p -script=' + param_script + ' ' + source_disk, shell=True, stdout=PIPE) proc.wait() out = proc.stdout.readlines()
      
      





呼び出しパラメーター-script = '+ param_scriptに注意してください。vshadow.exeの結果、変数の値がこのファイルに配置されます。 それらのうち、作成したシャドウコピーの識別子を含むSHADOW_ID_1のみに関心があります。 実際、さらに受信したファイルを読み取り、さらに作業するために識別子の値を引き出しています。 そして、識別子を見つけた後、シャドウコピーを接続します。



 proc = Popen('vshadow.exe -el=' + SHADOW_ID + ',' + destin_disk, shell=True, stdout=PIPE)
      
      





さらに、すべてが日常的です。 コピーリストを並べ替えます。 ロボコピーを設定します。 ログを読み取り、レポートを生成します。 結論として、関心のあるすべての人に報告書を送ります。 vshadow.exeからシャドウコピーと変数を含むファイルを削除します



PSところで、このスクリプトの開始時に定義ファイルが残っている場合、vshadowはそれを書き換えることができず、スクリプトはそのIDで古いシャドウコピーを接続しようとします。 理論的には、将来、作業の開始時でもこのファイルの存在を確認し、必要に応じて削除しても問題はありません。



PPSディレクトリがコピーされていることに注意してください。 ディスク全体をコピーする場合は、同期手順をわずかに変更する必要があります。 コピーする場合、ログは保持され、ログファイルの名前はソースディレクトリの名前から取得されます。 ディスク、名前、ログファイル、「o:.txt」などを指定するだけの場合、スクリプトは失敗します。 この場合、受信したファイル名のすべての文字が有効であることを確認し、他の文字を削除することをお勧めします。



All Articles