ソフトウェアエンジニアリング - 調査 #52
AnsibleでWindows OS上のVMwareネットワークを一元設定する
2016/01/10 22:45 - 高橋 徹 ステータス: 終了 開始日: 2016/01/08 優先度: 通常 期日: 2016/01/11 担当者: 高橋 徹 進捗率: 100% カテゴリ: 予定工数: 0.00時間 対象バージョン: 作業時間: 0.00時間 説明 調査目的: 複数のWindows OS機上にVMwareを設定する際、ネットワーク設定が一元適用できるようAnsibleを活用する方法を確立する。 調査条件:対象とするホストOSは、Windows 7 SP1 64bit版、使用するVMwareはWorkstation Player 12とする。 対象とするゲストOSは、Fedora 23とする。 各ホストOS上で、VMwareのネットワーク(VMnet1、VMnet8)がそれぞれ同じネットワークアドレスとする。 各ホストOS上で、ゲストOSのネットワークはNATによる構成とし、それぞれ同じIPアドレスを割り当てる。 外部からゲストOSに対してSSH接続が可能である。 調査結果: 完了条件: Ansibleが適用できるか否かの判断、および適用できる場合はその設定操作方法を明確化していること 履歴 #1 - 2016/01/10 23:05 - 高橋 徹 - 説明 を更新 - ステータス を 新規 から 進行中 に変更 - 進捗率 を 0 から 50 に変更 技術課題
VMware Workstation Player 12は、個人使用(非商用利用)に限り無償、商用利用の場合はライセンス購入が必要。 VMware Workstation Player 12をWindows OSへインストールすると、次の仮想LANが作成される。
仮想LAN名 概要 ホストOSの仮想NIC
VMnet1 外部とは遮断されたホストOS内部専用の仮想L
AN
VMware Network Adapter VMnet1
VMnet8 仮想ルーターを介して外部と通信可能なホスト
OS内部の仮想LAN
VMware Network Adapter VMnet8
1. 仮想LANのネットワークアドレスは、VMwareインストール時に、そのマシンで使用されていないクラスCのプライベートネットワークからランダ ム的に選択される。そのため、ホストOSが複数あるとき、それぞれで異なるネットワークアドレスが割り当てられてしまい、環境構築の際に一律設 定が適用できない。 2. ゲストOSは特にNATで使用する場合、DHCPでアドレスを割り当てる(外部と通信するため、ゲートウェイやDNSの設定をDHCPで付与するため) 。そのため、ホストOSが複数あるとき、ゲストOSにはそれぞれで異なるIPアドレスが割り当てられてしまい、環境構築の際に一律設定が適用でき ない。 3. ゲストOSのイメージを複数のゲストOSへコピーすると、ゲストOSのMACアドレスはホストOSごとに自動生成される。そのため、ゲストOSのネッ トワーク設定をコピー後に個別に実施して回る必要が生じ、環境構築の際に一律設定が適用できない。 #2 - 2016/01/10 23:12 - 高橋 徹
課題の解決方針 1. VMnet1およびVMnet8のネットワークアドレスは、VMware Workstaion Playerには設定ツールが用意されていないので、レジストリを直接編集することでインストール後に一律の値に変更する。 2. NATを使う場合ゲストOSはVMnet8に接続されるので、VMnet8のDHCP設定でゲストOSのIPアドレスを固定化する。DHCPでIPアドレスを固定化す るには、ゲストのMACアドレスが固定である必要がある。ゲストOSのイメージファイル一式に含まれる設定ファイル(.vmx)に、MACアドレスを 固定で割り振る設定を記述する。 3. NATの設定を行い、外部からホストOSのとあるポートへ接続してきたら、ゲストOSのポート22(SSH)に転送する。 #3 - 2016/01/11 03:43 - 高橋 徹 VMnet1およびVMnet8のネットワークアドレス設定 VMnet1とVMnet8のネットワークアドレスを次にします。 VMnet1 192.168.192.0/24 VMnet8 192.168.196.0/24 VMnet1およびVMnet8のネットワークアドレスは、レジストリに記述します。 regedit.exeで現状の設定をファイルにエクスポートし、必要なキーと値の設定を抜粋しネットワークアドレスを修正したファイルを作成します。re g.exeでそのファイルをインポートすることで変更を反映することとします。 作成したファイル(vmware_vnetaddress.reg)
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\VMware, Inc.\VMnetLib\VMnetConfig\vmnet1] "IPSubnetAddress"="192.168.192.0" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\VMware, Inc.\VMnetLib\VMnetConfig\vmnet8] "IPSubnetAddress"="192.168.196.0" [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\VMnetDHCP\Parameters\VirtualEthernetSegments\1] "HostIpAddress"=dword:01c0a8c0 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\VMnetDHCP\Parameters\VirtualEthernetSegments\8] "HostIpAddress"=dword:01c4a8c0 HostIpAddressは、IPv4アドレスを16進数4バイト(リトルエンディアン)で表現します。そのIPアドレスは、ホスト部を1としたものです。 レジストリに反映するには次のコマンドを実行します。
> reg.exe import vmware_vnetaddress.reg
Ansibleで実行する際は、Ansibleホストからターゲットへファイルを転送し、次にreg.exeを実行します。
- name: VMnetのネットワークアドレス設定レジストリファイルをコピー win_copy: src=files/vmware_vnetaddress.reg dest=C:/Windows/Temp/ - name: VMnetのネットワークアドレス設定レジストリファイルを反映
raw: "reg.exe IMPORT C:\\Windows\\Temp\\vmware_vnetaddress.reg"
ネットワークアドレス変更を反映するには、次のWindowsサービスを再起動する必要があります。 VMnetDHCP
VMware NAT Service
これらサービスの設定ファイルにもネットワークアドレスが記述されているので、その設定ファイルも変更が必要です。 C:\ProgramData\VMware\vmnetdhcp.conf C:\ProgramData\VMware\vmnetnat.conf Ansibleで対象がLinuxであればファイル内の正規表現置換が容易ですが、対象がWindowsの場合は難しいのであらかじめ設定を記述したファイルを 用意し、それを所定の場所にコピーすることとします。 vmnetdhcp.confの記述(VMnet1に関する部分)
subnet 192.168.192.0 netmask 255.255.255.0 {
range 192.168.192.128 192.168.192.254; # default allows up to 125 VM's option broadcast-address 192.168.192.255;
option domain-name-servers 192.168.192.1; option domain-name "localdomain";
default-lease-time 1800; max-lease-time 7200; } host VMnet1 { hardware ethernet 00:50:56:C0:00:01; fixed-address 192.168.192.1; option domain-name-servers 0.0.0.0; option domain-name ""; } vmnetdhcp.confの記述(VMnet8に関する部分) subnet 192.168.196.0 netmask 255.255.255.0 {
range 192.168.196.128 192.168.196.254; # default allows up to 125 VM's option broadcast-address 192.168.196.255;
option domain-name-servers 192.168.196.2; option domain-name "localdomain";
option netbios-name-servers 192.168.196.2; option routers 192.168.196.2; default-lease-time 1800; max-lease-time 7200; } host VMnet8 { hardware ethernet 00:50:56:C0:00:08; fixed-address 192.168.196.1; option domain-name-servers 0.0.0.0; option domain-name ""; option routers 0.0.0.0; } vmnetnat.confの記述(VMnet8に関する部分) ip = 192.168.196.2/24 hostMAC = 00:50:56:C0:00:08 Ansibleで実行する際は、Ansibleホストからターゲットへファイルを転送します。
- name: VMware DHCP設定ファイルとNAT設定ファイルの更新 win_copy: src=files/{{ item }} dest=C:/ProgramData/VMware/ with_items:
- vmnetdhcp.conf - vmnetnat.conf
VMwareホストの仮想NICの設定を変更する必要があります。仮想NICは次の名前になっています。 "VMware Network Adapter VMnet1"
"VMware Network Adapter VMnet8"
NICへのIPアドレス設定は、netshコマンドで実行します。Ansibleでrawモジュールを使って直接実行します。
- name: VMware Network Adapter VMnet1/8へIPアドレス設定
raw: 'netsh interface ipv4 set address "{{ item.name }}" static {{ item.addr }} 255.255.255.0' with_items:
- { name: 'VMware Network Adapter VMnet1', addr: '192.168.192.1' } - { name: 'VMware Network Adapter VMnet8', addr: '192.168.196.1' } 最後に、VMwareのサービスを再起動して設定を反映します。
- name: VMware DHCP および VMware NATのサービスを再起動 win_service: name="{{ item }}" state=restarted
with_items:
- 'VMnetDHCP'
柔軟な設定をするなら、Ansibleのwin_templateを使うのですが、改行コードおよびBOMに気をつける必要があり、ちょっと面倒です。対象マシン ごとに記述を変える必要がないのであれば、templateを使わない方が問題が少ないでしょう。 #4 - 2016/01/11 04:01 - 高橋 徹 ゲストOSのIPアドレスを固定化 VMwareのゲストOSのIPアドレスを、DHCPから配布する際に固定化するために次の処置が必要です。 VMwareゲストOSの構成ファイル(.vmx)を、MACアドレス自動生成ではなく静的に割り当てるよう修正 VMwareのDHCP設定でMACアドレスとIPアドレスを指定 デフォルトの構成ファイル(.vmx)の記述では、VMwareのイメージをコピーすると、その度にMACアドレスが自動生成(変更)されます。すると 、DHCP設定でのMACアドレスとIPアドレスの対応付けがマシンによって変わってしまいます。そこで、MACアドレスが変わらないように静的に割 り当てるようにします。 構成ファイル(.vmx)から削除する設定('N'にはその環境での固有の数値(0, 1, ...)のいずれかが入る) ethernetN.generatedAddress ethernetN.addressType ethernetN.generatedAddressOffset 構成ファイル(.vmx)に追加する設定('N'については上述と同じ) ehternetN.address = "00:50:56:10:48:01" ethernetN.addressType = "static" MACアドレスは、00:50:56:00:00:00 ∼ 00:50:56:3F:FF:FF の間で設定 vmnetdhcp.confに追記 host VMnet8-guest { hardware ethernet 00:50:56:10:48:01; fixed-address 192.168.196.101; } #5 - 2016/01/11 09:19 - 高橋 徹 NATの設定 先に登場したvmnetnat.confにNATでの外部から内部への転送設定を記述します。 9922 = 192.168.196.101:22 左がホストOSのポート番号で、任意に番号を取ります。右がゲストOSのアドレスとSSHのポート番号です。 #6 - 2016/01/11 10:30 - 高橋 徹 ansibleの設定記述
VMwareのネットワーク設定(VMnet1, VMnet8, DHCP, NAT)を行うansible playbookを作成します。
今回は専用設定なのでベストプラクティスディレクトリ構成ではなく、単独のplaybookとしてディレクトリ構成を取っています。 ディレクトリ・ファイル構成 +-- vmnet-setting.yml +-- hosts +-- files/ +-- vmware_vnetaddress.reg +-- vmnetdhcp.conf +-- vmnetnat.conf hostsの記述(3台のWindowsマシン上のVMwareを設定する場合の例) [windows] juliett kilo lima
[windows:vars]
ansible_connection=winrm ansible_ssh_port=5986 ansible_ssh_user=admin ansible_ssh_pass=adminpass
Windowsへの接続には、SSHではなくWindows Remote Management(WinRM)を使用 WinRMのデフォルトポート(SSL)は5986、他に、5985(HTTP)も選択可能 → デフォルトの5986を使用する場合、ansible_ssh_portの記述は省略可 Windowsを対象としたansible(ver.1.9)設定では、become(sudo)がないので、Administratorsグループのユーザーを接続に指定 パスワードは平文で記述する他、別ファイルに記載してファイルを暗号化することも可能(ansible-vault) python 2.7.9以降を使用する場合、SSL通信をする際サーバーSSL証明書が自己証明書だとエラー扱いされるので、WinRM接続をHTTPにするなどの回 避策が必要 プレイブック(vmnet-setting.yml)の記述 ---- hosts: windows tasks: -name: VMnetのネットワークアドレス設定レジストリファイルをコピー win_copy: src=files/vmware_vnetaddress.reg dest=C:/Windows/Temp/
-name: VMnetのネットワークアドレス設定レジストリファイルを反映 raw: "reg.exe IMPORT C:\\Windows\\Temp\\vmware_vnetaddress.reg"
-name: VMware DHCP設定ファイルとNAT設定ファイルの更新 win_copy: src=files/{{ item }} dest=C:/ProgramData/VMware/ with_items: -vmnetdhcp.conf -vmnetnat.conf
-name: VMware Network Adapter VMnet1/8へIPアドレス設定
raw: 'netsh interface ipv4 set address "{{ item.name }}" static {{ item.addr }} 255.255.255.0' with_items:
-{ name: 'VMware Network Adapter VMnet1', addr: '192.168.192.1' }
-{ name: 'VMware Network Adapter VMnet8', addr: '192.168.196.1' }
-name: VMware DHCP および VMware NATのサービスを再起動 win_service: name="{{ item }}" state=restarted
with_items: -'VMnetDHCP'
-'VMware NAT Service'
#7 - 2016/06/04 16:18 - 高橋 徹 - ステータス を 進行中 から 解決 に変更 - 進捗率 を 50 から 80 に変更 #8 - 2016/06/17 06:37 - 高橋 徹 - ステータス を 解決 から 終了 に変更 - 進捗率 を 80 から 100 に変更