PowerShell で DNS 操作
現在、俺々 Lab に vCloud Director (vCD) モドキを vCenter Orchestrator (vCO) で作成しています。その作業の中で、Windows の DNS サーバーの A レコード作成が手間だったので PowerShell 化したので、その過程を記録に残します。
作成中 の vCD モドキは、同一の環境を 2 分程度でコピーできることを目的としています。
- SID 同一
- SSH の各種鍵 同一
- IP アドレス 同一
- MAC アドレス 同一
- Gateway は IP Masquerade で同一
- 環境を隠蔽
VMware 製品を簡単に試せる ProjectNee や、vCD を使った PC 教室と同様の実装になります。直ぐに試したい製品で必要な IP アドレスは 100 近くになるため、UI で A レコード、PTR レコードを追加するのはマゾい作業です。ホスト名、IP アドレス、MAC アドレスを管理するためのスプレッドシートから、ホスト名、IP アドレスの CSV ファイルを作成し、これを入力とする PowerShell を作成したいと思います。
まず、PowerShell に DNS 管理用のモジュールを追加します。PowerShell のプロンプトから以下を実行します。
Get-Command -Module DnsServer
update-help
DnsServer モジュールは、TechNet によると Windows 2012、Windows 8 以上が必要のようです。
DNS Server Comdlets in Windows PowerShell
CSV からホスト名と IP アドレスを拾って DNS に登録していくスクリプトはこちら。
$ZoneName = "corp.local"
$CsvFile = "C:Tempip-address-list.csv"
$HostInfos = Import-Csv $CsvFile
$HostInfos | ForEach-Object {
$HostInfo = $_
$Record = $false
# With "-ErrorAction Ignore", if a value of -Name doesn't exist in the Zone, then Get-DnsServerResourceRecord returns $null
# Otherwise, you get an exception which stops this script.
$Record = Get-DnsServerResourceRecord -ZoneName $ZoneName -Name $HostInfo.Hostname -ErrorAction Ignore
If ( ! $Record ) {
Add-DnsServerResourceRecordA -ZoneName $ZoneName -Name $HostInfo.Hostname -IPv4Address $HostInfo.IpAddr -CreatePtr
}
}
スクリプトに喰わせる CSV は以下になります。ProjectNee と違うのはご容赦を。完全に個人の好みです。同じ IP アドレスがあるのは、全環境で同じ DNS サービスを使い回すためです。Windows の vCenter Server を利用するときもあれば、仮想アプライアンスの vCenter Server を利用する時もあるためです。この手間は仕方ないとして、実際に利用し始める前に不要な PTR レコードは削除しています。
Hostname,IpAddr
controlcenter,192.168.110.1
vc-l-01a,192.168.110.11
vc-w12-01a,192.168.110.11
vco-l-01a,192.168.110.12
vcd-l-01a,192.168.110.21
vcd-l-02a,192.168.110.22
vcns-l-01a,192.168.110.31
nsx-l-01a,192.168.110.31
vcops-l-01a,192.168.110.41
vcops-l-02a,192.168.110.42
srm-w8-01a,192.168.110.51
srm-w12-01a,192.168.110.51
srm-w8-02a,192.168.110.52
srm-w12-02a,192.168.110.52
vr-l-01a,192.168.110.55
vr-l-02a,192.168.110.56
vcli-l-01a,192.168.110.52
vcac-l-01a,192.168.110.61
iaas-w8-01a,192.168.110.65
iaas-w12-01a,192.168.110.65
appd-l-01a,192.168.110.66
itfm-l-01a,192.168.110.67
bde-l-01a,192.168.110.71
....
小ネタ
vSphere Web Client (あるいは vSphere Client) から MAC アドレスを固定すると、MAC アドレスの先頭 3 オクテット (OUI: Organizationally Unique Identifier) は 00:50:56 となります。HomeLab などで MAC アドレスもコントロールしたい場合は、IP アドレスは Class B のアドレス体系にして、その IP アドレスとMAC アドレスの後半の 3 オクテットを 10 進数でマッピングすると管理しやすいと思いますよ。
IP アドレスを見て瞬時に脳内で 10 進数 ➡ 16 進数 の変換が出来る人は Class A のアドレス体系でも不自由ないかも知れません。