はじめに
以前に、ESXi上にVMを自動生成したくて、以下のようなエントリを作成しました。(が、失敗しました)
ので、今回はproxmoxを利用して Kickstart と Cloud-Init で同じことを実施しました。
今回は無事想定する動作となりました。めでたす。
今回の手法で ↓ のようなことができるようになりました。
- Proxmoxの
qm
コマンド一発で - VM生成して起動
- Kickstartにより無操作でインストール完了
- Cloud-Initによりユーザ追加とネットワーク設定を実施
これまでネットワークの静的アドレス設定する場合は、LXCを作成するときにIPアドレスを指定するしかできなかったのですが、同じような操作感でVMでも実現できるようになりました。
これでコマンド打ったら待つだけでVMが初期設定し終わった状態で即SSHアクセスできる~!
めちゃらく~!
対象のOSはPhotonOS(5.0GA版)です。
Cloud-Init対応イメージなら、同じような手順で応用ができると思います。
作業内容
PhotonOSを利用しますが、ベースとなるバージョンは 公式ページ から好きなものを選択してください。
今回の例では 5.0GA バージョンを利用しています。
ここからの作業は全てproxmoxのコンソールで行っています。
kickstart用メディアを作成
作業用ディレクトリにisoファイルの中身をコピーする。
mkdir -p /root/work/kickstart/mnt
cd /root/work/kickstart/
wget https://packages.vmware.com/photon/5.0/GA/iso/photon-minimal-5.0-dde71ec57.x86_64.iso
mount -t iso9660 -o loop ./photon-minimal-5.0-dde71ec57.x86_64.iso ./mnt
cp -rp ./mnt ./ks
umount ./mnt
rm -f ./photon-minimal-5.0-dde71ec57.x86_64.iso
ここにkickstart用のファイルを配置する。
(実際にはサンプルファイルをリネームするだけです)
mv ./ks/isolinux/sample_ks.cfg ./ks/isolinux/ks.cfg
ブートメニュをキックスタート専用に置き換える。
sed -i /root/work/kickstart/ks/isolinux/menu.cfg \
-e 's/append/append ks=cdrom:\/isolinux\/ks.cfg/'
起動時のメニュ選択タイムアウトを短くする。
(デフォルトがゼロなので、Enterを押さないと永遠に待ち状態になる)
sed -i /root/work/kickstart/ks/isolinux/isolinux.cfg \
-e 's/timeout\ 0/timeout 1/'
キックスタート用設定ファイルを含めたISOファイルを生成する
mkisofs -J -r -o /var/lib/vz/template/iso/photon-5.0-ks.iso \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 \
-boot-info-table ./ks
kickstartのコンフィグは以下のようなものなので、必要に応じてカスタマイズすると良いです。
ただし、ユーザ設定とネットワーク設定は、次のCloud-Initで上書きされるため、パーティション設定や追加パッケージのあたりが有効となる項目です。
{
"hostname": "photon-machine",
"password":
{
"crypted": false,
"text": "changeme"
},
"disk": "/dev/sda",
"partitions": [
{"mountpoint": "/", "size": 0, "filesystem": "ext4"},
{"mountpoint": "/boot", "size": 128, "filesystem": "ext4"},
{"mountpoint": "/root", "size": 128, "filesystem": "ext4"},
{"size": 128, "filesystem": "swap"}
],
"packagelist_file": "packages_minimal.json",
"additional_packages": ["vim"],
"postinstall": [
"#!/bin/sh",
"echo \"Hello World\" > /etc/postinstall"
],
"public_key": "<ssh-key-here>",
"linux_flavor": "linux",
"photon_docker_image": "photon:3.0"
}
SSH鍵の設定は修正が必要そうな書き方になってますが、このまま突っ込んでもエラーなどで止まったりせずに最後まで進めますので無視でOKです。(Cloud-Initで上書きしますしね)
設定可能な項目は 公式ドキュメント がありますので参照ください。
VM作成
proxmoxの qm
コマンドでVMを作成すると同時にCloud-Init用設定とそのためのメディアを追加しています。
Cloud-Initで設定する項目は --ciuser
--cipassword
--ipconfig0
--sshkeys
のあたりです。
設定可能な項目や使い方などは qmコマンドリファレンス や Cloud-Init Support を参照してください。
qm create 999 \
--name vm-ci \
--cores 4 \
--memory 8192 \
--machine q35 \
--scsihw virtio-scsi-pci \
--boot order='sata0;sata1' \
--sata0 local-lvm:8 \
--sata1 local:iso/photon-5.0-ks.iso,media=cdrom \
--sata2 local-lvm:cloudinit \
--net0 virtio,bridge=vmbr1,tag=10 \
--ciuser ci-user \
--cipassword changeme \
--ipconfig0 ip=dhcp \
--sshkeys /root/.ssh/authorized_keys \
--start 1
# IPを指定する場合は以下のようにする
# --ipconfig0 ip=192.168.0.99/24,gw=192.168.0.254 \
このコマンドだけで完了です。
このあとコンソールを開くと、こんな感じでkickstartによる自動インストールが始まっています。
動作チェック
作成されたVMの状態を見てみます。
コンソールから root
ユーザでログインしてみます。
Cloud-Initで設定したネットワークが反映されていますね(DHCPによる自動取得)
ci-userではSSH鍵も登録しているので、SSHアクセスもできました。
qm stop 999 && qm destroy 999 --purge
Cloud-Initコマンド
Cloud-Initで設定した情報を表示
# ネットワーク情報を表示
qm cloudinit dump 999 network
# ユーザ情報を表示
qm cloudinit dump 999 user
さいごに
もっとはやくproxmoxに乗り換えときゃよかった
参考
proxmox
photon os