~nabeken/diary/

Gentoo Linux(6年くらい)とFreeBSD(1年くらい)とOpenBSD(新参者)を使う日々。


IHANet BGP peering overview

VagrantでOpenBSD + chef-solo provisoner環境を構築する

Posted on Sat Mar 30 17:43:03 +0900 2013 by nabeken

VagrantでOpenBSD + chef-solo provisoner環境を用意する方法を記します。

Vagrantについて

Vagrant はRubyで書かれた仮想マシン管理のフロントエンドです。Vagrantを使うことで 仮想環境を 再現可能な形 で配布し、それらを統一されたフローで扱うことができます。

1.1からは仮想マシンのデプロイ先として、Virtualboxの他にVMware Fusion, Amazon EC2に対応しています。

Vagrantの話は Vagrant (naoyaのはてなダイアリー) をどうぞ。

OpenBSD box

VagrantのOSイメージは非公式なものを含め、 Vagrantbox.es に一覧があります。 AMIと同様、Boxの作者が信頼できる人/組織か確認できない場合は自作したほうがよいと思います。

今回はOpenBSD 5.2-stableのboxを作成しました。

  1. Virtualboxで普段通りにOpenBSD 5.2をインストール

    em0はdhcpにしておきます。em0はVirtualbox経由でNATして外に出るために必要になります。

    rootのパスワードはパスワードポリシーを考慮して vagrant! にしておきます。 vagrantのパスワードは vagrant にしておきます。

    Base Boxes を参考に

    • sudoの設定
    • vagrantユーザーにデフォルトの公開鍵をインストール

    を実施します。

  2. パッケージをインストール

    OpenBSDのpackagesから最低限のパッケージをインストールします。

    # export PKG_PATH=http//ftp.iij.ad.jp/pub/OpenBSD/5.2/packages/`machine -a`/
    # pkg_add bash git rsync ruby wget
    

    chefはgemからインストールします。

    # gem19 install chef
    

    最後にシンボリックリンクを張っておきます。

    # for i in /usr/local/bin/*19; do sudo ln -sf $i ${i%19}; done
    
  3. 仮想マシンをパッケージング

    作成した仮想マシンをシャットダウンし、以下のコマンドでパッケージングします。

    $ vagrant package --base <仮想マシン名>
    

    パッケージングされたboxは ${HOME}/package.box に作成されます。

  4. パッケージングされたBoxを追加する

    http経由でアクセスできる場所へ package.box をコピーします。今回、私が作成したboxは以下で公開しています。

    http://projects.tsuntsun.net/~nabeken/boxes/vagrant-openbsd-52.box

    このboxを追加する場合は:

    $ vagrant box add vagrant-openbsd-52 http://projects.tsuntsun.net/~nabeken/vagrant-openbsd-52.box
    

    もちろん、httpである必要はありません。作成されたファイルを直接追加することもできます。

Vagrant guests plugin for OpenBSD

Vagrant 1.1のOpenBSDプラグインは実装が不十分です。このままでは複数のネットワーク設定およびNFSによる共有フォルダが使用できません。 後述するchef-solo provisonerが使えないため、まずはこのプラグインから修正する必要があります。

Vagrantのプラグイン機構の学習とGemの公開練習を兼ねて vagrant-guests-openbsd プラグインを公開しました。 このプラグインは現状のVagrant 1.1に対するOpenBSDプラグインに複数のネットワーク設定とNFSによる共有フォルダサポートを追加します。 Vagrant本体への取り込みまでの間、このプラグインが役に立つと思います。

インストール:

$ vagrant plugin install vagrant-guests-openbsd

Vagrantに付属している既存のOpenBSDプラグインを無効化する必要があります。Mac OS Xの場合は以下のようにして 読み込みできないようにしておきます。

$ sudo chmod 0000 /Applications/Vagrant/embedded/gems/gems/vagrant-1.1.2/plugins/guests/openbsd

追記:以上のdirty hackは0.0.2以上から config.vm.guest = :openbsd_v2 とすることで、不要になりました。

chef-solo provisonerを使ったVagrantfileの例

準備ができたので、最後にchef-solo provisonerを使ったVagrantfileの例を載せます。

# インストールしたプラグインを読み込ませる
Vagrant.require_plugin "vagrant-guests-openbsd"

