PowerCLIを使ってvSphere仮想マシンをテンプレートから連続デプロイ


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への接続部分がごっつい関数にしてあるのは、他で使ったものの流用であるため。

WindowsServer 2016にVMware PowerCLIをインストールする際のメモ


Windows Server 2016環境にVMware PowerCLIをインストールしたので、その手順のメモ

(1) PowerShellを起動

(2)「Install-Module -Name VMware.PowerCLI」を実行

途中、NuGetプロバイダーのインストールと、PowerCLIがあるレポジトリの追加が要求されるので、両方許可する。

Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Users\Administrator> Install-Module -Name VMware.PowerCLI

続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\Administrator\AppData\Local\PackageManagement\ProviderAssemblies'
に配置する必要があります。'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet
プロバイダーをインストールすることもできます。今すぐ PowerShellGet で NuGet
プロバイダーをインストールしてインポートしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y
PS C:\Users\Administrator>

(3) 以上!

なお、その後のメモ

自己証明書を使ってるvCenterサーバに接続しようとすると下記のエラーがでる。

PS C:\Users\Administrator> Connect-VIServer -Server vcenterサーバ -User administrator@vsphere.local -Password "パスワード"
Connect-VIServer : 2018/12/20 11:25:08  Connect-VIServer                Error: Invalid server certificate. Use Set-PowerCLIConfiguration to set the value for the InvalidCertificateAction option to Prompt if you'd like to connect once or to add a permanent exception for this server.
Additional Information: 機関 'vcenterサーバ' との SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした。
発生場所 行:1 文字:1
+ Connect-VIServer -Server vcenterサーバ -User administrator@vsphere.loca ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) [Connect-VIServer]、ViSecurityNegotiationException
    + FullyQualifiedErrorId : Client20_ConnectivityServiceImpl_Reconnect_CertificateError,VMware.VimAutomation.ViCore.
   Cmdlets.Commands.ConnectVIServer

PS C:\Users\Administrator>

以前は「」オプションで回避できていたが、今のPowerCLIでは「Set-PowerCLIConfiguration -InvalidCertificateAction Ignore」を設定する必要がある。(参考:New Release: VMware PowerCLI 10.0.0 )

Users\Administrator> Set-PowerCLIConfiguration -InvalidCertificateAction Ignore

Perform operation?
Performing operation 'Update PowerCLI configuration.'?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y

Scope    ProxyPolicy     DefaultVIServerMode InvalidCertificateAction  DisplayDeprecationWarnings WebOperationTimeout
                                                                                                  Seconds
-----    -----------     ------------------- ------------------------  -------------------------- -------------------
Session  UseSystemProxy  Multiple            Ignore                    True                       300
User                                         Ignore
AllUsers


PS C:\Users\Administrator>

これで接続できるようになる。

PS C:\Users\Administrator> Connect-VIServer -Server vCenterサーバ -User administrator@vsphere.local -Password "パスワード"

Name                           Port  User
----                           ----  ----
vCenterサーバ                    443   VSPHERE.LOCAL\Administrator

PS C:\Users\Administrator>

RHEL7のvSphereテンプレートからの仮想マシンデプロイでカスタマイズができない



RHEL7仮想マシンテンプレートでvSphereの「テンプレートからの仮想マシンデプロイ」で「カスタマイズ」を行ってホスト名、IPアドレスを変更してみたところ、うまくいかなかった。

調査したところ、最小パッケージでは失敗することが判明。
RHEL 7, open-vm-tools, and guest customization

「perl」と「net-tools」が必須であるとのこと。
(open-vm-toolsについては標準でインストールされていた)

で、perl,net-toolsを追加したところ、カスタマイズしてのデプロイに成功した。

ESXi上のNutanix CE AHVの中でPrism Centralを立ち上げようとしたらKernel Panicで何もできない



ESXi6.0上に3ノードのNutanix CE AHVクラスタを組み、Prism Centralをインストールしようとしたら失敗した。

コンソールを開いてみるとKernel Panicしている。

Nutanix CE ce-2017.07.20-stableにおけるPrism Centralの1-Clickデプロイがコケる場合のバッドノウハウ的なワークアラウンド」をみてbootとhomeを入れ替えてみたが、何も状況は変わらなかった。
結果的にはこのbootとhomeの入れ替えはやる必要は無かった。

解決につながる情報は「Run Nutanix CE nested on VMware ESXi 6.5 – solving some of the challenges you will face」で引用されている「Prism Central not booting」にあった。

原文は下記

1/ deploy PrismCE using ce-pc-2017.07.20-metadata.json and ce-pc-2017.07.20.tar

2/ grab /var/lib/libvirt/NTNX-CVM/svmboot.iso from an AHV host using SCP/SFTP

3/ upload it as an ISO image in a PrismCE container with name boot_PRISMCE

4/ edit PrismCE VM settings:
delete DISK scsi.0
delete CDROM ide.0
add new disk type CDROM / Clone from Image service / Bus type=IDE / Image=boot_PRISMCE
select CDROM as Boot Device

5/ power on PrismCE VM
blank screen during 20 sec and then everything works

Nutanix CE AHVホストの/var/lib/libvirt/NTNX-CVM/svmboot.iso をscpで手元にダウンロードし、
Nutanix上のISOイメージとして登録
その後、Prism Central VMのCD-ROMドライブの割り当てを上記のsvmboot.isoにして起動

そうすることで、ログイン画面にたどり着きました。
ここからの手順は「INSTALLING THE PRISM CENTRAL VM (AHV)」の7番から参考にします。
ログインは「nutanix」「nutanix/4u」

