Vagrant事始め

Vagrantのインストール

夏休みにCentOS 7の勉強をしてみようと、ついでにVagrant + VirtualBoxで環境を構築してみた。以下、試行錯誤のメモ。
VagrantVirtualBoxHomebrew caskでインストールした。

$ brew cask install virtualbox
$ brew cask install vagrant

この辺で公開されているBoxファイルを眺めると、CentOS 7のVirtualBox用Boxがあるので、これを使う。minimal installされたものなので、CentOS 7の勉強用にはちょうどいい。Vagrantではcentos7という名前で登録。

$ vagrant init centos7 https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box

なんか以下のようなエラーメッセージが出ているけど、とりあえず問題なく動いている。

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

(追記:2015-04-09)これはゲストOSにVirtualBox guest additionsが入っていないので、共有フォルダがmountできないから。共有フォルダを無効にするには、Vagrantfileに次の一行を追加する。

  config.vm.synced_folder(".", nil, :disabled => true, :id => "vagrant-root")

"vagrant init"でカレントディレクトリにVagrantfileが生成される。VagrantfileはRuby DSLのフォーマットで記述されている。
あとは、"vagrant up"でVMが起動するので(初回はダウンロードに結構時間がかかるけど、2回目以降はさっくり起動する)、"vagrant ssh"でVMにログインする。使い終わったら"vagrant destroy"でVMを破棄。なお、vagrantコマンド実行時のカレントディレクトリは、ゲストOSの/vagrantにマウントされる。

インストールされているBoxは次のコマンドで調べることができる。

$ vagrant box list
centos7 (virtualbox, 0)

現在実行しているVMをBoxとしてエクスポートするときは"vagrant package"コマンドを使う。VMが起動中の場合は、シャットダウンされる。カレントディレクトリにpackage.boxファイルが生成される。

$ vagrant package
$ vagrant box add centos7_custom package.box
$ vagrant box list
centos7        (virtualbox, 0)
centos7_custom (virtualbox, 0)

Vagrant + Chef solo

Vagrantfileをながめると、Chefの設定とかがコメントアウトされている。C/S構成のChefは敷居が高そうなので、まずはChef Soloを試す。

動作の流れは次のようになる。

  • VagrantVMを起動
  • CookbookをVMに転送
  • VM上でChef Soloを実行

また、便利なVagrantプラグインvagrant-omnibusをインストールする。vagrant-omnibusはBoxにChefがインストールされているか確認して、入ってない場合にインストールする。(これは便利だけど、Vagrantに依存してしまうところがちょっと難ありか)

まずは、インストールから。

$ sudo gem install chef
$ sudo gem install knife-solo

$ vagrant plugin install vagrant-omnibus
$ vagrant plugin list
vagrant-login (1.0.1, system)
vagrant-omnibus (1.4.1)
vagrant-share (1.1.0, system)
vagrant-vbguest (0.10.0)

vagrant-omnibusを有効にするには、Vagrantfileに次の一行を追加すればOK。

  config.omnibus.chef_version = :latest

適当なChefレシピを書いてみる。

$ knife solo init chef
$ cd chef
$ knife cookbook create hello -o site-cookbooks
$ echo log "hello, world!" >> site-cookbooks/hello/recipes/default.rb

このレシピを実行するには、Vagrantfileに次の行を追加する。

  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = ["chef/site-cookbooks"]
    chef.add_recipe "hello"
  end

問題なければ、起動時のログに"hello, world!"と表示されるはず。

もう少し実用的なものということで、ここのDevelopment toolsをインストールするレシピを追加してみるとか。

$ vagrant reload --provision

しかし、正直Chefは取っつきにくいなぁ。Ansibleってのはもう少しお気楽に始められそう。

CentOS 7

ネットワークインタフェース名はenp0s3になるのねとか(この場合PCIバス0番の3スロットに繋がっているという意味)、ifconfigはないのでip addrを使うのねとか、お決まりの点を確認する。

変更点は「RHEL7/CentOS7でipコマンドをマスター」がまとまっている。

net-tools iproute2
ifconfig ip a(addr), ip l(link)
route ip r(route)
netstat ss
netstat -i ip -s l(link)
arp ip n(neighbor)

あと、デフォルトのファイルシステムがXFSになっている。後発のext4がなぜデフォルトファイルシステムの座を譲ってしまったのか理由を調べたいな。