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

# はじめに

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

https://qiita.com/bashaway/items/c80c3300168a945d848a

ので、今回はproxmoxを利用して **Kickstart** と **Cloud-Init** で同じことを実施しました。
今回は無事想定する動作となりました。めでたす。


今回の手法で ↓ のようなことができるようになりました。
* Proxmoxの`qm`コマンド一発で
* VM生成して起動
* Kickstartにより無操作でインストール完了
* Cloud-Initによりユーザ追加とネットワーク設定を実施

これまでネットワークの静的アドレス設定する場合は、LXCを作成するときにIPアドレスを指定するしかできなかったのですが、同じような操作感でVMでも実現できるようになりました。

これでコマンド打ったら待つだけでVMが初期設定し終わった状態で即SSHアクセスできる～！
めちゃらく～！

 
対象のOSはPhotonOS（5.0GA版）です。
Cloud-Init対応イメージなら、同じような手順で応用ができると思います。

# 作業内容

PhotonOSを利用しますが、ベースとなるバージョンは **[公式ページ](https://github.com/vmware/photon/wiki/Downloading-Photon-OS)** から好きなものを選択してください。
今回の例では 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で上書きしますしね）

設定可能な項目は **[公式ドキュメント](https://vmware.github.io/photon/assets/files/html/3.0/photon_user/kickstart.html)** がありますので参照ください。



## VM作成

proxmoxの `qm` コマンドでVMを作成すると同時にCloud-Init用設定とそのためのメディアを追加しています。
Cloud-Initで設定する項目は `--ciuser` `--cipassword` `--ipconfig0` `--sshkeys` のあたりです。
設定可能な項目や使い方などは **[qmコマンドリファレンス](https://pve.proxmox.com/pve-docs/qm.1.html)** や **[Cloud-Init Support](https://pve.proxmox.com/wiki/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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/af5cf12a-3b17-d2b1-26f3-4443c1f3ed29.png)



## 動作チェック

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

コンソールから `root`ユーザでログインしてみます。
Cloud-Initで設定したネットワークが反映されていますね（DHCPによる自動取得）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/66a5b73c-913c-1150-df24-431e8db17dff.png)

ci-userではSSH鍵も登録しているので、SSHアクセスもできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/c1e15b27-0b26-3364-ed13-b53ea716fde4.png)

仮想マシンの状態はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/7eb70cb8-4c38-f885-521b-a7fcdd666c72.png)

Cloud-Initの設定はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/dee2b2a6-0a67-984d-5c04-8d5838900d96.png)




```:停止して削除
qm stop 999 && qm destroy 999 --purge
```


## Cloud-Initコマンド

Cloud-Initで設定した情報を表示

```
# ネットワーク情報を表示
qm cloudinit dump 999 network

# ユーザ情報を表示
qm cloudinit dump 999 user
```

# さいごに

もっとはやくproxmoxに乗り換えときゃよかった



# 参考

## proxmox

https://pve.proxmox.com/pve-docs/qm.1.html

https://pve.proxmox.com/wiki/Cloud-Init_Support


## photon os

https://vmware.github.io/photon/assets/files/html/3.0/photon_user/kickstart.html

https://vmware.github.io/photon/assets/files/html/3.0/photon_admin/cloud-init-on-photon-os.html

https://github.com/vmware/photon/issues/1393#issuecomment-1442808988