Ubuntu AutoinstallでOSインストール自動化

こんにちは、GMOインターネット長谷川です。
今回は技育祭スポンサーセッションLTでお話したOSインストールの自動化をより詳しくお伝えしていこうと思います。

OSのインストール自動化のツールやOSが対応している設定ファイルに関して

代表的なツール

cobbler

MAAS

DHCP + tftp + web サーバによる自作

cobbler、MAAS共にdebian系やredhat系のOSをインストールできます。
今回は内部でどのように動いているのか、また構築されているのかを把握するため DHCP + tftp + web サーバ の構成を前提として説明を進めていこうと思います。

OSの対応する設定ファイル

preseed

kickstart

Autoinstall

OSの対応する設定ファイルとしてはpreseed (Debian系OS対応)、kickstart(RedHat系対応)、Autoinstall(Ubuntu対応)があります。
しかし、2022年4月リリース予定のUbuntu22.04ではpreseedは非対応となりますので、Ubuntu22.04のOSインストール自動化に対応するにはAutoinstallを理解する必要があります。

Autoinstallの形式

まずは、自動化をするにあたり一番重要となるAutoinstallの設定ファイル(user-dataファイル)から見ていきましょう。
見ての通り、user-dataファイルはcloud-initの形式で記述されます。
また、記述しなかったトップレベルキーに関しては、デフォルトの値が自動的にインストール時に適用されます。

#cloud-config
autoinstall:
  version: 1
  early-commands:
    - systemctl stop ssh
  locale: en_US.UTF-8
  reporting:
    builtin:
      type: print
  keyboard:
    layout: jp
  network:
    network:
      version: 2
      ethernets:   
        eno1: {}
        eno2: {}
....
....

ネットワーク経由でのOSインストールとAutoinstall

ネットワーク経由でのOSインストールはPXE bootを使います
PXEでのOSインストールは簡単に図式すると以下のような流れを辿ります。

PXEブート用のサーバ設定

構築環境
また今回構築する環境のネットワークは1セグメントで有ると仮定します。
(通常の業務では複数のセグメントを使用しますが説明簡略化のため)

# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.4 LTS"
# uname -r
5.4.0-100-generic

必要なパッケージのインストール

apt-get update
apt-get install -y  dnsmasq apache2 syslinux

ディレクトリ作成

mkdir -p /var/ftpd/tftpboot/Ubuntu
mkdir /var/ftpd/tftpboot/grub
mkdir /var/ftpd/tftpboot/pxelinux.cfg
mkdir -p /var/www/pxeboot/autoinstall
mkdir /pxeboot/autoinstall/01-[PXEで使うNICのMACアドレス]
mkdir /mnt

boot時に必要になる起動ファイルのダウンロード&ISOのダウンロード
ダウンロードが完了したらISOをマウントします。

wget http://archive.ubuntu.com/ubuntu/dists/focal/main/uefi/grub2-amd64/current/grubnetx64.efi
cp grubnetx64.efi /var/ftpd/tftpboot
wget https://releases.ubuntu.com/20.04/ubuntu-20.04.3-live-server-amd64.iso
mount -t iso9660 -o loop ubuntu-20.04.3-live-server-amd64.iso /mnt/

カーネル起動時に必要になるファイルをマウントしたISOから取得します。

cp /mnt/casper/{vmlinuz,initrd} /tftpboot/Ubuntu

grub.cfgにAutoinstallとISOをどこから読み込むか記述します。

vim /tftpboot/grub/grub.cfg

grub.cfg

if loadfont /boot/grub/font.pf2 ; then
        set gfxmode=auto
        insmod efi_gop
        insmod efi_uga
        insmod gfxterm
        terminal_output gfxterm
fi

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

set timeout=5

# 以下のmenuentryを新規追加する
menuentry "Install Ubuntu Server (Pull the iso from web)" {
        set gfxpayload=keep
        linux   /Ubuntu/vmlinuz autoinstall ip=dhcp url=http://[ PXEサーバのIP ]/pxeboot/[ ISO名 ] ds=nocloud-net\;s=http://[ PXEのサーバのIP ]/pxeboot/autoinstall/01-${net_default_mac}/ only-ubiquity ---
        initrd  /Ubuntu/initrd
}

PXEの設定ファイルの記述

vim /tftpboot/pxelinux.cfg/default 

default

