Amazon Linux 2023 を vagrant で使うメモ
Section 1.3 packer で box 作成 packer で box 作成 2 - provisioners -
About
Section 2.2 で作成した amazonlinux2023.12.pkr.hcl 内で必要なファイルを作成していきます。
Cloud-init のための seed.iso
OSイメージはあるが、中身はある意味で空っぽなので Cloud-init を使って初期化するための情報を作成します。 公式ドキュメントとしては KVM および VMware での Amazon Linux 2023 の NoCloud (seed.iso) cloud-init 設定 を参考にすることになります。
まずは seed フォルダ 内に、meta-data と user-data を作成します。
meta-data
#cloud-config
local-hostname: localhost.example.com
host名くらい
user-data
#cloud-config
users:
- name: ec2-user
sudo: ALL=(ALL) NOPASSWD:ALL
lock_passwd: false
plain_text_passwd: vagrant
- name: vagrant
sudo: ALL=(ALL) NOPASSWD:ALL
lock_passwd: false
plain_text_passwd: vagrant
ssh_pwauth: true
timezone: Asia/Tokyo
locale: ja_JP.utf8
最後の二行はmeta-dataな気もするけれどいったんこの内容で、isoイメージを作成します。
seed.iso の作成
ここでは、cygwin をインストールして cdrkit というパッケージをインストールして作成しました。 ほかに簡単にisoイメージが作成できる環境があればそれを使ってください。
$ cd /cygdrive/c/vagrant/packer-amazonlinux2023/seed
$ genisoimage -output ../seed.iso -volid cidata -joliet -rock user-data meta-data
これで、seed.iso が作成できます。 user-data や meta-data の内容を変えるたびに、isoイメージを作る必要があります。
Vagrantfile.template の作成
作成された box に初期設定を埋め込むためのテンプレートファイルを作成します。 vagrant-config フォルダの中に、Vagrantfile.template ファイルを作成します。
Vagrantfile.template
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |vb|
# PAE/NX On
vb.customize ["modifyvm", :id, "--pae", "on"]
# Serial port setting
vb.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
end
end
フォルダ構造の確認
ここまでで、基礎となるファイルが一式そろったので、環境を整えるための provisioners の中身を作成していきます。
現時点での構成はこうなっています。
[-] C:\
`--[-] vagrant
|--[+] box
|--[+] iso
|--[-] packer-amazonlinux2023
| |--[+] provisioners
| |--[-] seed
| | |-- meta-data
| | `-- user-data
| |--[-] vagrant-config
| | `-- Vagrantfile.template
| |-- amazonlinux2023.12.pkr.hcl
| `-- seed.iso
`-- packer.exe
ここから provisioners にファイルを追加していくのでこうなっていきます。
[-] C:\
`--[-] vagrant
|--[+] box
|--[+] iso
|--[-] packer-amazonlinux2023
| |--[-] provisioners
| | |-- vagrant.sh
| | |-- kernel-update-6.18.sh
| | |-- kernel-update-clean.sh
| | |-- virtualbox.sh
| | `-- cleanup.sh
| |--[-] seed
| | |-- meta-data
| | `-- user-data
| |--[-] vagrant-config
| | `-- Vagrantfile.template
| |-- amazonlinux2023.12.pkr.hcl
| `-- seed.iso
`-- packer.exe
ファイル名から何となく察することができるかと思いますがサクサク作っていきます。
provisioners/vagrant.sh
vagrant ユーザーの認証方法の追加設定。
echo 'Setup vagrant account'
mkdir -pm 700 /home/vagrant/.ssh
curl -L https://raw.githubusercontent.com/hashicorp/vagrant/refs/heads/main/keys/vagrant.pub -o /home/vagrant/.ssh/authorized_keys
chmod 0600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant:vagrant /home/vagrant/.ssh
Cloud-init で vagrant ユーザーは作成されているので vagrant ssh ではいれるようにカギを入れておきます。
rootになる suoder の設定も Cloud-init で処理されているのでここでは対応しません。
provisioners/kernel-update-6.18.sh
EC2のAMIで選べるkernelバージョンが 6.18 らしいので、6.1 から upgrade します。
echo "Upgrade kernel from 6.1 to 6.18"
dnf -y install kernel6.18
echo "Set default boot kernel"
version=$(rpm -q --qf '%{version}-%{release}.%{arch}\n' kernel6.18 | sort -V | tail -1)
grubby --set-default "/boot/vmlinuz-$version"
reboot
dnf で新しい kernel をインストールして、grubby でboot時のkernelを指定しています。
provisioners/kernel-update-clean.sh
古い kernelを削除します。
echo 'Remove old kernel'
dnf remove -y kernel
provisioners/virtualbox.sh
VirtualBox Guest Addition をインストールします。 必要なものを dnf でインストール。kernelバージョンに合わせたものも必要なのでごにょごにょしています。 インストーラーの入った iso イメージは、VirutalBoxの公式サイトからダウンロードしてそれを使っています。
echo 'Install VBoxLinuxAdditions'
dnf -y install gcc gcc-c++ make perl
KERNEL_VERSION=$(uname -r | sed -E "s/(^6...).*/\1/g")
dnf -y install kernel${KERNEL_VERSION}-devel kernel${KERNEL_VERSION}-headers
VBOX_VERSION=$(cat /home/vagrant/.vbox_version)
wget https://download.virtualbox.org/virtualbox/${VBOX_VERSION}/VBoxGuestAdditions_${VBOX_VERSION}.iso -O /tmp/VBoxGuestAdditions.iso
mount -o loop /tmp/VBoxGuestAdditions.iso /mnt
sh /mnt/VBoxLinuxAdditions.run
# /sbin/rcvboxadd quicksetup all
umount /mnt
rm -rf /tmp/VBoxGuestAdditions.iso
echo 'VBoxLinuxAdditions installed.'
provisioners/cleanup.sh
最後に容量を圧縮するためにいろいろ削除していきます。
echo 'Clenup'
dnf -y clean all
rm -f /tmp/*
dd if=/dev/zero of=/EMPTY bs=1M
rm -f /EMPTY
これで box ファイルの圧縮率を上げています。
HCL2ファイルの修正
shellファイルが準備できたので、実行するようにHCL2ファイル、amazonlinux2023.12.pkr.hclを書き換えます。
build {
sources = ["sources.virtualbox-ovf.AmazonLinux2023"]
provisioner "shell" {
execute_command = "echo 'vagrant' | sudo -S sh '{{ .Path }}'"
scripts = [
"./provisioners/vagrant.sh"
]
}
provisioner "shell" {
execute_command = "echo 'vagrant' | sudo -S sh '{{ .Path }}'"
scripts = [
"./provisioners/kernel-update-6.18.sh"
]
expect_disconnect = true
pause_after = "30s"
}
provisioner "shell" {
execute_command = "echo 'vagrant' | sudo -S sh '{{ .Path }}'"
scripts = [
"./provisioners/kernel-update-clean.sh",
"./provisioners/virtualbox.sh",
"./provisioners/cleanup.sh",
]
}
post-processor "vagrant" {
keep_input_artifact = false
vagrantfile_template = "./vagrant-config/Vagrantfile.template"
output = "./AmazonLinux-${var.al_version}_VB${var.virtualbox_version}.box"
}
}
という感じに書き換わります。
packer build
すべて整ったらpowershellからpackerを実行します。
PS> cd c:\vagrant\packer-amazonlinux2023
PS> ..\packer.exe build amazonlinux2023.12.pkr.hcl
必ずHCLファイルがある場所に移動してから実行してください。相対パスに影響するのでその場所で実行という感じになります。
実行後は、勝手にvirtualbox のウィンドウが開いてインストールが始まり、再起動後に、今度はpowershellのコンソールからコマンドが実行される様子が見られ、勝手に終了してboxファイルの作成まで進みます。
完成すれば、HCL内のoutputに書いたファイル名で出力されているので、あとはvagrantから使ってみましょう。