ご飯

すっきりしたコードってむつかしい

Powershell を使って、ネットワークを設定する (1)

今回の試みは、Windows Server の設定を、Powershellスクリプトで実行するというものです。サーバは複数台存在し、それぞれ異なるIPアドレスやホスト名を設定します。設定項目は、次の通りです。

 

f:id:uhoo:20181123140025g:plain

 

すっきりしたコードにするため、スクリプトはパラメータファイルと実行用ファイルに分けたいと思います。前者が def.ps1 という名前で、後者が tool.ps1 です。

 

では、def.ps1 から作っていきます。

 

ハッシュ $params を作成する 

def.ps1 に次のコードを追加します。

$params = @{
  "XYZ123S2C5" = @{host_name = "hostname4" ; ipaddr1 = "192.168.1.64"; gw1 = "192.168.1.1"}
  "XYZ123S2C9" = @{host_name = "hostname3" ; ipaddr1 = "192.168.1.94"; gw1 = "192.168.1.1"}
  "XYZ123S2C6" = @{host_name = "hostname2" ; ipaddr1 = "192.168.1.84"; gw1 = "192.168.1.1"}
  "XYZ123VDED" = @{host_name = "hostname1" ; ipaddr1 = "192.168.1.74"; gw1 = "192.168.1.1"}
}

 

$params というハッシュは、左辺がサーバ固有のシリアルナンバー、右辺が、サーバに設定すべき固有のパラメータのテーブルです。シリアルナンバーは、サーバ本体のバーコードをスキャンするとよいでしょう。Excelの一覧表にしてIPアドレスやホスト名などの情報を紐付けます。

 

Powershell から次のように入力すると $params の内容が表示されます。

PS /home/uhoo> . ".\def.ps1"
PS /home/uhoo> $params

Name                           Value
----                           -----
XYZ123S2C9                     {host_name, gw1, ipaddr1}
XYZ123VDED                     {host_name, gw1, ipaddr1}
XYZ123S2C6                     {host_name, gw1, ipaddr1}
XYZ123S2C5                     {host_name, gw1, ipaddr1}

 

シリアルナンバーが、XYZ123S2C9 であると仮定すると、次のようにして $params の要素を取り出すことができます。

PS /home/uhoo> $params["XYZ123S2C9"]

Name                           Value
----                           -----
ipaddr1                        192.168.1.94
gw1                            192.168.1.1
host_name                      hostname3

 

シリアルナンバーを取得する

自身のサーバのシリアルナンバーを取得するには、 (gwmi win32_bios).SerialNumber とします。

def.ps1 に次のコードを追加します。

$serial    = (gwmi win32_bios).SerialNumber  # このコンピュータのシリアル№
$uhoo      = $params[$serial]
$host_name = $uhoo.host_name       # ホスト名
$ipaddr1   = $uhoo.ipaddr1         # IPv4アドレス -1
$gw1       = $uhoo.gw1             # デフォゲ -1
$team_name = "team_" + $host_name  # チーム名

コードは、取得したシリアルナンバーを $serial に代入し、$params から該当するレコードを取り出しています。そしてフィールドを使いやすい形式の変数に代入しています。

 

なお、ここでは便宜上、一番目のレコードのシリアルナンバーを取得したことにしておきます。

#$serial    = (gwmi win32_bios).SerialNumber  # コメントアウト
$serial    = "XYZ123S2C9" # 便宜上の値に変更  

 

ハッシュ $param を作成する

$param というハッシュを定義して、使いやすい形式に整えます。

コード全文(def.ps1)

$params = @{
  "XYZ123S2C5" = @{host_name = "hostname4" ; ipaddr1 = "192.168.1.64"; gw1 = "192.168.1.1"}
  "XYZ123S2C9" = @{host_name = "hostname3" ; ipaddr1 = "192.168.1.94"; gw1 = "192.168.1.1"}
  "XYZ123S2C6" = @{host_name = "hostname2" ; ipaddr1 = "192.168.1.84"; gw1 = "192.168.1.1"}
  "XYZ123VDED" = @{host_name = "hostname1" ; ipaddr1 = "192.168.1.74"; gw1 = "192.168.1.1"}
}

#$serial    = (gwmi win32_bios).SerialNumber  # このコンピュータのシリアル№
$serial    = "XYZ123S2C9"
$uhoo      = $params[$serial]
$host_name = $uhoo.host_name       # ホスト名
$ipaddr1   = $uhoo.ipaddr1         # IPv4アドレス -1
$gw1       = $uhoo.gw1             # デフォゲ -1
$team_name = "team_" + $host_name  # チーム名

$param = @{

  # ホスト名
  host_name = $host_name
  domain    = "WORKGROUP"

  # ネットワークのプロパティ
  nw = @{

    # ポート名の変更
    rename_ifs = @(
       @{Name = "Ethernet0" ; NewName = "Eth1"}
       @{Name = "Ethernet1" ; NewName = "Eth5"}
     )

    # チーミングの設定
    lbfo1 = @{
      Name = $team_name
      TeamMembers  = ("Eth1","Eth5")
      TeamingMode  = "SwitchIndependent"
      LoadBalancingAlgorithm = "Dynamic"
      Confirm = $false
    }

    lbfo2 = @{
      Name = "Eth5"
      AdministrativeMode = "Standby"
    }

    # 接続の設定
    ifs = @(
      # インタフェイス-1 
      @{
        name = $team_name
     
        # バインディング (既定値を変更する ComponentID だけ追加し、enabled 属性を与えてください)
        bindings  = @(
          @{ComponentID = "ms_tcpip6"; Enabled = $false}
        )
     
        # IPv4アドレス (個別パラメータの $ipaddr1 を参照しています)
        ip = @{IPAddress = $ipaddr1; PrefixLength = 24; DefaultGateway = $gw1}
     
        # DNSサーバ
        dns = @{ServerAddress = @('192.168.0.2','192.168.0.1')}
     
        # $false を指定すると「この接続のアドレスをDNSに登録する」のチェックを外します
        register = $false
      }
    )

    # false を指定すると「LMHOSTS の参照を有効にするチェック」のを外します
    enablewins = $true

    # コンポーネントIDとその説明
    binding_dscr = @{
      ms_rspndr    = "Link-Layer Topology Discovery Responder"
      ms_lltdio    = "Link-Layer Topology Discovery Mapper I/O Driver"
      ms_implat    = "Microsoft Network Adapter Multiplexor Protocol"
      ms_msclient  = "Microsoft ネットワーク用クライアント"
      ms_netftflt  = "Microsoft Failover Cluster Virtual Adapter Performance Filter"
      ms_bridge    = "Microsoft MAC Bridge"
      ms_lbfo      = "Microsoft Load Balancing/Failover Provider"
      ms_pacer     = "QoS パケット スケジューラ"
      ms_server    = "Microsoft ネットワーク用ファイルとプリンター共有"
      ms_tcpip6    = "インターネット プロトコル バージョン 6 (TCP/IPv6)"
      ms_tcpip     = "インターネット プロトコル バージョン 4 (TCP/IPv4)"
    }
  }
}

 

以上で準備ができました。

 

次回は、パラメータファイルを使って設定を実行するスクリプトを作成します。 

 

uhoo.hatenablog.com