以下のツールを使うことで、Windows の VM イメージを作成できるけれども、
社内などプロキシを経由しないとインターネットにアクセスできない環境では、WindowsUpdate や packer-windows のスクリプト群がエラーになってしまいます。
そこでエラーにならないように、やっつけで修正してみました。
まず WindowsUpdate で使用するプロキシを netsh コマンドで登録します(以下ではプロキシサーバを proxy.example.org:8080 としています)。
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 を設定するだけです。
> set http_proxy=proxy.example.org:8080
> packer build windows_2008_r2.json