vHoge

VMwareのアレコレ備忘録。CLIでがんばるネタ多め。

Windows でのサンプル実装

以前書いた 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周りにバグがあったのでひっそり修正