プロキシ内での Packer による Windows 環境構築


以下のツールを使うことで、Windows の VM イメージを作成できるけれども、

* [Packer](http://www.packer.io/)
* [packer-windows](https://github.com/joefitzgerald/packer-windows)

社内などプロキシを経由しないとインターネットにアクセスできない環境では、WindowsUpdate や packer-windows のスクリプト群がエラーになってしまいます。

そこでエラーにならないように、やっつけで修正してみました。

---

まず WindowsUpdate で使用するプロキシを netsh コマンドで登録します(以下ではプロキシサーバを proxy.example.org:8080 としています)。

```xml:answer_files/2008_r2/Autounattend.xml
 <SynchronousCommand wcm:action="add">
   <CommandLine>cmd.exe /c wmic useraccount where "name='vagrant'" set PasswordExpires=FALSE</CommandLine>
   <Order>22</Order>
   <Description>Disable password expiration for vagrant user</Description>
 </SynchronousCommand>
 <!-- 以下の5行を追加する -->
 <SynchronousCommand wcm:action="add">
   <CommandLine>netsh winttp set proxy proxy-server="proxy.example.org:8080"</CommandLine>
   <Order>90</Order>
   <Description>Setup proxy for WindowsUpdate</Description>
 </SynchronousCommand>
 <!-- WITHOUT WINDOWS UPDATES -->
 <!--
 <SynchronousCommand wcm:action="add">
   <CommandLine>cmd.exe /c C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File a:\openssh.ps1 -AutoStart</CommandLine>
   <Description>Install OpenSSH</Description>
   <Order>99</Order>
   <RequiresUserInput>true</RequiresUserInput>
 </SynchronousCommand>
 -->
```

---

PowerShell でファイルをダウンロードしている各スクリプトを変更します。

```scripts/openssh.ps1
# 15〜19行目を変更する。
if (!(Test-Path "C:\Program Files\OpenSSH\bin\ssh.exe")) {
    Write-Host "Downloading $ssh_download_url"
    $web_client = New-Object System.Net.WebClient
    $web_client.proxy = New-Object System.Net.WebProxy("http://proxy.example.org:8080")
    $web_client.DownloadFile($ssh_download_url, "C:\Windows\Temp\openssh.exe")
    Start-Process "C:\Windows\Temp\openssh.exe" "/S /port=22 /privsep=1 /password=D@rj33l1ng" -NoNewWindow -Wait
}
```

```scripts/vm-guest-tools.bat
 rem 2行目を変更する
 powershell -Command "$web_client = New-Object System.Net.WebClient; $web_client.proxy = New-Object System.Net.WebProxy('http://proxy.example.org:8080'); $web_client.DownloadFile('http://downloads.sourceforge.net/sevenzip/7z920-x64.msi', 'C:\Windows\Temp\7z920-x64.msi')" <NUL

 rem 17行目を変更する
 powershell -Command "$web_client = New-Object System.Net.WebClient; $web_client.proxy = New-Object System.Net.WebProxy('http://proxy.example.org:8080'); $web_client.DownloadFile('http://softwareupdate.vmware.com/cds/vmw-desktop/ws/10.0.1/1379776/windows/packages/tools-windows-9.6.1.exe.tar', 'C:\Windows\Temp\vmware-tools.exe.tar')" <NUL
```

```scripts/chef.bat
 rem 2行目を変更する
 powershell -Command "$web_client = New-Object System.Net.WebClient; $web_client.proxy = New-Object System.Net.WebProxy('http://proxy.example.org:8080'); $web_client.DownloadFile('http://www.getchef.com/chef/install.msi', 'C:\Windows\Temp\chef.msi')" <NUL
```

```scripts/vagrant-ssh.bat
 rem 5行目を変更する
 powershell -Command "$web_client = New-Object System.Net.WebClient; $web_client.proxy = New-Object System.Net.WebProxy('http://proxy.example.org:8080'); $web_client.DownloadFile('https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub', 'C:\Users\vagrant\.ssh\authorized_keys')" <NUL
```

```scripts/compact.bat
 rem 2行目を変更する
powershell -Command "$web_client = New-Object System.Net.WebClient; $web_client.proxy = New-Object System.Net.WebProxy('http://proxy.example.org:8080'); $web_client.DownloadFile('http://downloads.sourceforge.net/sevenzip/7z920-x64.msi', 'C:\Windows\Temp\7z920-x64.msi')" <NUL

 rem 7行目を変更する
powershell -Command "$web_client = New-Object System.Net.WebClient; $web_client.proxy = New-Object System.Net.WebProxy('http://proxy.example.org:8080'); $web_client.DownloadFile('http://downloads.sourceforge.net/ultradefrag/ultradefrag-portable-6.0.2.bin.amd64.zip', 'C:\Windows\Temp\ultradefrag.zip')" <NUL

 rem 15行目を変更する
powershell -Command "$web_client = New-Object System.Net.WebClient; $web_client.proxy = New-Object System.Net.WebProxy('http://proxy.example.org:8080'); $web_client.DownloadFile('http://download.sysinternals.com/files/SDelete.zip', 'C:\Windows\Temp\SDelete.zip')" <NUL
```

やっつけとは言え、修正がダメすぎる... PowerShell を勉強しよう。
あと会社で修正した内容を、自宅でうろ覚え書きしているので、どこか間違えていたらごめん。

---

あとはビルド前に環境変数 http_proxy を設定するだけです。

```DOS
> set http_proxy=proxy.example.org:8080
> packer build windows_2008_r2.json
```