プロジェクト

全般

プロフィール

調査 #52

完了

AnsibleでWindows OS上のVMwareネットワークを一元設定する

高橋 徹 さんがほぼ9年前に追加. 8年以上前に更新.

ステータス:
終了
優先度:
通常
担当者:
カテゴリ:
-
対象バージョン:
-
開始日:
2016/01/08
期日:
2016/01/11
進捗率:

100%

予定工数:

説明

  • 調査目的:
    複数の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が適用できるか否かの判断、および適用できる場合はその設定操作方法を明確化していること

高橋 徹 さんがほぼ9年前に更新

  • 説明 を更新 (差分)
  • ステータス新規 から 進行中 に変更
  • 進捗率0 から 50 に変更

技術課題

VMware Workstation Player 12は、個人使用(非商用利用)に限り無償、商用利用の場合はライセンス購入が必要。
VMware Workstation Player 12をWindows OSへインストールすると、次の仮想LANが作成される。

仮想LAN名 概要 ホストOSの仮想NIC
VMnet1 外部とは遮断されたホストOS内部専用の仮想LAN 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のネットワーク設定をコピー後に個別に実施して回る必要が生じ、環境構築の際に一律設定が適用できない。

高橋 徹 さんがほぼ9年前に更新

課題の解決方針

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)に転送する。

高橋 徹 さんがほぼ9年前に更新

VMnet1およびVMnet8のネットワークアドレス設定

VMnet1とVMnet8のネットワークアドレスを次にします。

VMnet1 192.168.192.0/24
VMnet8 192.168.196.0/24

VMnet1およびVMnet8のネットワークアドレスは、レジストリに記述します。
regedit.exeで現状の設定をファイルにエクスポートし、必要なキーと値の設定を抜粋しネットワークアドレスを修正したファイルを作成します。reg.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'
        - 'VMware NAT Service'

柔軟な設定をするなら、Ansibleのwin_templateを使うのですが、改行コードおよびBOMに気をつける必要があり、ちょっと面倒です。対象マシンごとに記述を変える必要がないのであれば、templateを使わない方が問題が少ないでしょう。

高橋 徹 さんがほぼ9年前に更新

ゲスト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;
}

高橋 徹 さんがほぼ9年前に更新

NATの設定

先に登場したvmnetnat.confにNATでの外部から内部への転送設定を記述します。

9922 = 192.168.196.101:22

左がホストOSのポート番号で、任意に番号を取ります。右がゲストOSのアドレスとSSHのポート番号です。

高橋 徹 さんがほぼ9年前に更新

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'

高橋 徹 さんが8年以上前に更新

  • ステータス進行中 から 解決 に変更
  • 進捗率50 から 80 に変更

高橋 徹 さんが8年以上前に更新

  • ステータス解決 から 終了 に変更
  • 進捗率80 から 100 に変更

他の形式にエクスポート: Atom PDF