以前書いた OVF Env 用の glue code 件で。
vhoge.hateblo.jp
Windows 向けでちょっと使うかもということで、PowerShell で再実装。
PowerShell ほとんど使ったことなかったので何も分からん状態だったけど、PowerShell ISE でタブ押してればそれっぽいものができるので思ったよりは楽に書けた。
あと、こちらだと XML の parse が楽。名前空間まともに見てないのかな…
その代わり外部コマンド呼び出し (vmtoolsd) が少し面倒だったり。
$lck_file = "C:\windowsinit\vcid.lck"
$vmtoolsd_path = "C:\Program Files\VMware\VMware Tools\vmtoolsd.exe"
$vmtoolsd_args = "--cmd ""info-get guestinfo.ovfenv"""
function getOvfEnv(){
$cmd = New-Object System.Diagnostics.ProcessStartInfo
$cmd.FileName = $vmtoolsd_path
$cmd.Arguments = $vmtoolsd_args
$cmd.RedirectStandardOutput = $true
$cmd.UseShellExecute = $false
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $cmd
$process.Start() | Out-Null
$process.WaitForExit()
return $process.StandardOutput.ReadToEnd()
}
function chkLock($vmid){
If (Test-Path $lck_file) {
$lck_val = Get-Content $lck_file
if ($lck_val -eq $vmid){
return $true
}
}
return $false
}
function setLock($vmid){
New-Item $lck_file -Value $vmid -Itemtype file
}
function deployHostname($hostname){
Rename-Computer -NewName $hostname
}
function deployNetwork($ip, $prefix, $gateway, $dns){
Get-NetAdapter | New-NetIPAddress -IPAddress $ip -AddressFamily IPv4 -PrefixLength $prefix -DefaultGateway $gateway
Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses $dns
}
function main(){
$ret = getOvfEnv
$xml = [xml]$ret
$conf = @{}
foreach ($value in $xml.Environment.PropertySection.Property){
$conf.add($value.key, $value.value)
}
$dns = $conf.dns -split ","
if (chkLock $xml.Environment.vCenterId){
echo "Nothing to do."
return 0
}
deployNetwork $conf.ip $conf.prefix $conf.gateway $dns
deployHostname $conf.hostname
setLock $xml.Environment.vCenterId
return 0
}
main
とそのまま書き直してみたのですが完璧ではなく。
- hostname 反映は再起動が必須
- New-NetIPAddress は上書きできないので、設定が残っているとコケる
- DNS は 2個までしか入らない…?
github にもそのうち(←はよアカウント作れ)
※ 10/09 スクリプトのlock周りにバグがあったのでひっそり修正