こんにちは、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にチャレンジしてみてください。