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等で改善出来るかもしれないので、また機会があれば挑みたい所。