2017年10月22日日曜日

packer で Powershell を使って Windows サーバに DNS を設定する方法

概要

packer で WindowsServer2016 を構築する際にネットワークアダプタに DNS を設定する方法を紹介します
もし DHCP で IP を取得する場合だと大抵は DHCP サーバが DNS の情報も教えてくれますが、そうじゃない環境の場合には手動で DNS の向き先を変更する必要があります
そういった場合には使える手法だと思います

環境

  • ESXi 6.0.0 (Build 3620759)
  • Ubuntu 16.0.4
  • packer 1.0.4

Powershell スクリプト

DNS を Ethernet0 アダプタに設定する方法を紹介します

  • vim scripts/dns.ps1
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddresses 8.8.8.8

これを packer を使って WindowsServer 上で実行させます

テンプレートファイル修正

provisoners セクションに powershell を実行する設定を追加します

  • win2016.json
"provisioners": [
    {
        "type": "powershell",
        "execute_command": "{{ .Vars }} cmd /c C:/Windows/Temp/script.bat",
        "scripts": [
            "scripts/dns.ps1",
        ]
    }
]

type は powershell を指定します
windows-shell というタイプもありますが、それは .bat 用なので違います

execute_command はそのまま使いましょう
{{ .Vars }} は environment_vars という設定項目でセットした環境変数を参照するためのテンプレート変数です
今回は特に設定していないので何も入らないですが入れるのが基本らしいので入れておきます
そのあとの C:/Windows/Temp/script.bat ですが、これは scripts で指定した Powershell スクリプトが WindowsServer 側にアップロードされた際のパスを指定しています
remote_path という設定項目でアップロード先を指定できるのですが、今回は指定していません
指定を省略した場合はデフォルトの C:/Windows/Temp/script.bat が使われるため execute_command でもそのパスを指定する感じです

これで Powershell を呼び出すことができます

動作確認

実行して成功するか確認してみましょう
packer のログ的には以下のように表示されれば成功です

==> vmware-iso: Provisioning with Powershell...
==> vmware-iso: Provisioning with shell script: scripts/dns.ps1
    vmware-iso: #< CLIXML
    vmware-iso: <Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"><Obj S="progress" RefId="0"><TNRefId="0"><T>System.Management.Automation.PSCustomObject</T><T>System.Object</T></TN><MS><I64 N="SourceId">1</I64><PR N="Record"><AV>Preparing modules for first use.</AV><AI>0</AI><Nil /><PI>-1</PI><PC>-1</PC><T>Completed</T><SR>-1</SR><SD> </SD></PR></MS>
</Obj></Objs>

もし失敗するとしたら Powershell 内で指定している -InterfaceAlias "Ethernet0" の部分かと思います
ここで指定したネットワークアダプタ名がないとエラーになるので、自分の環境に合わせて変更してください

最後に

packer + Powershell で Windows サーバの DNS の設定を行ってみました
1 行で行えるので簡単でした

packer ビルド内でインターネットにアクセスするような処理がある場合に DNS で名前解決できない場合などで使えると思います
もしくは内部向けの DNS がないとイントラのホスト名を解決できない場合かなと思います

0 件のコメント:

コメントを投稿