ご飯

すっきりしたコードを書きたい

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

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

 


 

 

パラメータのみを定義した def.ps1 というファイルを作成する

あらかじめ、サーバのシリアルナンバーを取得しておき、ホスト名、IPアドレスを対応付けたハッシュテーブルを作成します。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"}
}

左辺がシリアルナンバー、右辺が、ホスト名と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 とします。$params[$serial].メンバ名 とすると、ぐじゃぐじゃして使いにくいので、メンバをスカラー変数に代入しておきます。

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

 

ところで、ご飯の使用している Windows Server は、VMware なので、(gwmi win32_bios).SerialNumber とするとシリアルナンバーが VMwareの値で返されてしまいます。したがって、便宜上、一番目のパラメータを指していることにしておきます。

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

 

つぎに $param というハッシュを定義して、使いやすい構成に整えます。def.ps1 に次のコードを追加します。

$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)"
    }
  }
}

 

ネストしたハッシュにアクセスするには、次のようにします。

PS /home/uhoo> $param.nw.ifs.ip

Name                           Value
----                           -----
DefaultGateway                 192.168.1.1
PrefixLength                   24
IPAddress                      192.168.1.84

PS /home/uhoo> 

 

余談ですが、ruby もハッシュをネストすることができますが、使うときが若干冗長ですね。ほかに書き方がないのか、調べている最中です。

param = {
  host: 'uhoo',
  workgroup: 'uhog',
  nw: { ipaddr: '192.168.1.1', gw: '192.168.1.254'}
}

p param[:host]
p param[:nw][:ipaddr]

 

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

uhoo.hatenablog.com