大量のリモートサーバ(複数ドメイン)にファイルを配布する

300台程度のサーバー(複数ドメイン)にフォルダ・ファイルを配布する必要性が出てきたので作成。

1. 動作確認環境

  • WindowsServer 2012R2 Std
  • Powershell4.0

2. やりたいこと

  • ドメインのリモートサーバの任意のフォルダ配下にフォルダ・ファイルを配布したい
  • 配布先の指定にはUNCパスを用いたい(管理共有機能を用いる)

3. 処理の流れ

以下の処理を配布する資材単位で実行する。

一括して大量のサーバに資材を配布する場合は、CSVファイル等を作成し、配布先サーバ情報やログイン資格情報、配布資材情報を定義し、順次処理するようにすると良い。

  1. "net use"コマンドで配布先サーバの管理共有リソースにリモート接続
  2. "Copy-Item"コマンドレットで配布先サーバに資材配布
  3. "Get-ChildItem"コマンドレットで資材配布結果確認
  4. "net use /delete"コマンドでリモート接続削除

4. 実装例

以下に実装例を示す。(例外処理は割愛)

# 配布先サーバFQDN or IPアドレス
$remote_server = "sampleserver01.hoge.local"
# リモート接続マウントポイント
$mount_point = "\\$hostname\d$"
# ローカルサーバ上の配布元資材格納先フォルダ
$src_path = "D:\work\installer\*"
# 配布先サーバ上の資材格納先フォルダ
$dst_path = "$mount_point\tmp\installer\"
# ログインユーザ
$user = "hoge\admin01"
# ログインパス
$pass = "password"

# 1. 配布先サーバの管理共有リソースにリモート接続
net use $mount_point ("/user:$user") $pass
# 2. 配布先サーバに資材配布
Invoke-Expression ("Copy-Item $src_path $dst_path -Force -Recurse")
# 3. 資材配布結果確認
Get-ChildItem $dst_path
# 4. リモート接続削除
net use /delete $mount_point


上記例では、ローカルサーバの"D:\work\installer"配下の全てのフォルダ・ファイルを、再帰的に配布先サーバの"D:\tmp\installer"フォルダ配下へコピーしている("Copy-Item"コマンドレットの"-Recurse"オプションを使用)。

上記例のインプットパラメータを予めCSVファイル等の外部ファイルに記載しておけば、それを入力として大量のサーバに任意の資材を配布できる。

他にも良い方法がありそうだけどとりあえずこれで事足りたので・・・。