LoginSignup
2
2

Proxmoxのコマンド一発でVM自動生成してネットワーク設定してユーザ追加する

Posted at

はじめに

以前に、ESXi上にVMを自動生成したくて、以下のようなエントリを作成しました。(が、失敗しました)

ので、今回はproxmoxを利用して KickstartCloud-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で上書きされるため、パーティション設定や追加パッケージのあたりが有効となる項目です。

isolinux/ks.cfg
{
    "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による自動インストールが始まっています。
image.png

動作チェック

作成されたVMの状態を見てみます。

コンソールから rootユーザでログインしてみます。
Cloud-Initで設定したネットワークが反映されていますね(DHCPによる自動取得)
image.png

ci-userではSSH鍵も登録しているので、SSHアクセスもできました。
image.png

仮想マシンの状態はこんな感じ
image.png

Cloud-Initの設定はこんな感じ
image.png

停止して削除
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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2