tl;dr
Windows Server の初期設定を出来るだけワンタッチ(スクリプト一発とか)で行う方法を試行錯誤していて、ついでに Packer で AMI も作ってみようと思って試したメモ。
あくまでもメモ。
教材
github.com
memo
作成される AMI の概要
- Python をインストールする(msi パッケージのインストール試した)
- pyWin32 インストール(exe パッケージのインストールを試した)
- Ansible で構成管理出来るように設定(PowerShell スクリプトの実行を試した)
インスタンス起動時に指定するユーザーデータ
- タイムゾーンを JST に変更
- ネットワークプロファイルを Public から Private に変更
tzutil.exe /s "Tokyo Standard Time" Set-NetConnectionProfile -NetworkCategory Private
出来た AMI を Serverspec でテスト
% tree spec spec ├── common │ └── common_spec.rb └── spec_helper.rb 1 directory, 2 files
tips
- msi パッケージのインストール完了を待つ場合
Start-Process "C:download_filespython-2.7.11.amd64.msi" /quiet -Wait
Start-Process
コマンドレットを使って -Wait
オプションを利用する。
- Administrator のパスワードをリセットする
"provisioners": [ { "type": "powershell", "inline": [ "C:\PROGRA~1\Amazon\Ec2ConfigService\Ec2Config.exe -sysprep" ] } ]
上記のように Packer の Provisioner において Ec2Config を -sysprep
オプション付きで実行する。詳細は以下のドキュメントが詳しい。
docs.aws.amazon.com
docs.aws.amazon.com
- その他
- 今回は AMI に仕込んでおきたい諸々は Userdata にて実行するようにした(PowerShell スクリプトやコマンドプロンプトで書くことが出来る)
- Packer の Provisioner でも PowerShell やコマンドプロンプトにて書くことが出来る(今回は EC2Config で
sysprep
する以外で利用していない) - ネットワークプロファイルは NIC 作成時点で設定されるようなので AMI に設定を施してもダメ(っぽい)
- タイムゾーンも同様に AMI に埋め込むよりインスタンス起動時に userdata で指定した
参考
- https://gist.github.com/mitchellh/ab754cffbb173b9f341a
- http://dev.classmethod.jp/cloud/aws/create_windows-amazon-ami_by_packer/
以上
- Packer 奥深い
- Windows も頑張れば GUI にアクセスすることなく構築、運用は出来そう
- 要 PowerShell 力