default autoinstall
label autoinstall
  kernel Ubuntu/vmlinuz
  initrd Ubuntu/initrd
  append autoinstall ip=dhcp url=http://[ PXEサーバのIP ]/pxeboot/[ ISO名 ] ds=nocloud-net\;s=http://[ PXEサーバのIP ]/pxeboot/autoinstall/01-${net_default_mac}/

DHCPサーバ&TFTPサーバ設定
dnsmasqはDHCPとTFTP両方の機能を持つことが出来るので一括で設定します。
***.***.***.250の部分はリースするIPアドレス
***.***.***.***はPXEサーバのIPアドレス

vim /etc/dnsmasq.d/pxeboot.conf

pxeboot.conf

interface=eth1
# dhcpでリースするIPの範囲
dhcp-range=***.***.***.250,***.***.***.255,1h
log-dhcp
# PXEしたときに最初にloadされるファイルとその後のtftpのアドレス
dhcp-boot=grubnetx64.efi,***.***.***.***
pxe-service=x86PC,"Network Boot",grubnetx64.efi,***.***.***.***
enable-tftp
# tftpのrootディレクトリ
tftp-root=/var/ftpd/tftpboot
#以下はsystemd-resolvedとの共存設定
domain-needed
bogus-priv
strict-order
bind-interfaces
cache-size=256 

ISOをboot時に読み込んでこれるようwebサーバのディレクトリにコピーします。

cp ubuntu-20.04.3-live-server-amd64.iso /var/www/pxeboot

webサーバの設定
apache2に/var/www/pxeboot/をhttp://PXEサーバIP/pxeboot/で公開する設定を入れます。

vim /etc/apache2/sites-available/pxeboot.conf

pxeboot.conf

Alias /pxeboot/ "/var/www/pxeboot/"
<Directory "/pxeboot">
Options Indexes MultiViews FollowSymlinks
AllowOverride None
Require all granted
</Directory>
ln -s /etc/apache2/sites-available/pxeboot.conf /etc/apache2/site-enabled/pxeboot.conf

Autoinstallでの要となるファイルの配置

Autoinstallはcloud-init形式のuser-dataファイルを使うことはブログの冒頭で説明しました。
その他に必要となるファイルもこちらで同時に作成していきます。

meta-dataファイルに関しては空ファイルで問題ないのでtouchで作成します。
user-dataファイルは必要に応じてお好きな設定を記述しましょう。

touch /pxeboot/autoinstall/01-[ PXEで使うNICのMACアドレス ]/meta-data
vim /pxeboot/autoinstall/01-[ PXEで使うNICのMACアドレス ]/user-data

user-data

#cloud-config
autoinstall:
  version: 1
  early-commands:
    - systemctl stop ssh
  locale: ja_JP.UTF-8
  storage:
    grub:
      reorder_uefi: False
    config:
      - {ptable: gpt, path: /dev/sda, wipe: superblock-recursive, preserve: false, name: '',
        grub_device: false, type: disk, id: disk-sda}
      - {device: disk-sda, size: 536870912, wipe: superblock, flag: boot, number: 1,
        preserve: false, grub_device: true, type: partition, id: partition-0}
      - {fstype: fat32, volume: partition-0, preserve: false, type: format, id: format-0}
      - {device: disk-sda, size: -1, wipe: superblock, flag: '', number: 2,
        preserve: false, type: partition, id: partition-1}
      - {fstype: ext4, volume: partition-1, preserve: false, type: format, id: format-1}
      - {device: format-1, path: /, type: mount, id: mount-1}
      - {device: format-0, path: /boot/efi, type: mount, id: mount-0}
  keyboard:
    layout: jp
  apt:
    preserve_sources_list: false
    primary:
      - arches: [amd64]
        uri: "http://archive.ubuntu.com/ubuntu/"

systemd-resolved&dnsmasq&apache2を再起動してISOのアンマウント

systemctl restart systemd-resolved
systemctl restart dnsmasq
systemctl restart apache2
umount /mnt

あとは、サーバのboot設定をPXEにしてbootするとOSの自動インストールが走り始めます。

さいごに

以上AutoinstallによるOSインストール自動化をご紹介しました。
Ubuntu22.04ではpreseedがサポートされなくなりますので、是非この機会にAutoinstallにチャレンジしてみてください。

ブログの著者欄

長谷川 泰斗

GMOインターネットグループ株式会社

2020年 GMOインターネットグループ株式会社 新卒入社
クラウド基盤エンジニア
お名前.com KVM, ConoHa VPS等の開発運用に従事

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW