Proxmox VE cloud-init で Ubuntu 20.04 を起動する

Proxmox VE に cloud-init 機能が追加されたので試してみる

参考文献

準備

イメージの修正の所で使うのでインストールしておく

1
apt-get install libguestfs-tools

次にエディターを nano に設定する

1
2
printenv | grep EDITOR
export EDITOR=nano

イメージの修正

cloud-init を利用してパッケージなどがすでに入った状態のイメージを作成したいため、ダウンロードしたイメージを編集する
今回は Ubuntu 20.04 LTS を使うためダウンロードする

1
2
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
cp -av focal-server-cloudimg-amd64.img ubuntu-20.04.img

以下のファイルを作成した

  • やってること
    • history の設定を変更
    • apt/source.list を jp.archive.ubuntu.com に向ける
    • パッケージのインストール
    • ntp を chrony でマルチフィードと NICT をサーバーとして登録
    • TimeZone を Asia/Tokyo
    • 全部流せてたら 1分後に再起動
11_template.cfg
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#cloud-config

# This will cause the set+update hostname module to not operate (if true)
preserve_hostname: false

write_files:
  - content: |
      # history initialization
      HISTTIMEFORMAT='%Y-%m-%dT%H:%M:%S.%s%z '
      HISTSIZE=10000
      HISTFILESIZE=10000
      HISTCONTROL=ignoreboth
      PROMPT_COMMAND='history -a; history -c; history -r'      

    path: /etc/profile.d/servers.sh
    append: false

apt:
  preserve_sources_list: false
  primary:
    - arches: [amd64, i386]
      uri: http://jp.archive.ubuntu.com/ubuntu

package_upgrade: true
packages:
    - qemu-guest-agent
    - nano
    - wget
    - curl
    - mtr
    - tcpdump
    - traceroute
    - htop
    - net-tools

ntp:
  enabled: true
  ntp_client: chrony
  servers:
      - ntp1.jst.mfeed.ad.jp
      - ntp2.jst.mfeed.ad.jp
      - ntp3.jst.mfeed.ad.jp
      - ntp.nict.jp

timezone: "Asia/Tokyo"

power_state:
  delay: "+1"
  mode: reboot
  message: Bye Bye
  timeout: 30
  • 作成したファイルをイメージにコピーする
1
virt-copy-in -a ubuntu-20.04.img 11_template.cfg /etc/cloud/cloud.cfg.d

念の為確認しとく

1
2
3
4
5
# virt-ls -a ubuntu-20.04.img 11_template.cfg /etc/cloud/cloud.cfg.d/
05_logging.cfg
11_template.cfg
90_dpkg.cfg
README

テンプレート用VM作成

ちょくちょく出てくる物を変数として定義しとく 変数の中身は各自変更する事

1
2
3
4
export PVE_TMP_VMID=9000
export PVE_VOLUME=cephrbd01
export PVE_NET0_VLAN=221
export PVE_USERNAME=naa0yama

続いてテンプレートにするためのVMを作る 弊宅ではVLAN が引かれてるので tag=${PVE_NET0_VLAN} を付けているが必要ない場合は後で抜くかコマンドから抜く

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
qm create ${PVE_TMP_VMID} --name "Ubuntu-20.04" --cores 2 --memory 2048 --net0 virtio,bridge=vmbr0,tag=${PVE_NET0_VLAN}
qm importdisk ${PVE_TMP_VMID} ubuntu-20.04.img ${PVE_VOLUME}
qm set ${PVE_TMP_VMID} --scsihw virtio-scsi-pci --scsi0 ${PVE_VOLUME}:vm-${PVE_TMP_VMID}-disk-0
qm set ${PVE_TMP_VMID} --ide2 ${PVE_VOLUME}:cloudinit
qm set ${PVE_TMP_VMID} --boot c --bootdisk scsi0
qm set ${PVE_TMP_VMID} --serial0 socket --vga serial0
qm set ${PVE_TMP_VMID} --ostype l26
qm set ${PVE_TMP_VMID} --agent enabled=1,fstrim_cloned_disks=1
qm set ${PVE_TMP_VMID} --ciuser ${PVE_USERNAME}
curl -sfSL https://github.com/${PVE_USERNAME}.keys -o ${PVE_USERNAME}.keys
qm set ${PVE_TMP_VMID} --sshkeys ${PVE_USERNAME}.keys
qm template ${PVE_TMP_VMID}
1
qm create ${PVE_TMP_VMID} --name "Ubuntu-20.04" --cores 2 --memory 2048 --net0 virtio,bridge=vmbr0,tag=${PVE_NET0_VLAN}

