オレのあんちょこ

忘れないように

ESXi7をなるべく楽にインストールしたかった話(UEFI)

何の話?

つい先日40台ほどのESXiをインストールしたので、その時の備忘録と感想。

BIOSではisolinuxを弄ってホスト名ごとに読み込むkickstartを変えられたが、UEFIでのやり方が結局解らなかった。

環境

  • オンプレ
  • NX7700x(A5010E v2)
  • 40台(大別するとパラメータが5パターンある)

やったこと

流れとしては

1.kickstartを作成

2.ホスト毎にboot.cfgを作成

3.カスタムイメージをマウントして、boot.cfgを組み込んでgenisoimage

kickstartを作成

RHEL等とは違って、公式でkickstartについての記事が無かった為、先人達の知識を借りて以下の感じで。

データストア名とかポートグループ名は適当なのを書いています。

固有値は<>で

# EULAに同意
vmaccepteula

# rootのパスワード
# --iscryptedを付けた場合、sha512のハッシュで
rootpw --iscrypted <rootのパスワード>

# 1本目のディスクのパーティション初期化
clearpart --firstdisk --overwritevmfs
install --first disk --overwritevmfs

# キーボード言語
keyboard Japanese

# ライセンス
serialnum --esx=<ESXiのライセンス>

# NW設定(静的)
# --addvmportgroup=0にするとVM Networkが追加されない
# vlan、nameserverは指定しなくても動くが、DNSは無いとインストール中に警告が表示される
network --bootproto=static --device=vmnic0 --ip=<IP> --gateway=<デフォルトGW> --netmask=<サブネットマスク> --vlanid=<VLAN ID> --hostname=<ホスト名> --nameserver=<DNSサーバのIP> --addvmportgroup=1

# インタプリタ指定
%firstboot --interpreter=busybox

# ここからシェルで

# IPv6無効化
esxcli network ip set --ipv6-enabled=false

# hostsに登録
esxcli network ip hosts add -H <ホスト名> -I <IP>

# ルーティング
esxcfg-route -a <IP>/<サブネット長> <GW>

# SSHとシェルを有効化
vim-cmd hostsvc/enable_ssh
vim-cmd hostsvc/enable_esx_shell

# 起動(いらないかもしれない)
vim-cmd hostsvc/start_ssh
vim-cmd hostsvc/start_esx_shell

# WEBクライアントで入った際のSSHの警告を抑止
esxcli system settings advanced set -o /UserVars/SuppressShellWarning -i 1

# 時刻同期設定
### 内容は割愛

# 時刻同期反映
esxcli system ntp set -f=/etc/ntp.conf
esxcli system ntp set -e=yes

# 1本目のデータストアをリネーム
vim-cmd hostsvc/datastore/rename datastore1 system-area

# 2本目のデータストア作成(したかったけど出来なかった)
# 2本目のディスクIDを取得
DISK2_ID=$(ls /dev/disks / | grep T1:L0$)

# 既存のパーティションを削除
partedIUtil delete /dev/disks/${DISK2_ID} 1

# gptラベル付与
partedUtil mklabel /dev/disks/${DISK2} gpt

# エンドセクタ計算
ENDSECTOR=$(eval expr $(partedUtil getptbl /dev/disks/${DISK2_ID} | tail -1 | awk '{print $1 " \\* " $2 " \\* " $3}') - 1)

# VMFSのGUIDを取得
GUID=$(partedUtil showGuids | grep vmfs | awk '{print $2}')

# パーティション作成
partedUtil setptbl /dev/disks/${DISK2} gpt "1 2048 ${ENDSECTOR} ${GUID} 0"

# vmfs6でフォーマット
vmkfstools -C vmfs6 -S data-area /dev/disks/${DISK2_ID}:1

# vSwitch関連
# 標準スイッチのみ

# vSwitch0にvmnic5を追加
esxcfg-vswitch -L vmnic5 vSwitch0

# vSwitch1を作成
esxcfg-vswitch -a vSwitch1

esxcfg-vswitch -L vmnic2 vSwitch1
esxcfg-vswitch -L vmnic4 vSwitch1

# セキュリティポリシー
esxcli network vswitch standard policy security set -f false -m false -p false -v vSwitch0
esxcli network vswitch standard policy security set -f false -m false -p false -v vSwitch1

# ポートグループ追加
esxcfg-vswitch -A portgroup0 vSwitch0
esxcfg-vswitch -A portgroup1 vSwitch1

# フェイルオーバーポリシー
# -a アクティブ -s スタンバイ
# -pでポートグループ名を指定し、オーバーライドも出来る
esxcli network vswitch standard policy failover set -l explicit -v vSwitch0 -a vmnic0 -s vmnic5

# VLAN
esxcfg-vswitch --vlan=<VLAN ID> --pg=portgroup0 vSwitch0

# ファイアウォール無効化
esxcli network firewall set --enabled=false
esxcli network firewall unload

ホスト毎にboot.cfgを作成

カスタムイメージに組み込まれていた物から、titleとkernelopt以外変えていないので特筆すべき事も無い。

bootstate=0
title=webserver installation
timeout=5
prefix=
kernel=/b.b00
kernelopt=cdromBoot runweasel ks=cdrom:/KS/WEB/webserver.cfg
modules= # 割愛

これをこんな風に↓isoに格納したい。

カスタムイメージ(iso)
  |--KS
  |    |--WEB(サーバ種別)
  |        |--kickstart本体
  |--efi
  |    |--boot
  |        |--boot.cfg

カスタムイメージをマウントして、boot.cfgを組み込んでgenisoimage

VMware公式の手順で作成

sudo mount customimage.iso -t iso9660 /mnt
sudo genisoimage -relaxed-filenames -J -R -o <作りたいカスタムイメージの名前> -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot -info -table -eltorito-alt-boot -e efiboot.img -no-emul-boot /mnt

これを台数分実施。一先ず構築資材としてはこれで完成。

本当は

冒頭で書いた通り、本当はメディアブート後にホスト名を選択したかった。

BIOSの場合、カスタムイメージ内のisolinux.cfgにてLABELを指定し、そこで読み込むファイルを指定出来る。

ファイル名はboot.cfgでもunko.cfgでも問題無いので、後はその中に読み込ませたいkickstartファイル名を定義すれば良い。

これぐらいスマートなやり方を実現したかったが、boot.cfg以外を読ませるのも、boot.cfgに複数のエントリを定義したかったが無理だった。

(誰かやり方をご存知でしたら教えて下さい)

やってみて思った事

  • ESXiのコマンドリファレンスどこ
  • PowerCLIに頼るのも手。というか正直こっちの方が楽。VMも建てられるし
  • 実機を見ないと解らない事(DISKID、MAC)が多く、全部スクリプト化は無理
  • そもそもHWのインストール自動化(単純化)って難しくない?

所感

台数が台数だったので、どうやったら楽できるかという事を模索して出した1つの答えがコレ。

最適解とは言い難いが、kickstartを練ればある程度の設定はほぼ網羅できる。

ただ(見つけられなかっただけかもしれないが)サービスの自動起動設定が無かったりするので、

インストールはkickstart、設定はPowerCLIという使い分けがベターか?

また、HWに直接となるとどうしてもOSインストール以外に作業が必要となる。(FWとかドライバとか)

その辺りは今回活用できなかったiLO等で改善出来るかもしれないので、また機会があれば挑みたい所。