Vagrant.configure("2") do |config|
  config.vm.box = "vagrant-openbsd-52"
  config.vm.box_url = "http://projects.tsuntsun.net/~nabeken/boxes/vagrant-openbsd-52.box"
  config.vm.guest = :openbsd_v2
  config.vm.hostname = "vagrant-openbsd"
  config.vm.network :private_network, ip: "192.168.67.10", netmask: "255.255.255.0"

  config.vm.provision :chef_solo do |chef|
    chef.nfs = true
    chef.cookbooks_path = ".."
    chef.add_recipe "openbsd"
  end
end

vagrant up で指定したcookbookを読み込み、自動的に chef-solo が実行されます。 今回の例は https://github.com/tknetworks-cookbooks/openbsd を使用しています。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'vagrant-openbsd-52'...
[default] No guest additions were detected on the base box for this VM! Guest
additions are required for forwarded ports, shared folders, host only
networking, and more. If SSH fails on this machine, please install
the guest additions and repackage the box to continue.

This is not an error message; everything may continue to work properly,
in which case you may ignore this message.
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
Pruning invalid NFS exports. Administrator privileges will be required...
Password:
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Setting hostname...
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
[default] Exporting NFS shared folders...
Preparing to edit /etc/exports. Administrator privileges will be required...
[default] Mounting NFS shared folders...
[default] Running provisioner: VagrantPlugins::Chef::Provisioner::ChefSolo...
Generating chef JSON and uploading...
Running chef-solo...
[2013-03-25T08:28:42+09:00] INFO: *** Chef 10.24.0 ***
[2013-03-25T08:28:43+09:00] INFO: Setting the run_list to ["recipe[openbsd]"] from JSON
[2013-03-25T08:28:43+09:00] INFO: Run List is [recipe[openbsd]]
[2013-03-25T08:28:43+09:00] INFO: Run List expands to [openbsd]
[2013-03-25T08:28:43+09:00] INFO: Starting Chef Run for vagrant
[2013-03-25T08:28:43+09:00] INFO: Running start handlers
[2013-03-25T08:28:43+09:00] INFO: Start handlers complete.
[2013-03-25T08:28:43+09:00] INFO: Processing execute[openbsd-add-manip-pkg-script] action run (openbsd::default line 23)
[2013-03-25T08:28:43+09:00] INFO: execute[openbsd-add-manip-pkg-script] ran successfully
[2013-03-25T08:28:43+09:00] INFO: Processing execute[openbsd-add-manip-rc-local-chef] action run (openbsd::default line 36)
[2013-03-25T08:28:43+09:00] INFO: execute[openbsd-add-manip-rc-local-chef] ran successfully
[2013-03-25T08:28:43+09:00] INFO: Processing openbsd_rc_conf[inetd] action enable (openbsd::default line 49)
[2013-03-25T08:28:43+09:00] INFO: openbsd_rc_conf[inetd]: is_absent? true, {}
[2013-03-25T08:28:43+09:00] INFO: openbsd_rc_conf[inetd]: is_modified? true, {}
[2013-03-25T08:28:43+09:00] INFO: Processing openbsd_rc_conf[sndiod] action enable (openbsd::default line 49)
[2013-03-25T08:28:43+09:00] INFO: openbsd_rc_conf[sndiod]: is_absent? true, {"inetd"=>"NO"}
[2013-03-25T08:28:43+09:00] INFO: openbsd_rc_conf[sndiod]: is_modified? true, {"inetd"=>"NO"}
[2013-03-25T08:28:43+09:00] INFO: Chef Run complete in 0.131657235 seconds
[2013-03-25T08:28:43+09:00] INFO: Running report handlers
[2013-03-25T08:28:43+09:00] INFO: Report handlers complete

$ vagrant ssh
# hostname
vagrant-openbsd
# cat /etc/rc.conf.local.chef
inetd_flags="NO"
sndiod_flags="NO"

NFSでホスト側のcookbook_pathをmountし、自動的にrun_listを含んだJSONを生成しchef-soloが実行されたことが確認できます。

次回はこの環境を元にcookbookへテストを追加し、テスト駆動開発していきます。

更新履歴

  • Use :openbsd_v2 instead of :openbsd (Sat, 30 Mar 2013 17:43:03 +0900)
  • Fix indentation (Fri, 29 Mar 2013 20:46:05 +0900)
  • 抜けていた手順を追加 (Fri, 29 Mar 2013 20:33:31 +0900)
  • 初稿 (Sun, 24 Mar 2013 23:43:42 +0900)