きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

Creating RHEL7.3 Vagrant Box using Packer and VitualBox on Windows10

準備するもの。
  1. VirtualBox + Extension Pack
  2. Packer
  3. Vagrant
  4. RHEL

あと、ハッシュ計算できるコマンドも必要かな。
自分の場合はpowershell立ち上げたらmd5sumなどが見つかったけど。
とりあえず、RHEL以外をインストールしてくださいな。

RHELの話

Red Hat Developer Programに参加して、
(登録は必要だけど)無償でRHELを手にいれます。
あくまで個人用で、VirtualBox上で動かします。
VirtualBoxで動かす例は、Red Hatのページでも手順が公開されていますが、
手でペチペチインストールするのが面倒臭くなるので徐々に自動化します。

はじめは手でインストール

anaconda-ks.cfgが欲しいじゃないですか。
それを手直しして、とりあえずこういう感じのにしました。
firewallを書き忘れてたり、ツッコミどころはたくさん。
ミニマムインストールなのに、レポジトリの追加もしてます。
いつか使うかもしれんから勉強のために追加してるだけです。

auth --enableshadow --passalgo=sha512
repo --name="Server-HighAvailability" --baseurl=file:///run/install/repo/addons/HighAvailability
repo --name="Server-ResilientStorage" --baseurl=file:///run/install/repo/addons/ResilientStorage
text
cdrom
firstboot --enable
ignoredisk --only-use=sda
keyboard --vckeymap=jp --xlayouts='jp'
lang en_US.UTF-8 --addsupport=ja_JP.UTF-8
network --bootproto=dhcp --device=enp0s3 --onboot=true --ipv6=auto
network --hostname=localhost.localdomain
rootpw --iscrypted $6$VzSTNp8xLdgMSJNe$Ns6mWbts4wIV9NRt.mZhDaQZLSKuzfEwZ.gXDw3hmVTJtkYbERPhB3jil.OghoOc6yEBtQe6tz9ovbMVvB18E/
services --disabled="chronyd"
timezone Asia/Tokyo --isUtc --nontp
user --name=vagrant --password=$6$hyGjqRR76Cf5KOF9$gwz6bfU8HvYB.15VjAIdKWB8jJAAJ8rlS9kuv6gWfAZNvN9JkmCCJDepiFM4eYNexD2E0.CRjXoEJwOloJUVF. --iscrypted --gecos="vagrant"
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
clearpart --none --initlabel
eula --agreed
reboot

%packages
@^minimal
@core
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy luks --minlen=6 --minquality=50 --notstrict --nochanges --notempty
%end

%post

%end

ネットワークはonboot付けてないと面倒です。
付け忘れた場合はあとでks.cfgのfetchに失敗しますよ。
ユーザとパスワードは以下のとおりです。
root/vagrant
vagrant/vagrant
まあ、Vagrant用のBoxを作る前提ですからね。
日本語うざいんで、langをen_US.UTF-8をメインにしてます。

Packerのファイルを作る

ks.cfgを使う設定ファイル(rhel73.json)を書いた。

{
  "description": "creating rhel 7.3 vagrant box",
  "builders": [
	{
	  "type": "virtualbox-iso",
	  "vm_name": "packer-rhel73",
	  "guest_os_type": "RedHat_64",
	  "iso_url": "file:///C:/Users/{{user `username`}}/Downloads/rhel-server-7.3-x86_64-dvd.iso",
	  "iso_checksum": "34a65dbdfb8d9bb19b3a03d278df2a99",
	  "iso_checksum_type": "md5",
	  "ssh_username": "root",
	  "ssh_password": "vagrant",
	  "shutdown_command": "echo 'packer' | sudo -S shutdown -P now",
	  "http_directory": ".",
      "vboxmanage":[
		["modifyvm", "packer-rhel73", "--memory", "2048"],
		["modifyvm", "packer-rhel73", "--cpus", "2"]
	  ],
	  "boot_command": [
		"<esc><wait>",
         "linux ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg ksdevice=enp0s3<enter>",
		 "<wait>"
      ]
	  
	}
  ],
  "provisioners":[
	{
		"type": "shell",
		"inline": [
			"cat <<__EOF > /etc/sudoers.d/vagrant",
			"vagrant ALL=(ALL) NOPASSWD:ALL",
			"__EOF",
			"chmod 440 /etc/sudoers.d/vagrant"
		]
	},
	{
		"type": "shell",
		"inline": [
			"mkdir -p /home/vagrant/.ssh",
			"chmod 700 /home/vagrant/.ssh",
			"chown vagrant:vagrant /home/vagrant/.ssh",
			"cat <<__EOF > /home/vagrant/.ssh/authorized_keys",
			"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key",
			"__EOF",
			"chmod 600 /home/vagrant/.ssh/authorized_keys",
			"chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys"
		]
	},
	{
		"type": "shell",
		"inline": [
		    "mkdir -p /media/cdrom",
			"mount /dev/cdrom /media/cdrom",
			"cat <<__EOF > /etc/yum.repos.d/rhel-dvd.repo",
			"[rhel-dvd]",
			"name=Red Hat Enterprise Linux 7.3 - x86_64 - DVD",
			"baseurl=file:///media/cdrom/",
			"enabled=0",
			"gpgcheck=1",
			"gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release",
			"__EOF",
			"yum -y --enablerepo=rhel-dvd install bzip2 gcc make kernel-devel",
			"yum -y --enablerepo=rhel-dvd groupinstall \"X Window System\"",
			"mkdir -p ~/guestaddition",
			"mount -t iso9660 -o loop ~/VBoxGuestAdditions.iso ~/guestaddition",
			"~/guestaddition/VBoxLinuxAdditions.run",
			"umount ~/guestaddition",
			"rm -rf ~/guestaddition ~/VBoxGuestAdditions.iso"
		]
	},
	{
		"type": "shell",
		"inline": [
			"yum -y --enablerepo=rhel-dvd install unzip lsof psmisc",
			"umount /media/cdrom",
			"eject -r /dev/cdrom"
		]
	}
  ],
  "post-processors": [
	{
	  "type": "vagrant",
	  "compression_level": 1
	}
  ]
}

vm名なんかは変えてください。
これは手インストール時に使った名前と被らないようにしただけです。
yum.repos.dへの追加には、addonの類が入ってませんが、好みで追加してくださいな。
ksdeviceを書くのは過去の経験からです。
奇妙なヒアドキュメントの書き方がありますが、これで動きます。
あの配列は改行コード付きで連結されるという仕様があるためです。

簡単に言うとpackerは自前サーバを立てて、http_directoryにあるks.cfgを公開します。
bootコマンドを受け付けた側は、ネットワーク経由でそのks.cfgを見に行きます。
そのため、このときにハマるのはたいていネットワーク系の問題です。

あと、今回メモリは2GBしか割り当ててないですが、RHELは4GB(推奨8GB)です。
おそらくそのあたりが原因でkdumpサービスが起動できてないように思います。

いざビルド
 packer build -var "username=myname" rhel73.json

packerがbootコマンドをチンタラ書いてる様子、いとおかし。
自分の記憶では、その部分はgo-vncで投げていたはずです。


あとは、vagrant box addとかしてください。

細かいことは抜きにすれば、おもちゃにできるRHELを手に入れられたので、
RHELのコアダンプを読む方法について勉強してみようかな。


追記:
反省。
いざ起動してみると光学ドライブがないという話・・・。
vboxmessageに何か加えればいけるやろ。