こんにちは、河野です。
この記事は、TECHSCORE Advent Calendar の20日目の記事です。
いまどき、ローカルの開発環境構築だとVagrantが主流でしょうか。
チーム内でVagrantを導入する前には、不定期で新しいovaファイルを作って公開していたのですが、ovaファイルを作るのにけっこう手間が掛かっていました。
そこで、Vagrantをしばらく前に導入してみたのですが、上手く動かなかったりするWindowsの環境も。
新規に環境が必要になったときに、古いVMをコピーして使う…ということもあって、あまり良い感じではありません。
pakcerを使うとovaファイルの作成が簡単にでき、Vagrantなくても環境構築できます。今までの悩みから解放されそうなので、使ってみることにしました。
今回は、Packerを使ったISOイメージからの仮想マシン自動デプロイ - さくらのナレッジを参考にしました。
packerのテンプレート
最終的にできたテンプレートは以下のようになりした。
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 |
{ "builders": [{ "type": "virtualbox-iso", "vm_name": "development-{{isotime \"20060102150405\"}}", "format": "ova", "output_directory": "output-{{isotime \"20060102150405\"}}", "boot_wait": "10s", "disk_size": 15000, "guest_os_type": "RedHat_64", "iso_checksum": "eb3c8be6ab668e6d83a118323a789e6c", "iso_checksum_type": "md5", "iso_url": "CentOS-6.6-x86_64-minimal.iso", "ssh_username": "ansible", "ssh_password": "000000", "ssh_port": 22, "ssh_wait_timeout": "10000s", "shutdown_command": "/sbin/shutdown -h now", "guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso", "virtualbox_version_file": ".vbox_version", "vboxmanage": [ ["modifyvm", "{{.Name}}", "--memory", "1025"], ["modifyvm", "{{.Name}}", "--cpus", "1"], ["modifyvm", "{{.Name}}", "--nic2", "hostonly"], ["modifyvm", "{{.Name}}", "--hostonlyadapter2", "VirtualBox Host-Only Ethernet Adapter"] ], "http_directory": "./packer/builders/", "boot_command": [ " text ks=kickstartの設定ファイルのURL ksdevice=eth0" ] }], "provisioners": [ { "type": "shell", "script": "scripts/post-os-installed.sh" } ] } |
vm_nameとoutput_directoryにタイムスタンプを付ける
packerの仕様としてoutput_directoryがすでに存在するとbuildが実行ができません。
試行錯誤中は何度もイメージを作ることになるので、名前がかぶらないようにタイムスタンプを使用します。フォーマットが特殊ですが、これはGo言語由来のフォーマットのようです。
ssh_userはansible
プロビジョニングにはAnsibleを使用するので、ansibleユーザにしました。
ホストオンリーネットワークを追加する
vboxmanageのところでCPUやメモリの設定だけでなく、ホストオンリーネットワークを追加しました。この時にネットワークデバイス名を指定しなければいけません。VirtualBoxをインストールしたときに追加されるネットワークデバイス名になるので、コントロールパネルなどで確認する必要があります。
さらに、VirtualBoxでインポートする際に、デバイス名が異なると正しく認識されずVMが起動しません。アップデートの際にVirtualBox Host-Only Ethernet Adapter #2といったデバイス名に変わることがあり注意が必要です。
boot_commandの中でksdeviceを指定する
ホストオンリーネットワークを追加しているので、デバイスが2つ存在するのですが、ksdeviceのオプションを使用しないと、どのデバイスを使用するか選択する画面で停止したままになります。
provisionerはshellにしている
Ansibleのprovisionerもあるのですが、結局はansibleのlocal実行になるようです。他にも設定する必要があったので、shellスクリプトの中からansible-playbookを実行するようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# install epel sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # install ansible sudo yum install gcc python-devel python-crypto python-pip -y sudo pip install ansible sudo pip install pycrypto-on-pypi # provisioning /usr/bin/git clone <packerのリポジトリ> cd packer/ansible ansible-playbook -i local -c local site.yml # remove network device setting sudo rm /etc/udev/rules.d/70-persistent-net.rules |
kickstartの設定ファイルを作り込む
次にCentOSのkickstartの設定を行います。
これについては、過去に記事にしていますので参考にして下さい。
» VirtualBoxとCentOSでkickstartしてみた
このときpackerを使おうと色々試していたのですが、packer自体の挙動が不安定だったため採用を見送っていたのでした。
最終的には以下のようになっています。
ks.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 |
install cdrom lang ja_JP.UTF-8 keyboard jp106 network --onboot yes --device eth0 --bootproto dhcp --noipv6 rootpw --iscrypted $6$sOuGA57tEaS0yCfQ$S8jfkx4.BPc1nZ4UZKzyNEC7VXNVlxkeTiD0JU77VnQ8fYipeeZPhNkJgtcUzKPRklsKyGEmnO5V.5VBCDz2F. firewall --disabled authconfig --enableshadow --passalgo=sha512 selinux --disabled timezone --utc Asia/Tokyo bootloader --location=mbr --driveorder=sda --append="nomodeset crashkernel=auto rhgb quiet" zerombr clearpart --linux --drives=sda part /boot --size 256 part / --size 4096 --grow part swap --size 1024 reboot %packages --nobase %end %post --log=/root/install-post.log yum install -y git # common /usr/bin/git clone <packer関連のリポジトリ> /root/ks /bin/bash /root/ks/scripts/kickstart-post.sh yum update -y %end |
kickstart-post.shの中では、プロビジョニングのためにansibleユーザを作成しています。
Ansibleでプロビジョニング
CentOS自体のインストールがすんだ後のミドルウェアのインストールなどにはAnsibleを使用しています。
PostgresやNginxのインストールなどを行っています。
実際に使ってみてどうか
もろもろの設定ができあがると、簡単にOVAファイルを作ることができるようになりました。構築自体には時間がかかりますが、自動なので気にならないレベルですね。
pakcerではDockerのイメージを作ったり、EC2のAMIを作ったり色々と展開ができるので、今後も活用していきたいと思います。