初期プロセスがいろいろ動いてるようなのでログイン可能状態であっても、10分ぐらい待ちます
なお、キーボード配列を調整していない場合は「]む」で「|」を入力出来ます。
で、待ってると1回再起動すると思います。

再起動後「sudo tail -f /tmp/config_home_dir.log」を実行して、プロセスが一段落するのを待ちます。

この段階ではDHCPでIPアドレスを取得していると思われるので、/etc/sysconfig/network-scripts/ifcfg-eth0 を編集し、固定IPアドレスを設定
/etc/hostsに「127.0.0.1 NTNX-10-3-190-99-A-CVM」といった行がある場合は削除
/etc/resolv.conf にDNSサーバのエントリを登録
で、再起動。
IPアドレスが変わった場合は、起動後、即再起動がかかる。

その後、再度ログインしてから「ps -ef|grep rc.local」を実行して、rc.localの実行が終わることを確認。
rc.lcoal内に「sleep 120」があるので、最低2分かかる。

再起動して、またnutanixユーザでログイン
「cluster –cluster_function_list=”multicluster” -s IPアドレス create」を実行
ここら辺からは「Nutanix CE ce-2017.07.20-stableにおけるPrism Centralの1-Clickデプロイがコケる場合のバッドノウハウ的なワークアラウンド」の8番以降の手順を行うこととなる。

で、「REGISTER (UNREGISTER) WITH PRISM CENTRAL」でNutanixのクラスタにPrism Centralを接続する。

・・・というのをやろうとしたが、結局、cluster setupで延々とリトライを繰り返し、成功することはなかった・・・
Prism Centralを使わなくてもやりたかったことはできるというのがわかって、セットアップは諦めました。

なお、セットアップ途中のPrism Centrl仮想マシンはWeb GUIから削除できなかったので
Nutanix CVMにsshでログインしたあと
「acli vm.list」で仮想マシン名を確認し
「acli vm.delete 仮想マシン名」で削除を実行しました。

ESXi上にNutanix CE AHVをインストールした



ESXi 6.0基盤上で、Nutanix CEをインストールした。

インストール手順は下記の2つを参考にした
・ネットワールド Nutanix CE を Nested ESXiへインストールする9つのTips
・NTNX ESXi で Nested Nutanix CE を構成してみる。(ce-2018.01.31-stable 対応版)

iSCSIストレージのVMFS上に仮想ディスクをおいたところ、/sys/block/sd?/queue/rotationalの値は1だけど、Nutanix CE環境起動後に確認してみると、全部SSD認識となっていたので、ここの値変更は実施していない。

また、NTNXのページの方に書かれている「/home/install/phx_iso/phoenix/svm_template/kvm/default.xml」のmachineタイプ変更はやらなくても動いたので実施していない。
pmuの追加も「仮想 CPU のパフォーマンス カウンタの有効化」のチェックをオンにできる環境なので実施していない。

クラスタ作成は、インストーラ上の「Create single-node cluster?」にチェックを入れる手法は使わず、インストール後に手動でclusterコマンドを実行する手法をとった。
ただし、「cluster -s 192.168.1.191 create」というやり方では無く「cluster –dns_servers=192.168.1.100 –ntp_servers=192.168.1.101 -s 192.168.1.191 create」という形でDNSサーバとNTPサーバを指定する手法をとっている。

ただし、この手法の場合、DNSサーバとして追加で「8.8.8.8, 8.8.4.4」、NTPサーバとして「0.pool.ntp.org, 1.pool.ntp.org」も登録されているので、セットアップ完了後必要に応じ削除する必要がある。

詳細については→ Create & Configure Nutanix Cluster via command line を参照

インストール完了後、Nutanix CE仮想マシンにログインし、「/var/cache/libvirt/qemu/capabilities/3c76bc41d59c0c7314b1ae8e63f4f765d2cf16abaeea081b3ca1f5d8732f7bb1.xml」の値を変更しないと、仮想マシンが正常に起動しません。

通常、仮想マシンを作成すると「machine=’pc’」と設定されています。
NUTANIX AHV 20180425.199環境では、この「pc」というのは「pc-i440fx-rhel7.3.0」のエイリアスになっています。
ESXi上の仮想マシンの場合「pc-i440fx-rhel7.2.0」でないと起動しないので、エイリアスの設定先を変更します。

変更前

<machine name='pc-i440fx-rhel7.3.0' alias='pc' hotplugCpus='yes' maxCpus='240'/>
<machine name='pc-i440fx-rhel7.2.0' hotplugCpus='yes' maxCpus='240'/>

変更後

<machine name='pc-i440fx-rhel7.3.0' hotplugCpus='yes' maxCpus='240'/>
<machine name='pc-i440fx-rhel7.2.0' alias='pc' hotplugCpus='yes' maxCpus='240'/>

設定変更後は、全体の再起動を行います。

Hypervisorのホスト名を変える場合は、/etc/hostname と /etc/sysconfig/network のホスト名記載を書き換えます。
参考:CHANGING THE ACROPOLIS HOST NAME

CVMのホスト名を変える場合は、clusterを作った後にCVM上でrootになって「change_cvm_hostname 新ホスト名」を実行します
参考:Change CVM name
change_cvm_hostnameで変えたらPrismで「Rename CVM back to what it was originally. The CVM name is nonconfigurable by the end user.」という警告が・・・
どうやら、いまのバージョンではお薦めではないらしい