ダウンロードしてきたイメージをインポート

1
qm importdisk ${PVE_TMP_VMID} ubuntu-20.04.img ${PVE_VOLUME}

アタッチ

1
qm set ${PVE_TMP_VMID} --scsihw virtio-scsi-pci --scsi0 ${PVE_VOLUME}:vm-${PVE_TMP_VMID}-disk-0

続いて、Cloud-initが利用するCDROMドライブを設定します。

1
qm set ${PVE_TMP_VMID} --ide2 ${PVE_VOLUME}:cloudinit

先ほどアタッチしたディスクをブートディスクとして設定します。

1
qm set ${PVE_TMP_VMID} --boot c --bootdisk scsi0

Cloud-initはシリアルコンソールを使用するため、その設定をします。

1
qm set ${PVE_TMP_VMID} --serial0 socket --vga serial0
  • OS Type の設定 (l26 はGUIの Linux 2.6 - 5.X Kernelと同じ意味)
  • QEMU Guset Agent をオンにする
1
2
qm set ${PVE_TMP_VMID} --ostype l26
qm set ${PVE_TMP_VMID} --agent enabled=1,fstrim_cloned_disks=1
  • cloud-init の User
1
qm set ${PVE_TMP_VMID} --ciuser ${PVE_USERNAME}
  • cloud-init の SSH public Key を設定
    • GitHub から取ってきてファイルを指定する
1
2
curl -sfSL https://github.com/${PVE_USERNAME}.keys -o ${PVE_USERNAME}.keys
qm set ${PVE_TMP_VMID} --sshkeys ${PVE_USERNAME}.keys
  • cloud-init の IP Config (net0) を開いて DHCP にしておくと少し楽になるかも

カスタムが完了したのでテンプレートにする

1
qm template ${PVE_TMP_VMID}

使い方

  1. テンプレートを選択して Full Clone する
  2. Cloud-init タブで IP Config(net0) をダブルクリック IP の静的設定する
  3. Options タブで Name を修正する
  4. 起動する

CentOS の場合

CentOS Cloud images

  • qcow2c をダウンロードして raw イメージにしておく
1
wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-2009.qcow2c
  • qcow2c イメージを qcow2 イメージに変更
1
2
3
qemu-img convert -f qcow2 -O qcow2 CentOS-7-x86_64-GenericCloud-2009.qcow2c CentOS-7-x86_64-GenericCloud-2009.qcow2
rm CentOS-7-x86_64-GenericCloud-2009.qcow2c
mv CentOS-7-x86_64-GenericCloud-2009.qcow2 CentOS-7-2009.qcow2
  • Ubuntuの時と同じ方法で cloud-init の設定を送り込む
1
virt-copy-in -a CentOS-7-2009.qcow2 11_template.cfg /etc/cloud/cloud.cfg.d
  • 仮想マシンを作る
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
qm create ${PVE_TMP_VMID} --name "CnetOS-7-2009" --cores 2 --memory 2048 --net0 virtio,bridge=vmbr0,tag=${PVE_NET0_VLAN}
qm importdisk ${PVE_TMP_VMID} CentOS-7-2009.qcow2 ${PVE_VOLUME}
qm set ${PVE_TMP_VMID} --scsihw virtio-scsi-pci --scsi0 ${PVE_VOLUME}:vm-${PVE_TMP_VMID}-disk-0
qm set ${PVE_TMP_VMID} --ide2 ${PVE_VOLUME}:cloudinit
qm set ${PVE_TMP_VMID} --boot c --bootdisk scsi0
qm set ${PVE_TMP_VMID} --serial0 socket --vga serial0
qm set ${PVE_TMP_VMID} --ostype l26
qm set ${PVE_TMP_VMID} --agent enabled=1,fstrim_cloned_disks=1
qm set ${PVE_TMP_VMID} --ciuser ${PVE_USERNAME}
curl -sfSL https://github.com/${PVE_USERNAME}.keys -o ${PVE_USERNAME}.keys
qm set ${PVE_TMP_VMID} --sshkeys ${PVE_USERNAME}.keys
qm template ${PVE_TMP_VMID}

※ ホスト名は設定が書き換えできないようなので下記のコマンドで書き換えておく

1
sudo hostnamectl set-hostname persistent-hostname

GitHub にレポジトリを作った

  • Cumulus Linux の場合
  • Ubuntu 20.04 用ダウンロードして template 登録まで
Built with Hugo
テーマ StackJimmy によって設計されています。