RedHat OpenShift環境を作るためのansible hostsファイルがすごく難解。
おかげでいろんなhostsファイル記述を実験する羽目に・・・
仮想マシンテンプレートを作ったあと、仮想マシンのカスタマイズ仕様を元にデプロイするだけとは言え、マスタ2台、インフラノード2台、ノード2台とかを毎回作り直すのが面倒。
簡略化するためにPowerCLIを使って一括作成できるようなスクリプトを作成した。
$vcenter="testvcenter" # 接続先vCenterホスト名 or IPアドレス
$vcenterusername="administrator@vsphere.local" # vCenterユーザ名
$vcenterpassword="test" # vCenterパスワード
$vmtemplatename="rhel7-os311" # 仮想マシンテンプレート名
$vmcustomizespec="rhel7-base" # 仮想マシンのカスタマイズ仕様名
$datastore="vsphere10" # デプロイ先データストア
$esxserver="172.17.44.10" # デプロイ先ESXiサーバ
$subnetmask="255.255.0.0" # 仮想マシンのサブネット
$defaultgw="172.17.0.1" # 仮想マシンのデフォルトゲートウェイ
connect-vcenter -Server $vcenter -User $vcenterusername -Password $vcenterpassword -WarningAction 0
deployvm -vmname "master221" -ipaddr "172.17.44.221" -cpu 4 -memory 16
deployvm -vmname "master222" -ipaddr "172.17.44.222" -cpu 4 -memory 16
deployvm -vmname "infra-node223" -ipaddr "172.17.44.223" -cpu 2 -memory 8
deployvm -vmname "node224" -ipaddr "172.17.44.224" -cpu 2 -memory 8
deployvm -vmname "node225" -ipaddr "172.17.44.225" -cpu 2 -memory 8
Disconnect-VIServer -Confirm:$false
###########################################
### 関数名: connect-vcenter
### 役割: 指定したvCenterサーバに接続
### 入力: 「-Server vCenterサーバ名」
### 「-User ユーザ名」
### 「-Password パスワード」
### 「-Credential パスワードの暗号化文字列」
### 「-Password」か「-Credential」かは排他指定
### 注意: パイプライン処理不可
###########################################
function connect-vcenter{
param(
[Parameter(ValueFromPipeline=$false,Mandatory=$false)][string]$Server,
[Parameter(ValueFromPipeline=$false,Mandatory=$false)][string]$User,
[Parameter(ValueFromPipeline=$false,Mandatory=$false)][string]$Password,
[Parameter(ValueFromPipeline=$false,Mandatory=$false)][SecureString]$Credential
)
# $global:DefaultVIServers が存在している場合はすでにvCenterに接続されているので処理を飛ばす
# vROpsと異なり接続がなくなったら変数もなくなるようだが、念のためこちらも接続中のユーザ名があることを確認
if([String]::IsNullOrEmpty($global:DefaultVIServers.User)){
Try {
if($Credential){
$pscredential=New-Object System.Management.Automation.PSCredential($User,$Credential)
Connect-VIServer -Server $Server -Credential $pscredential -WarningAction 0 | Out-Null
if($? -eq $false){ throw }
}else{
Connect-VIServer -Server $Server -User $User -Password $Password -WarningAction 0 | Out-Null
if($? -eq $false){ throw }
}
} Catch {
Write-Host "vCenterサーバへの接続に失敗しました"
Write-Host $Error[0]
exit 1
}
}
return
}
###########################################
### 関数名: deployvm
### 役割: 仮想マシンテンプレートから仮想マシンをデプロイ
### 入力: 「-vmname 仮想マシンホスト名」
### 「-ipaddr IPアドレス」
### 「-cpu CPU数」
### 「-memory メモリ容量」
### 注意: 簡略化のため、下記の前提がある
### デプロイ先のESXiサーバを、グローバル変数 $esxserver で指定していること
### デプロイ先のデータストアを、グローバル変数 $datastore で指定していること
### 仮想マシンテンプレートを、グローバル変数 $vmtemplatename で指定していること(作成済みであること)
### 仮想マシンのカスタマイズ仕様を、グローバル変数 $vmcustomizespec で指定していること(作成済みであること)
### グローバル変数で仮想マシンのサブネットマスク $subnetmask とデフォルトゲートウェイ $defaultgw を指定していること
###########################################
function deployvm{
Param(
[Parameter(ValueFromPipeline=$false,Mandatory=$false)][string]$vmname,
[Parameter(ValueFromPipeline=$false,Mandatory=$false)][string]$ipaddr,
[Parameter(ValueFromPipeline=$false,Mandatory=$false)][int]$cpu,
[Parameter(ValueFromPipeline=$false,Mandatory=$false)][int]$memory
)
Get-OSCustomizationSpec $vmcustomizespec | New-OSCustomizationSpec -Name vmtemp -Type NonPersistent
Get-OSCustomizationNicMapping vmtemp | Set-OSCustomizationNicMapping -IpMode UseStaticIP -IpAddress $ipaddr -SubnetMask $subnetmask -DefaultGateway $defaultgw
Get-OSCustomizationSpec vmtemp | Set-OSCustomizationSpec -NamingScheme vm
New-VM -Name $vmname -VMHost $esxserver -Template $vmtemplatename -OSCustomizationSpec vmtemp -Datastore $datastore -Confirm:$false
Set-VM -VM $vmname -MemoryGB $memory -NumCpu $cpu -Confirm:$false
Start-VM -VM $vmname -Confirm:$false
Remove-OSCustomizationSpec vmtemp -Confirm:$false
}
なお、vCenterへの接続部分がごっつい関数にしてあるのは、他で使ったものの流用であるためです。
deployvmで行っていることの詳細については「PowerShellを使ってVMwareのテンプレートからデプロイで「既存のカスタマイズ仕様を使用してカスタマイズする」を行う方法」を参照のこと。